回顾
- 定时任务( 1.jobdetail, 2.触发器,3.调度容器,4.cron表达式)
- pdf报表(1.设计阶段 : 模板制作,2.数据填充,3.下载展示)
1 特殊模板(了解)
##1.1 分组报表
分组报表:通过列表中的一个属性,对数据进行分组打印
要达到的效果如下图所示:

(1)

(2)

(3)

(4)

(5)

(6)

<7>

<8>

测试分组报表相关代码:
/**
* 测试:分组报表
*/
@RequestMapping("/exportPdf5")
public void exportPdf5(String id) throws Exception {
//配置模板路劲
String path = session.getServletContext().getRealPath("/")+"/jasper/test04.jasper";
//创建JapserPrint对象
List<ItcastUser> list = new ArrayList<>();
for(int i=0;i<5;i++) {
ItcastUser user = new ItcastUser();
user.setUsername("传智用户"+i);
user.setAge(10 + i);
user.setCompanyName("传智播客");
list.add(user);
}
for(int i=0;i<5;i++) {
ItcastUser user = new ItcastUser();
user.setUsername("皮革厂用户"+i);
user.setAge(10 + i);
user.setCompanyName("江南皮革厂");
list.add(user);
}
JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(list);
JasperPrint jp = JasperFillManager.fillReport(path,new HashMap<>(),dataSource);
//输出
JasperExportManager.exportReportToPdfStream(jp,response.getOutputStream());
}
1.2 chart图形报表
<1>

<2>

<3>

(4)
<5>
测试chart图形报表
/**
* 实现报运单的pdf生成
* 报运单对象
* 报运单的所有商品
* 参数 : 报运单id
*/
@RequestMapping("/exportPdf4")
public void exportPdf4(String id) throws Exception {
//1.根据id查询报运单
Export export = exportService.findById(id);
//2.根据报运单id查询所有的商品
ExportProductExample example = new ExportProductExample();
ExportProductExample.Criteria criteria = example.createCriteria();
criteria.andExportIdEqualTo(id);
List<ExportProduct> list = exportProductService.findAll(example);
//3.加载模板的路径
String path = session.getServletContext().getRealPath("/")+"/jasper/export.jasper";
//4.创建JasperPrint对象,需要填充数据
// Map map = new HashMap();
// map.put("customerContract",export.getCustomerContract());
Map<String, Object> map1 = BeanMapUtils.beanToMap(export);
JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(list); //list数据
JasperPrint jp = JasperFillManager.fillReport(path,map1,dataSource);
//5.输出pdf文件
JasperExportManager.exportReportToPdfStream(jp,response.getOutputStream());
}
效果图:

2 邮件发送
2.1 概述

SMTP协议: 邮件发送协议
将邮件的数据发送到smtp服务器上 : 默认端口25
POP3协议: 邮件接收协议
从pop服务器上获取邮件 : 默认端口110
2.2 保存用户发送邮件
<1> 将发送邮件的工具包拷贝到项目export_common下的utils文件夹下


MailUtil内相关代码如下:
package cn.itcast.common.utils;
import javax.mail.Address;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;
public class MailUtil {
/**
* 实现邮件返送
* @param to 邮件的接收邮箱地址
* @param subject 邮件主题
* @param content 邮件正文
*/
public static void sendMsg(String to ,String subject ,String content) throws Exception{
Properties props = new Properties();
props.setProperty("mail.smtp.host", "smtp.sina.com"); //设置主机地址 smtp.qq.com smtp.sina.com
props.setProperty("mail.smtp.auth", "true");//认证
//2.产生一个用于邮件发送的Session对象
Session session = Session.getInstance(props);
//3.产生一个邮件的消息对象
MimeMessage message = new MimeMessage(session);
//4.设置消息的发送者
Address fromAddr = new InternetAddress("itcast004@sina.com");
message.setFrom(fromAddr);
//5.设置消息的接收者
Address toAddr = new InternetAddress(to);
//TO 直接发送 CC抄送 BCC密送
message.setRecipient(MimeMessage.RecipientType.TO, toAddr);
//6.设置主题
message.setSubject(subject);
//7.设置正文
message.setText(content);
//8.准备发送,得到火箭
Transport transport = session.getTransport("smtp");
//9.设置火箭的发射目标
transport.connect("smtp.sina.com", "itcast004@sina.com", "loveyou"); //内置的邮箱发送邮件
//10.发送
transport.sendMessage(message, message.getAllRecipients());
//11.关闭
transport.close();
}
public static void main(String[] args) throws Exception {
MailUtil.sendMsg("2921232227@qq.com","今晚不见不散","晚八点,老地方见.");
}
}
当用户保存成功之后,向用户的邮箱发送一封邮件.


发邮件的核心代码如下:
/**
* 保存或者更新部门
* 1.参数user
* 2.获取到企业id并设置
* 3.判断 user中是否具有id
* 2.1 没id,调用service保存
* 2.2 有id,调用service更新
* 4.跳转页面
*/
@RequestMapping("/edit")
public String edit(User user) {
//2.获取到企业id并设置
user.setCompanyId(getLoginCompanyId());
user.setCompanyName(getLoginCompanyName());
String password = user.getPassword();
//3.判断 user中是否具有id
if(StringUtils.isEmpty(user.getId())) {
//没id,调用service保存
userService.save(user);
//发送邮件
String to = user.getEmail();
String subject = "欢迎使用saas-export系统";
String content = "尊敬的用户"+user.getUserName()+"您好,欢迎加入saas系统,您的访问URL: http://localhost:8088" +
", 登录名: "+to+",密码:"+password;
try {
MailUtil.sendMsg(to,subject,content);
} catch (Exception e) {
e.printStackTrace();
}
}else{
//有id,调用service更新
userService.update(user);
}
//4.跳转页面
return "redirect:/system/user/list.do";
}
3 消息中间件(重点)
##3.1 概述

消息的生产者: 创建消息,将消息发送到中间件
消息的消费者: 从中间件中获取消息,使用消息
消息中间 : 软件
3.2 应用场景
异步处理,应用解耦,流量削峰

3.3 JMS规范
JMS : Java Message service (java消息服务) , 是java中使用消息中间件的一套标准/规范(接口和抽象类).
3.3.1 jms中定义的消息模式

3.3.2 jms中的API对象(编程模型)


3.3.3 java中的消息中间件
消息中间件: 实现了JMS规范的工具
ActiveMq : 是java开发的apache开源的
RabbitMQ : 阿里开源
Kafka : 处理大数据
3.4 ActiveMq
提供了两方面的内容:
- 消息中间件服务器
- 提供了一套操作消息中间服务的java工具类实现了JMS规范
3.5 安装ActiveMq服务
<1> 将ActiveMq安装到Linux上面

<2>
第一步:安装 jdk(略)
第二步:把 activemq的压缩包(apache-activemq-5.14.5-bin.tar.gz)上传到 linux 系统
第三步:解压缩压缩包
tar -zxvf apache-activemq-5.14.5-bin.tar.gz
第四步:进入apache-activemq-5.14.5的bin目录
cd apache-activemq-5.14.5/bin
第五步:启动 activemq
./activemq start
第六步:停止activemq:
./activemq stop
业务端的监控窗口 : http://ip:8161
在网页上输入linux服务器地址+8161端口号

请求地址: tcp://ip:61616 (java代码访问消息中间件)
4 JMS入门案例
##4.1 消息生产者


消息生产者内相关代码:
package cn.itcast.test;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
public class MqProducer {
/**
* 入门案例:消息的生产者
*/
public static void main(String[] args) throws JMSException {
//1.创建连接工厂
ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://192.168.25.102:61616");
//2.创建连接(默认连接未打开)
Connection connection = factory.createConnection();
//3.打开连接
connection.start();
//4.创建session
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);//是否需要事务,事务提交方式
//5.创建目的地对象 队列 queue,主体 topic
Destination destination = session.createTopic("heima92-topic");
//Destination destination = session.createQueue("heima92-queue");//参数 :队列的名称
//6.创建消息的生产者
MessageProducer producer = session.createProducer(destination);//创建一个到heima92-queue队列的生产者
//7.创建消息
TextMessage message = session.createTextMessage("i am a girl!");//参数 : 传递的文本内容
//8.发送消息
producer.send(message);
//9.释放资源
session.close();
connection.close();
}
}
##4.2 消息消费者


4.2.1 自定义监听器

###4.2.2 测试方法

##4.3 spring整合开发生产者
4.3.1 抽取工具类


消息消费者内相关代码:
package cn.itcast.test;
import cn.itcast.listener.TestMessageListener;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
public class MqConsumer {
public static void main(String[] args) throws JMSException {
//1.创建连接工厂
ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://192.168.25.102:61616");
//2.创建连接
Connection connection = factory.createConnection();
//3.开启连接
connection.start();
//4.创建session
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//5.创建目的地
//Destination destination = session.createQueue("heima92-queue");
Destination destination = session.createTopic("heima92-topic");
//6.创建消息的消费者
MessageConsumer consumer = session.createConsumer(destination);
//7.监听消息
consumer.setMessageListener(new TestMessageListener());
}
}
4.3.2 配置spring和mq整合(生产者)
<1> 创建生产者 在pom文件中导入依赖

<2>

<context:component-scan base-package="cn.itcast"></context:component-scan>
<!--连接工厂-->
<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<constructor-arg name="brokerURL" value="tcp://192.168.25.102:61616/"></constructor-arg>
</bean>
<!--缓存连接工厂:spring为了优化mq-->
<bean class="org.springframework.jms.connection.CachingConnectionFactory" id="cachingConnectionFactory">
<property name="targetConnectionFactory" ref="connectionFactory"></property>
</bean>
<!--JmsTemplate : spring提供的工具类,发送mq消息-->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="cachingConnectionFactory"></property>
</bean>
<!--创建工具类-->
<bean id="producer" class="cn.itcast.utils.SpringProducer"></bean>
<!--配置目的地-->
<bean id="destination" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg name="name" value="heima92-queue"></constructor-arg>
</bean>
<3>创建一个类,测试SpringMqProduce是否搭建成功

相关代码如下:
package cn.itcast.test;
import cn.itcast.utils.SpringProducer;
import org.apache.activemq.command.ActiveMQQueue;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
public class SpringMqProducer {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext-mq-producer.xml");
//获取jmstemplate对象
// JmsTemplate jmsTemplate = (JmsTemplate) ac.getBean("jmsTemplate");
// //发送消息
// //1.目的地 queue
// Destination destination = new ActiveMQQueue("heima92-queue");
// //2.发送消息
// jmsTemplate.send(destination, new MessageCreator() {
// public Message createMessage(Session session) throws JMSException {
// //创建消息
// return session.createTextMessage("spring的queue消息");
// }
// });
SpringProducer springProducer = (SpringProducer)ac.getBean("producer");
springProducer.sendMsg("工具类发送的");
}
}
4.4 spring整合开发消费者
4.4.1 消息监听器

4.4.2 整合配置spring消息消费者

<!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供-->
<bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://192.168.25.102:61616"/>
</bean>
<!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->
<bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">
<!-- 目标ConnectionFactory对应真实的可以产生JMS Connection的ConnectionFactory -->
<property name="targetConnectionFactory" ref="targetConnectionFactory"/>
</bean>
<!--监听器交给spring容器管理-->
<bean id="testMessageListener" class="cn.itcast.listener.TestMessageListener"></bean>
<!--
配置消息监听器容器集合
1.指定监听的消息类型
2.指定缓存连接工厂
当监听到queue类型的消息之后,自动的执行监听器中的业务逻辑
-->
<jms:listener-container destination-type="queue" connection-factory="connectionFactory">
<jms:listener destination="heima92-queue" ref="testMessageListener"></jms:listener>
</jms:listener-container>
把容器创建出来,把容器启动起来

5 使用消息中间件发送邮件(重点)
作业 :

本文详细介绍消息中间件如ActiveMQ、RabbitMQ的应用场景、安装配置及与Spring的整合开发,涵盖定时任务、PDF报表生成,并探讨了邮件发送机制与实现。
685

被折叠的 条评论
为什么被折叠?



