上一篇文章http://blog.csdn.net/pspr2/article/details/72843356讲了如何集成到spring MVC中,这次介绍集成到开源框架spring boot中。
1.自建项目,并建立好与数据库的连接以及web项目。
类似以下配置:
1.1 application.yml
# Server settings
server:
port: 8080
address: localhost
# SPRING PROFILES
spring:
http:
encoding.charset: UTF-8
encoding.enable: true
encoding.force: true
datasource:
name: gendb
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://localhost:3306/{数据库}?useConfigs=maxPerformance&characterEncoding=utf8
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
minIdle: 1
maxActive: 2
initialSize: 1
timeBetweenEvictionRunsMillis: 3000
minEvictableIdleTimeMillis: 300000
validationQuery: select 1
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
filters: stat,wall,slf4j
1.2 pom.xml
<dependencies>
<!-- 报表 -->
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>6.4.0</version> <!-- 可选用最新的版本 -->
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.10.1</version> <!-- 过高版本会出现导出xls格式失败问题 -->
</dependency>
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itextasian</artifactId>
<version>2.1.7.js2</version> <!-- 这两个dependency已经无须使用,见我最新的博客 -->
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>1.4.3.RELEASE</version>
</dependency>
</dependencies>
这样,配置方面就完成了。
2.具体代码部分
2.1 先定义ViewResolver
package *.security.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.jasperreports.JasperReportsMultiFormatView;
import org.springframework.web.servlet.view.jasperreports.JasperReportsViewResolver;
/**
* jasper report 配置class
* Created by X-J on 2017/6/1.
*/
@Configuration
public class JasperConfig extends WebMvcConfigurerAdapter {
private final static String REPORT_DATA_KEY = "datasource";
private final static String PATH_KEY = "classpath:jaspertemplate/";
private final static String TYPE_KEY = ".jrxml";
private final static String VIEW_KEY = "Report";
@Override
public void configureDefaultServletHandling(final DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Bean
public JasperReportsViewResolver getJasperReportsViewResolver() {
JasperReportsViewResolver resolver = new JasperReportsViewResolver();
resolver.setPrefix(PATH_KEY); //resource文件夹下放模板的路径
resolver.setSuffix(TYPE_KEY); //模板文件的类型,这里选用jrxml而不是编译之后的jasper
//JasperReportsMultiFormatView定义了ReportDataKey,这里给定key为datasource,后面controller的时候会用到
resolver.setReportDataKey(REPORT_DATA_KEY);
resolver.setViewNames("*" + VIEW_KEY + "*"); //视图名称,模板名称需要符合 *你定义的key* 如*Report*
resolver.setViewClass(JasperReportsMultiFormatView.class); //视图类
resolver.setOrder(0); //顺序为第一位
return resolver;
}
}
2.2 controller入口
package *.controller.demo;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.sql.DataSource;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRResultSetDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
/**
* Created by X-J on 2017/6/1.
*/
@Controller
@RequestMapping(value = "/reports")
public class DemoReportController {
private static final String REPORT_NAME = "reportName";
private static final String FILE_FORMAT = "format";
private static final String DATASOURCE = "datasource";
private static final String queryStr = "你的sql语句";
@Autowired
private DataSource dbSource;
/**
* 直接使用模板文件中的sql语句得到报表
* @param modelMap
* @param reportName
* @param format
* @return
*/
@GetMapping("/{reportName}")
public ModelAndView getReportByParam(final ModelMap modelMap,
@PathVariable(REPORT_NAME) final String reportName,
@RequestParam(FILE_FORMAT) final String format) {
modelMap.put(DATASOURCE, dbSource);
modelMap.put(FILE_FORMAT, format);
ModelAndView modelAndView = new ModelAndView(reportName, modelMap);
return modelAndView;
}
/**
* 自定义sql语句并生成报表,要注意一点,select ? from ? where XXX
* where前面的语句需要写死,后面的where条件可以灵活传入
* 因为模板中的field需要先定义好并对应select A from中的A,才能出数据
* @param modelMap
* @param reportName
* @param format
* @param modelAndView
* @return
*/
@GetMapping("/query/{reportName}")
public ModelAndView getReportByParamAndQuery(final ModelMap modelMap,
@PathVariable(REPORT_NAME) final String reportName,
@RequestParam(FILE_FORMAT) final String format, ModelAndView modelAndView) {
try {
ResultSet resultSet = dbSource.getConnection().createStatement().executeQuery(queryStr);
JRDataSource jrDataSource = new JRResultSetDataSource(resultSet);
modelMap.put(DATASOURCE, jrDataSource);
modelMap.put(FILE_FORMAT, format);
modelAndView = new ModelAndView(reportName, modelMap);
} catch (SQLException e) {
e.printStackTrace();
}
return modelAndView;
}
}
如上的controller提供了2中略微不同的报表生成方式,后面一个稍微可定制化一些。
访问
localhost:8080/reports/{模板名称}?format={PDF或者XLS}
localhost:8080/reports/query/{模板名称}?format={PDF或者XLS}
即可。