如需转载,请根据 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 许可,附上本文作者及链接。
本文作者: Alice
作者昵称: 沉。
本文链接: http://example.com/2020/11/17/%E5%BC%82%E6%AD%A5%E4%BB%BB%E5%8A%A1/
十四、异步、定时、邮件任务
14.1、异步任务
1、创建一个service包
2、创建一个类AsyncService
异步处理还是非常常用的,比如我们在网站上发送邮件,后台会去发送邮件,此时前台会造成响应不动,直到邮件发送完毕,响应才会成功,所以我们一般会采用多线程的方式去处理这些任务。
编写方法,假装正在处理数据,使用线程设置一些延时,模拟同步等待的情况;
1 | package com.chen.service; |
3、编写controller包
4、编写AsyncController类
我们去写一个Controller测试一下
1 | package com.chen.controller; |
5、访问http://localhost:8080/hello进行测试,3秒后出现success,这是同步等待的情况。
问题:我们如果想让用户直接得到消息,就在后台使用多线程的方式进行处理即可,但是每次都需要自己手动去编写多线程的实现的话,太麻烦了,我们只需要用一个简单的办法,在我们的方法上加一个简单的注解即可,如下:
6、给hello方法添加@Async注解;
1 | //告诉Spring这是一个异步方法 |
SpringBoot就会自己开一个线程池,进行调用!但是要让这个注解生效,我们还需要在主程序上添加一个注解@EnableAsync ,开启异步注解功能;
1 | //开启异步注解功能 |
7、重启测试,网页瞬间响应,后台代码依旧执行!
14.2、定时任务
项目开发中经常需要执行一些定时任务,比如需要在每天凌晨的时候,分析一次前一天的日志信息,Spring为我们提供了异步执行任务调度的方式,提供了两个接口。
- TaskExecutor接口 任务执行者
- TaskScheduler接口 任务调度者
两个注解:
@EnableScheduling // 开启定时功能的注解
@EnableAsync//开启异步注解功能
cron表达式:
测试步骤:
1、创建一个ScheduledService
我们里面存在一个hello方法,他需要定时执行,怎么处理呢?
字段 | 允许值 | 允许的特殊字符 |
---|---|---|
秒(Seconds) | 0~59的整数 | , - * / 四个字符 |
分(Minutes) | 0~59的整数 | , - * / 四个字符 |
小时(Hours) | 0~23的整数 | , - * / 四个字符 |
日期(DayofMonth) | 1~31的整数(但是你需要考虑你月的天数) | ,- * ? / L W C 八个字符 |
月份(Month) | 1~12的整数或者 JAN-DEC | , - * / 四个字符 |
星期(DayofWeek) | 1~7的整数或者 SUN-SAT (1=SUN) | , - * ? / L C # 八个字符 |
年(可选,留空)(Year) | 1970~2099 | , - * / 四个字符 |
1、创建一个ScheduledService
我们里面存在一个hello方法,他需要定时执行,怎么处理呢?
1 |
|
2、这里写完定时任务之后,我们需要在主程序上增加@EnableScheduling 开启定时任务功能
1 | //开启异步注解功能 |
3、我们来详细了解下cron表达式;
http://www.bejson.com/othertools/cron/
4、常用的表达式
1 | (1)0/2 * * * * ? 表示每2秒 执行任务 |
14.3、邮件任务:
邮件发送,在我们的日常开发中,也非常的多,Springboot也帮我们做了支持
- 邮件发送需要引入spring-boot-start-mail
- SpringBoot 自动配置MailSenderAutoConfiguration
- 定义MailProperties内容,配置在application.yml中
- 自动装配JavaMailSender
- 测试邮件发送
测试:
1、引入pom依赖
1 | <dependency> |
看它引入的依赖,可以看到 jakarta.mail
1 | <dependency> |
2、查看自动配置类:MailSenderAutoConfiguration,这个类中存在bean,JavaMailSenderImpl
然后我们去看下配置文件
1 |
|
3、配置文件:
1 | 1405994298@qq.com = |
获取授权码:在QQ邮箱中的设置->账户->开启pop3和smtp服务
4、Spring单元测试
1 |
|
查看邮箱,邮件接收成功!
我们只需要使用Thymeleaf进行前后端结合即可开发自己网站邮件收发功能了!
十五、富文本编辑器
15.1、简介
思考:我们平时在博客园,或者CSDN等平台进行写作的时候,有同学思考过他们的编辑器是怎么实现的吗?
在博客园后台的选项设置中,可以看到一个文本编辑器的选项:
其实这个就是富文本编辑器,市面上有许多非常成熟的富文本编辑器,比如:
- Editor.md——功能非常丰富的编辑器,左端编辑,右端预览,非常方便,完全免费
- wangEditor——基于javascript和css开发的 Web富文本编辑器, 轻量、简洁、界面美观、易用、开源免费。
- TinyMCE——TinyMCE是一个轻量级的基于浏览器的所见即所得编辑器,由JavaScript写成。它对IE6+和Firefox1.5+都有着非常良好的支持。功能齐全,界面美观,就是文档是英文的,对开发人员英文水平有一定要求。
- 百度ueditor——UEditor是由百度web前端研发部开发所见即所得富文本web编辑器,具有轻量,功能齐全,可定制,注重用户体验等特点,开源基于MIT协议,允许自由使用和修改代码,缺点是已经没有更新了
- kindeditor——界面经典。
- Textbox——Textbox是一款极简但功能强大的在线文本编辑器,支持桌面设备和移动设备。主要功能包含内置的图像处理和存储、文件拖放、拼写检查和自动更正。此外,该工具还实现了屏幕阅读器等辅助技术,并符合WAI-ARIA可访问性标准。
- CKEditor——国外的,界面美观。
- quill——功能强大,还可以编辑公式等
- simditor——界面美观,功能较全。
- summernote——UI好看,精美
- jodit——功能齐全
- froala Editor——界面非常好看,功能非常强大,非常好用(非免费)
总之,目前可用的富文本编辑器有很多……这只是其中的一部分
15.2、Editor.md
我这里使用的就是Editor.md,作为一个资深码农,Mardown必然是我们程序猿最喜欢的格式,看下面,就爱上了!
我们可以在官网下载它:https://pandao.github.io/editor.md/ , 得到它的压缩包!
解压以后,在examples目录下面,可以看到他的很多案例使用!学习,其实就是看人家怎么写的,然后进行模仿就好了!
我们可以将整个解压的文件倒入我们的项目,将一些无用的测试和案例删掉即可!
15.3、基础工程搭建
数据库设计
article:文章表
字段 | 备注 | |
---|---|---|
id | int | 文章的唯一ID |
author | varchar | 作者 |
title | varchar | 标题 |
content | longtext | 文章的内容 |
建表SQL:
1 | CREATE TABLE `article` ( |
基础项目搭建
1、建一个SpringBoot项目配置
1 | spring: |
2、实体类:
1 | //文章类 |
3、mapper接口:
1 | @Mapper |
1 | "1.0" encoding="UTF-8" xml version= |
既然已经提供了 myBatis 的映射配置文件,自然要告诉 spring boot 这些文件的位置
1 | mybatis: |
编写一个Controller测试下,是否ok;
15.4、文章编辑整合(重点)
1、导入 editor.md 资源 ,删除多余文件
2、编辑文章页面 editor.html、需要引入 jQuery;
1 | <!DOCTYPE html> |
3、编写Controller,进行跳转,以及保存文章
1 | @Controller |
图片上传问题
1、前端js中添加配置
1 | //图片上传 |
2、后端请求,接收保存这个图片, 需要导入 FastJson 的依赖!
1 | //博客图片上传问题 |
3、解决文件回显显示的问题,设置虚拟目录映射!在我们自己拓展的MvcConfig中进行配置即可!
1 | @Configuration |
表情包问题
自己手动下载,emoji 表情包,放到图片路径下:
修改editormd.js文件
1 | // Emoji graphics files url path |
15.5、文章展示
1、Controller 中增加方法
1 | @GetMapping("/{id}") |
2、编写页面 article.html
1 | <!DOCTYPE html> |
重启项目,访问进行测试!大功告成!
-------------本文结束感谢您的阅读-------------
本文链接: http://example.com/2020/11/17/%E5%BC%82%E6%AD%A5%E4%BB%BB%E5%8A%A1/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!