自动任务和JasperReport
一.自动任务
1.自动任务的应用
1、注册网站会员,生日当天发送短信
2、银行、信用卡中心发送短信账单、邮件账单
3、应用于企业查询,将大量数据汇总成临时数据以供查询(重点)
2.Quartz框架
2.1引入依赖
<!--定时任务-->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.3</version>
</dependency>
2.2 applicationContext-task.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--1.将定时任务类交给spring容器-->
<bean id="myTask" class="cn.itcast.web.task.MyTask"></bean>
<!--2.配置jobDetal : 配置定时执行的类和方法-->
<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="myTask"></property>
<property name="targetMethod" value="excute"></property>
</bean>
<!--3.配置trigger: (触发器)配置时间以及jobdetal关系 -->
<bean id="tigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<!--cron表达式-->
<property name="cronExpression" value="0/5 * * * * ? *"></property>
<property name="jobDetail" ref="jobDetail"></property>
</bean>
<!--4.配置定时任务管理器-->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="tigger"></ref>
</list>
</property>
</bean>
</beans>
2.3 编写自动任务类
package cn.itcast.web.task;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @author cyy
* @date 2020/3/26 13:16
*/
public class MyTask {
//每隔5s打印一次当前时间
public void excute(){
System.out.println("当前时间:"+
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
}
}
2.4 Cron表达式
cron 七子表达式
秒 分 时 日 月 周 年
0-59 0-59 0-23 1-31 1-12 1-7 1970-2099
周-1 (1)
1,3,4,7,24 * * * * ?
常用的符号
星号 任意
? (忽略)任意(日 和 周 同时只能出现一个* 和一个?)
年的配置(可以省略)
m/n 从M开始,每间隔N执行
m-n 从M开始,到N执行 ,整数执行
q,w,e,r,t,y 指定时间
L=Last
m#n 第n个m
“0 0 12 * * ?” 每天12点执行一次
“0 15 10 ? * *” 每天10点15执行一次
“0 15 10 * * ? 2005” 2005年每天10点15执行一次
“0 * 14 * * ?” 每天14点执行一次
“0 0/5 14 * * ?” 每天14点从0分开始,每隔5分钟执行一次
“0 0/5 14,18 * * ?” 每天14点到14点59从0分开始,每隔5分钟执行一次,18点到18点59分,每隔5分钟执行一次
“0 0-5 14 * * ?” 每天14点从0分开始到5分,每1分钟执行
“0 10 14,18 ? * *” 每天14点10分执行,并且每天的18点10分执行
“0 15 10 ? * MON-FRI” 每周一到周五10点15执行一次
L=Last
"0 15 10 L * ? " 每月最后一天的上午10点15分
“0 15 10 ? * 6L” 每月最后一个周五的上午10点15分
m#n:第n个m
“0 15 10 ? * 6#3” 每月第三个周五10点15分
统计:每季度末统计数据
每季度末的上午10点15分
0 15 10 L 3,6,9,12 ? *
0 15 10 L 3/3 ? *
每季度初的上午10点15分
0 15 10 1 1/3 ? *
二.JasperReport
1.JasperReport的执行阶段
三个执行阶段:
- 设计阶段(通过Jasper工具)
- 编译阶段(通过Jasper工具)
- 输出阶段(通过Java代码)
2.执行流程
3.在jasper里面创建工程
输入工程名称 创建
选模板 进行创建
保存
右击编译
编译完成将文件复制到idea
Map填充数据
list 填充数据
4.代码实现生成PDF
4.1 引入依赖
<!--jasperreports 坐标-->
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>6.5.0</version>
</dependency>
<dependency>
<groupId>org.olap4j</groupId>
<artifactId>olap4j</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>2.1.7</version>
</dependency>
4.2 map填充数据的controller
package cn.itcast.web.controller.cargo;
import cn.itcast.web.controller.BaseController;
import net.sf.jasperreports.engine.*;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.HashMap;
import java.util.Map;
/**
* @author cyy
* @date 2020/3/26 14:05
*/
@RequestMapping(value = "/cargo/export")
@Controller
public class PdfController extends BaseController {
@RequestMapping(value = "/exportPdf")
public void exportPdf(String id) throws Exception {
//1、设置路径查找jasper文件
String path ="D:\\Install\\Java\\work\\demo\\export_parent\\export_web_manager\\src\\main\\webapp\\jasper\\test03.jasper";
//2、通过路径创建jrprint
// JasperFillManager:path:指的是jasper文件的路径
// map:用map的形式填充jasper里数据
// DataSource:用list的形式填充jasper里的表格
Map map = new HashMap();
map.put("username","xx");
map.put("age",18);
map.put("deptname","zz");
map.put("companyname","yy");
JasperPrint jasperPrint = JasperFillManager.fillReport(path,map, new JREmptyDataSource());
//3、jrprint作为一个参数,通过exporter生成PDF
JasperExportManager.exportReportToPdfStream(jasperPrint,response.getOutputStream());
}
}
4.3 list填充数据的controller
package cn.itcast.web.controller.cargo;
import cn.itcast.web.controller.BaseController;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author cyy
* @date 2020/3/26 14:05
*/
@RequestMapping(value = "/cargo/export")
@Controller
public class PdfController extends BaseController {
@RequestMapping(value = "/exportPdf")
public void exportPdf(String id) throws Exception {
//1、设置路径查找jasper文件
String path ="D:\\Install\\Java\\work\\demo\\export_parent\\export_web_manager\\src\\main\\webapp\\jasper\\test04.jasper";
//2、通过路径创建jrprint
// JasperFillManager:path:指的是jasper文件的路径
// map:用map的形式填充jasper里数据
// DataSource:用list的形式填充jasper里的表格
/* Map map = new HashMap();
map.put("username","xx");
map.put("age",18);
map.put("deptname","zz");
map.put("companyname","yy");*/
//听过list集合填充数据
List<Map> list = new ArrayList<Map>();
for (int i = 0; i <5 ; i++) {
Map map = new HashMap();
map.put("username","傻逼");
map.put("age",1);
list.add(map);
}
JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(list);
JasperPrint jasperPrint = JasperFillManager.fillReport(path,new HashMap<String, Object>(), dataSource);
//3、jrprint作为一个参数,通过exporter生成PDF
JasperExportManager.exportReportToPdfStream(jasperPrint,response.getOutputStream());
}
}
4.4处理中文乱码
1.配置文件
net.sf.jasperreports.extension.registry.factory.simple.font.families=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
net.sf.jasperreports.extension.simple.font.families.lobstertwo=stsong/fonts.xml
2.字体
5.图形汇总生成PDF
5.1创建一个group
在fields基础上
5.2controller
package cn.itcast.web.controller.cargo;
import cn.itcast.web.controller.BaseController;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author cyy
* @date 2020/3/26 14:05
*/
@RequestMapping(value = "/cargo/export")
@Controller
public class PdfController extends BaseController {
@RequestMapping(value = "/exportPdf")
public void exportPdf(String id) throws Exception {
//1、设置路径查找jasper文件
String path ="D:\\Install\\Java\\work\\demo\\export_parent\\export_web_manager\\src\\main\\webapp\\jasper\\test05.jasper";
//2、通过路径创建jrprint
// JasperFillManager:path:指的是jasper文件的路径
// map:用map的形式填充jasper里数据
// DataSource:用list的形式填充jasper里的表格
/* Map map = new HashMap();
map.put("username","xx");
map.put("age",18);
map.put("deptname","zz");
map.put("companyname","yy");*/
//听过list集合填充数据
List<Map> list = new ArrayList<Map>();
for (int i = 0; i <5 ; i++) {
Map map = new HashMap();
map.put("deptname","en");
map.put("username","傻逼");
map.put("age",1);
list.add(map);
}
for (int i = 0; i <5 ; i++) {
Map map = new HashMap();
map.put("deptname","e");
map.put("username","xx");
map.put("age",1);
list.add(map);
}
JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(list);
JasperPrint jasperPrint = JasperFillManager.fillReport(path,new HashMap<String, Object>(), dataSource);
//3、jrprint作为一个参数,通过exporter生成PDF
JasperExportManager.exportReportToPdfStream(jasperPrint,response.getOutputStream());
}
}
6.图形格式生成PDF
6.1 jasper操作
6.2 controller
//1、设置路径查找jasper文件
String path ="D:\\Install\\Java\\work\\demo\\export_parent\\export_web_manager\\src\\main\\webapp\\jasper\\test06.jasper";
//2、通过路径创建jrprint
// JasperFillManager:path:指的是jasper文件的路径
// map:用map的形式填充jasper里数据
// DataSource:用list的形式填充jasper里的表格
/* Map map = new HashMap();
map.put("username","xx");
map.put("age",18);
map.put("deptname","zz");
map.put("companyname","yy");*/
//听过list集合填充数据
List<Map> list = new ArrayList<Map>();
for (int i = 0; i <5 ; i++) {
Map map = new HashMap();
map.put("name","en");
map.put("value",i);
list.add(map);
}
JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(list);
JasperPrint jasperPrint = JasperFillManager.fillReport(path,new HashMap<String, Object>(), dataSource);
//3、jrprint作为一个参数,通过exporter生成PDF
JasperExportManager.exportReportToPdfStream(jasperPrint,response.getOutputStream());
三.报运单生成PDF
1.beansUtils工具类
package cn.itcast.common.utils;
import org.springframework.cglib.beans.BeanMap;
import java.util.HashMap;
import java.util.Map;
public class BeanMapUtils {
/**
* 将对象属性转化为map结合
*/
public static <T> Map<String, Object> beanToMap(T bean) {
Map<String, Object> map = new HashMap<String, Object>();
if (bean != null) {
BeanMap beanMap = BeanMap.create(bean);
for (Object key : beanMap.keySet()) {
map.put(key+"", beanMap.get(key));
}
}
return map;
}
/**
* 将map集合中的数据转化为指定对象的同名属性中
*/
public static <T> T mapToBean(Map<String, Object> map,Class<T> clazz) throws Exception {
T bean = clazz.newInstance();
BeanMap beanMap = BeanMap.create(bean);
beanMap.putAll(map);
return bean;
}
}
2.controller
package cn.itcast.web.controller.cargo;
import cn.itcast.common.utils.BeanMapUtils;
import cn.itcast.domain.cargo.Export;
import cn.itcast.domain.cargo.ExportProduct;
import cn.itcast.domain.cargo.ExportProductExample;
import cn.itcast.domain.cargo.ExtCproductExample;
import cn.itcast.service.cargo.ExportProductService;
import cn.itcast.service.cargo.ExportService;
import cn.itcast.web.controller.BaseController;
import com.alibaba.dubbo.config.annotation.Reference;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author cyy
* @date 2020/3/26 14:05
*/
@RequestMapping(value = "/cargo/export")
@Controller
public class PdfController extends BaseController {
@Reference
private ExportService exportService;
@Reference
private ExportProductService exportProductService;
@RequestMapping(value = "/exportPdf")
public void exportPdf(String id) throws Exception {
//1、设置路径查找jasper文件
String path ="D:\\Install\\Java\\work\\demo\\export_parent\\export_web_manager\\src\\main\\webapp\\jasper\\export.jasper";
// 查询订单的实体类
Export export = exportService.findById(id);
Map<String, Object> map = BeanMapUtils.beanToMap(export);
ExportProductExample example =new ExportProductExample();
ExportProductExample.Criteria criteria = example.createCriteria();
criteria.andExportIdEqualTo(export.getId());
List<ExportProduct> exportProducts = exportProductService.findAll(example);
JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(exportProducts);
//2、通过路径创建jrprint
// JasperFillManager:path:指的是jasper文件的路径
// map:用map的形式填充jasper里数据
// DataSource:用list的形式填充jasper里的表格
JasperPrint jasperPrint = JasperFillManager.fillReport(path,map, dataSource);
//3、jrprint作为一个参数,通过exporter生成PDF
JasperExportManager.exportReportToPdfStream(jasperPrint,response.getOutputStream());
}
}