Overview
In this tutorial, we show you how to integration JasperReports with Spring Boot. We'll generate PDF files from MySQL database using JasperReports, Spring Boot.Video tutorials
Prerequisites
- Eclipse Oxygen and install Spring Tool Suite for Eclipse IDE
- Spring Boot v2.0.1.RELEASE
- spring-boot-starter-web
- spring-boot-starter-jdbc
- spring-boot-devtools
- spring-boot-configuration-processor
- spring-boot-starter-test
- jstl
- org.webjars Bootstrap 4
- tomcat-embed-jasper
- mysql-connector-java 5.1.46
- groovy-all 2.0.1
- itext-pdfa 5.5.0
- itextpdf 5.5.0
- jasperreports 6.0.0
- jackson-core
- jackson-databind
- jackson-annotations
- Java 1.8+
Create database and tables in MySQL Databases
We'll create a database called jack_rutorial and a tables called user in jack_rutorial database.CREATE DATABASE `jack_rutorial` /*!40100 DEFAULT CHARACTER SET utf8 */; DROP TABLE IF EXISTS `jack_rutorial`.`user`; CREATE TABLE `jack_rutorial`.`user` ( `user_id` int(11) NOT NULL auto_increment, `user_name` varchar(45) NOT NULL default '', `email` varchar(45) NOT NULL default '', PRIMARY KEY (`user_id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
Project Directory Structure
The following screenshot shows final structure of the project.Start to create a web application with Spring Boot
Launch Eclipse IDE. Go to File -> New -> Other... Select Spring Starter Project under Spring Boot category then click Next as shown belowIn the next step, you choose Spring Boot Version is 2.1.0 and choose the Web, DevTools, MySQL, JDBC, then click Finish.
Create the rpt_users report template file
We create the rpt_users.jrxml file under src/main/resources/ folder. This template contains the columnHeader band and the detail band. Inside a detail band, each element is repeated for every record provided by the data source.<field name="user_id" class="java.lang.Integer"> <fieldDescription><![CDATA[]]></fieldDescription> </field> <field name="user_name" class="java.lang.String"> <fieldDescription><![CDATA[]]></fieldDescription> </field> <field name="email" class="java.lang.String"> <fieldDescription><![CDATA[]]></fieldDescription> </field>We have three fields in the report. The fields are mapped to the elements of the data source beans.
<textField> <reportElement stretchType="RelativeToBandHeight" x="0" y="0" width="120" height="20" uuid="f9cf1e93-86de-42d4-a337-09152af5589f"/> <box> <pen lineWidth="0.5"/> <topPen lineWidth="0.5"/> <leftPen lineWidth="0.5"/> <bottomPen lineWidth="0.5"/> <rightPen lineWidth="0.5"/> </box> <textElement textAlignment="Center" verticalAlignment="Middle"/> <textFieldExpression><![CDATA[$F{user_id}]]></textFieldExpression> </textField> <textField isStretchWithOverflow="true" isBlankWhenNull="true"> <reportElement stretchType="RelativeToBandHeight" x="120" y="0" width="275" height="20" uuid="9978c830-cf98-456a-b030-d96c07de7854"/> <box leftPadding="3"> <pen lineWidth="0.5"/> <topPen lineWidth="0.5"/> <leftPen lineWidth="0.5"/> <bottomPen lineWidth="0.5"/> <rightPen lineWidth="0.5"/> </box> <textElement verticalAlignment="Middle"/> <textFieldExpression><![CDATA[$F{user_name}]]></textFieldExpression> </textField> <textField isStretchWithOverflow="true" isBlankWhenNull="true"> <reportElement stretchType="RelativeToBandHeight" x="395" y="0" width="160" height="20" uuid="35a6355d-8307-4414-bf43-8a7788ec81c3"/> <box leftPadding="3"> <pen lineWidth="0.5"/> <topPen lineWidth="0.5"/> <leftPen lineWidth="0.5"/> <bottomPen lineWidth="0.5"/> <rightPen lineWidth="0.5"/> </box> <textElement verticalAlignment="Middle"/> <textFieldExpression><![CDATA[$F{email}]]></textFieldExpression> </textField>rpt_users.jrxml
<?xml version="1.0" encoding="UTF-8"?> <jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="rpt_users" language="groovy" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="809a3f44-f151-4225-8db5-d8f7ef0ad887"> <property name="ireport.zoom" value="1.0"/> <property name="ireport.x" value="0"/> <property name="ireport.y" value="0"/> <queryString> <![CDATA[select * from user]]> </queryString> <field name="user_id" class="java.lang.Integer"> <fieldDescription><![CDATA[]]></fieldDescription> </field> <field name="user_name" class="java.lang.String"> <fieldDescription><![CDATA[]]></fieldDescription> </field> <field name="email" class="java.lang.String"> <fieldDescription><![CDATA[]]></fieldDescription> </field> <background> <band splitType="Stretch"/> </background> <title> <band height="79" splitType="Stretch"> <staticText> <reportElement x="0" y="0" width="555" height="34" uuid="b30be92d-c6fd-4736-ad12-76a9317e274b"/> <textElement textAlignment="Center" verticalAlignment="Middle"> <font size="16" isBold="true"/> </textElement> <text><![CDATA[USERS LIST]]></text> </staticText> </band> </title> <pageHeader> <band splitType="Stretch"/> </pageHeader> <columnHeader> <band height="20" splitType="Stretch"> <staticText> <reportElement x="0" y="0" width="120" height="20" uuid="d9efce97-b36d-4b32-a494-46857cdee4e4"/> <box> <pen lineWidth="0.5"/> <topPen lineWidth="0.5"/> <leftPen lineWidth="0.5"/> <bottomPen lineWidth="0.5"/> <rightPen lineWidth="0.5"/> </box> <textElement textAlignment="Center" verticalAlignment="Middle"> <font isBold="true"/> </textElement> <text><![CDATA[#ID]]></text> </staticText> <staticText> <reportElement x="120" y="0" width="275" height="20" uuid="bb85b6d2-f2b1-4cb8-9f17-53376a9139c1"/> <box> <pen lineWidth="0.5"/> <topPen lineWidth="0.5"/> <leftPen lineWidth="0.5"/> <bottomPen lineWidth="0.5"/> <rightPen lineWidth="0.5"/> </box> <textElement textAlignment="Center" verticalAlignment="Middle"> <font isBold="true"/> </textElement> <text><![CDATA[Username]]></text> </staticText> <staticText> <reportElement x="395" y="0" width="160" height="20" uuid="e7915756-0ff0-49c9-87c0-2bfbd29ad7e4"/> <box> <pen lineWidth="0.5"/> <topPen lineWidth="0.5"/> <leftPen lineWidth="0.5"/> <bottomPen lineWidth="0.5"/> <rightPen lineWidth="0.5"/> </box> <textElement textAlignment="Center" verticalAlignment="Middle"> <font isBold="true"/> </textElement> <text><![CDATA[Email]]></text> </staticText> </band> </columnHeader> <detail> <band height="20" splitType="Stretch"> <textField> <reportElement stretchType="RelativeToBandHeight" x="0" y="0" width="120" height="20" uuid="f9cf1e93-86de-42d4-a337-09152af5589f"/> <box> <pen lineWidth="0.5"/> <topPen lineWidth="0.5"/> <leftPen lineWidth="0.5"/> <bottomPen lineWidth="0.5"/> <rightPen lineWidth="0.5"/> </box> <textElement textAlignment="Center" verticalAlignment="Middle"/> <textFieldExpression><![CDATA[$F{user_id}]]></textFieldExpression> </textField> <textField isStretchWithOverflow="true" isBlankWhenNull="true"> <reportElement stretchType="RelativeToBandHeight" x="120" y="0" width="275" height="20" uuid="9978c830-cf98-456a-b030-d96c07de7854"/> <box leftPadding="3"> <pen lineWidth="0.5"/> <topPen lineWidth="0.5"/> <leftPen lineWidth="0.5"/> <bottomPen lineWidth="0.5"/> <rightPen lineWidth="0.5"/> </box> <textElement verticalAlignment="Middle"/> <textFieldExpression><![CDATA[$F{user_name}]]></textFieldExpression> </textField> <textField isStretchWithOverflow="true" isBlankWhenNull="true"> <reportElement stretchType="RelativeToBandHeight" x="395" y="0" width="160" height="20" uuid="35a6355d-8307-4414-bf43-8a7788ec81c3"/> <box leftPadding="3"> <pen lineWidth="0.5"/> <topPen lineWidth="0.5"/> <leftPen lineWidth="0.5"/> <bottomPen lineWidth="0.5"/> <rightPen lineWidth="0.5"/> </box> <textElement verticalAlignment="Middle"/> <textFieldExpression><![CDATA[$F{email}]]></textFieldExpression> </textField> </band> </detail> <columnFooter> <band splitType="Stretch"/> </columnFooter> <pageFooter> <band splitType="Stretch"/> </pageFooter> <summary> <band splitType="Stretch"/> </summary> </jasperReport>
Project Dependencies
We will add the following dependencies to the pom.xml file. jstl
<dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency>Bootstrap 4.0.0
<dependency> <groupId>org.webjars</groupId> <artifactId>bootstrap</artifactId> <version>4.0.0</version> </dependency>apache.tomcat.embed
<dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <scope>provided</scope> </dependency>mysql-connector-java
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.46</version> </dependency>spring-boot-configuration-processor
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>spring-boot-starter-jdbc
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency>jasperreports
<dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-all</artifactId> <version>2.0.1</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext-pdfa</artifactId> <version>5.5.0</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.0</version> </dependency> <dependency> <groupId>net.sf.jasperreports</groupId> <artifactId>jasperreports</artifactId> <version>6.0.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> </dependency>The updated pom.xml file will have the following code
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.jackrutorial</groupId> <artifactId>SpringBootJasperReports</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>SpringBootJasperReports</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.0.BUILD-SNAPSHOT</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency> <dependency> <groupId>org.webjars</groupId> <artifactId>bootstrap</artifactId> <version>4.0.0</version> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.46</version> </dependency> <dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-all</artifactId> <version>2.0.1</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext-pdfa</artifactId> <version>5.5.0</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.0</version> </dependency> <dependency> <groupId>net.sf.jasperreports</groupId> <artifactId>jasperreports</artifactId> <version>6.0.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <repositories> <repository> <id>spring-snapshots</id> <name>Spring Snapshots</name> <url>https://repo.spring.io/snapshot</url> <snapshots> <enabled>true</enabled> </snapshots> </repository> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>spring-snapshots</id> <name>Spring Snapshots</name> <url>https://repo.spring.io/snapshot</url> <snapshots> <enabled>true</enabled> </snapshots> </pluginRepository> <pluginRepository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </pluginRepository> </pluginRepositories> </project>
application.properties
In the sources folder, we will look for this project's a resource file under src/main/resources/application.properties. Open application.properties file and add the following properties.#config db spring.datasource.jdbcUrl=jdbc:mysql://localhost:3306/jack_rutorial spring.datasource.driverClassName=com.mysql.jdbc.Driver spring.datasource.username=root spring.datasource.password=root #jsp spring.mvc.view.prefix=/WEB-INF/jsp/ spring.mvc.view.suffix=.jsp server.port=8080 server.servlet.context-path=/jackrutorial
WebConfig
We configure the DataSource in the WebConfig class. The main Spring Boot configuration file is called application.properties. Spring Boot automatically configures HikariCP connection pool. Create a WebConfig class under com.jackrutorial.config package with the following code.package com.jackrutorial.config; import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.core.JdbcTemplate; @Configuration public class WebConfig { @Bean(name = "db") @ConfigurationProperties(prefix = "spring.datasource") public DataSource dataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "jdbcTemplate") public JdbcTemplate jdbcTemplate(@Qualifier("db") DataSource ds) { return new JdbcTemplate(ds); } }
DAO Layer
We'll compile the rpt_users.jrxml file, then fill it with data using the JasperCompilerManager class.String path = resourceLoader.getResource("classpath:rpt_users.jrxml").getURI().getPath(); JasperReport jasperReport = JasperCompileManager.compileReport(path);
JasperPrint print = JasperFillManager.fillReport(jasperReport, parameters, conn);UserDaoImpl.java
package com.jackrutorial.dao; import java.io.IOException; import java.sql.Connection; import java.sql.SQLException; import java.util.HashMap; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.core.io.ResourceLoader; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JasperCompileManager; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.JasperReport; @Transactional @Repository public class UserDaoImpl { @Autowired @Qualifier("jdbcTemplate") private JdbcTemplate jdbcTemplate; @Autowired private ResourceLoader resourceLoader; public JasperPrint exportPdfFile() throws SQLException, JRException, IOException { Connection conn = jdbcTemplate.getDataSource().getConnection(); String path = resourceLoader.getResource("classpath:rpt_users.jrxml").getURI().getPath(); JasperReport jasperReport = JasperCompileManager.compileReport(path); // Parameters for report Map<String, Object> parameters = new HashMap<String, Object>(); JasperPrint print = JasperFillManager.fillReport(jasperReport, parameters, conn); return print; } }
Service Layer
Create a UserService class under com.jackrutorial.service package and write the following code in it.package com.jackrutorial.service; import java.io.IOException; import java.sql.SQLException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.jackrutorial.dao.UserDaoImpl; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JasperPrint; @Service public class UserService { @Autowired private UserDaoImpl userDao; public JasperPrint exportPdfFile() throws SQLException, JRException, IOException { return userDao.exportPdfFile(); } }
UserController Controller
Create a UserController class under com.jackrutorial.controller package and write the following code in it.package com.jackrutorial.controller; import java.io.IOException; import java.io.OutputStream; import java.sql.SQLException; import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; import com.jackrutorial.service.UserService; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JasperExportManager; import net.sf.jasperreports.engine.JasperPrint; @Controller @RequestMapping("/") public class UserController { @Autowired private UserService userService; @RequestMapping(value = { "/", "" }, method = RequestMethod.GET) public ModelAndView home() { ModelAndView model = new ModelAndView(); model.setViewName("home"); return model; } @RequestMapping(value = "/export", method = RequestMethod.POST) public void export(ModelAndView model, HttpServletResponse response) throws IOException, JRException, SQLException { JasperPrint jasperPrint = null; response.setContentType("application/x-download"); response.setHeader("Content-Disposition", String.format("attachment; filename=\"users.pdf\"")); OutputStream out = response.getOutputStream(); jasperPrint = userService.exportPdfFile(); JasperExportManager.exportReportToPdfStream(jasperPrint, out); } }
View Layer
Create jsp folder under src\main\webapp\WEB-INF\ folder.Create home.jsp file under src\main\webapp\WEB-INF\jsp\ folder and write the following code in it. home.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%> <%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Users</title> <link href="webjars/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet" /> <script src="webjars/bootstrap/4.0.0/js/bootstrap.min.js"></script> <script src="webjars/jquery/3.0.0/jquery.min.js"></script> </head> <body> <div class="container"> <div class="card-deck mt-2"> <div class="card"> <div class="card-header"> <span class="font-weight-bold">Users</span> </div> <div class="card-body"> <spring:url value="/export" var="actionURL" /> <form:form method="post" action="${actionURL }"> <button type="submit" class="btn btn-info" >Export</button> </form:form> </div> </div> </div> </div> </body> </html>
Run Spring Boot Application
Right click to the Project and follow the below steps:- select Run As -> Maven clean.
- select Run As -> Maven install.
- select Run As -> Spring Boot App.
View console output in eclipse, you will see following output:
INFO 2736 --- [ restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1294 ms INFO 2736 --- [ restartedMain] o.s.b.w.servlet.ServletRegistrationBean : Servlet dispatcherServlet mapped to [/] INFO 2736 --- [ restartedMain] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/*] INFO 2736 --- [ restartedMain] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*] INFO 2736 --- [ restartedMain] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'formContentFilter' to: [/*] INFO 2736 --- [ restartedMain] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'requestContextFilter' to: [/*] INFO 2736 --- [ restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' DEBUG 2736 --- [ restartedMain] o.s.w.s.handler.SimpleUrlHandlerMapping : Patterns [/**/favicon.ico] in 'faviconHandlerMapping' DEBUG 2736 --- [ restartedMain] s.w.s.m.m.a.RequestMappingHandlerAdapter : ControllerAdvice beans: 0 @ModelAttribute, 0 @InitBinder, 1 RequestBodyAdvice, 1, ResponseBodyAdvice DEBUG 2736 --- [ restartedMain] s.w.s.m.m.a.RequestMappingHandlerMapping : 4 mappings in 'requestMappingHandlerMapping' DEBUG 2736 --- [ restartedMain] o.s.w.s.handler.SimpleUrlHandlerMapping : Patterns [/webjars/**, /**] in 'resourceHandlerMapping' DEBUG 2736 --- [ restartedMain] .m.m.a.ExceptionHandlerExceptionResolver : ControllerAdvice beans: 0 @ExceptionHandler, 1 ResponseBodyAdvice INFO 2736 --- [ restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 INFO 2736 --- [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '/jackrutorial' INFO 2736 --- [ restartedMain] c.j.SpringBootJasperReportsApplication : Started SpringBootJasperReportsApplication in 2.539 seconds (JVM running for 3.303)
Demo Spring Boot with JasperReports Application
Type the following URLs in browser's address bar to open user page. Then click Export button to generate PDF filehttp://localhost:8080/jackrutorial/