接上一节,环境一样,这次来说另外两个任务,一个是定时任务,一个是发邮件。
1.定时任务
定时任务可以设置精确到秒的准确时间去自动执行方法。
我要一个程序每一秒钟说一句:java小新人最帅
于是,我就写了一个方法,注解里cron里面的很多星星意思是:每个月、周一到周日 、每个小时、每一分、每一秒都执行一次这个方法。
主配置类加个开启注解
ok,可以了,直接启动应用,不需要浏览器,直接在控制台看到打印的消息:
所以我们要掌握的是@Scheduled注解中属性cron的表达式,大概的就是下图所示:
2.发邮件
来测试一下用springboot发邮件,假如我用qq邮箱向一个老哥的网易邮箱发邮件,基本的逻辑就是:从qq邮箱---------->腾讯qq邮箱服务器------------>网易邮箱服务器-------------->163网易邮箱
所以我们要配置的就是我们qq邮箱的账号密码
第一步:导入依赖
第二步:配置文件(看清楚stmp.qq.com这是SMTP服务器中qq邮件的主机地址,其他邮件有自己的STMP主机地址),最后的那个是建议ssl安全连接的,一定要开启
其中,qq邮箱得到授权码步骤如下:
第三步:测试类
运行测试方法,可以在网易云邮箱看到邮件:
3.邮件的高级一点的功能(发邮件有附件)
运行这个测试方法:
4.再高级一点(用模板发送邮件)
还是用博客园注册为例,不知道大家注册的时候是不是收到了一个激活邮件,打开大概的格式就是:xxx用户,您注册博客园账户需要激活,请点击激活邮件激活
咳,记得不太清楚了,应该差不多,嘿嘿!话说难道每个人注册博客园都会用上面的发送html的方式,慢慢拼接html然后发送吗?其实这样也行,只是看起来太lower了,而且代码看起来会很凌乱。
那今天我就用前面学的themeleaf给做个模板,来假装发发邮件,骗骗自己,嘿嘿~(●´∀`●)~
首先导入themeleaf的依赖,指定themeleaf的版本
其实真正开发中,会把这个发邮件的方法写成一个类,传入一些参数就可以发送的,我们嘛,就怎么简单怎么来吧!
themeleaf文件的位置和内容(不要忘记themeleaf的目录位置和用法了)
点击激活账号,就会跳转到我的controller中的方法,如下:
ok,到这里就可以了,记得,先运行springboot应用,然后运行测试方法,收到邮件,自己激活一下,然后就会跳转到
成功跳转,于是你就激活成功了!
5.可能出现的bug
说说用模板可能会碰到的bug,哎,用了我好几个小时,现在我还是一副日了狗的心情。
怎么回事呢?代码写了,看了好几遍也没错,就是运行就报错,在网上看了别人的代码拿过来还是报错,报错如下:
这个错误大概意思就是我的模板的html中每个标签都要是闭标签,要这种类型的<a></a>,假如是<img xxx>这种标签就会报错。
如下所示,最坑的方法就是修改的,而且以后html的标签都要是一对一对的,坑啊、、、
后来有找了很多资料,原来发现是这里,themeleaf默认应该是2.xx版本,这个版本解析标签都要是一对一对的,到了3.xx之后,就不需要这么麻烦了!
都是版本问题,坑了我好几个小时,哎,记住记住....
>>> dir(cur)
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'arraysize', 'close', 'connection', 'description', 'execute', 'executemany', 'executescript', 'fetchall', 'fetchmany', 'fetchone', 'lastrowid', 'row_factory', 'rowcount', 'setinputsizes', 'setoutputsize']
我们在里面看到了一系列我们熟悉的名称:close()、execute()、fetchall() 等。
1.创建数据库表
面对 SQLite 数据库,我们之前熟悉的 SQL 指令都可以用:
>>> create_table = "create table books (title,author,language)"
>>> cur.execute(create_table)
<sqlite3.Cursor object at 0x104f296c0>
这样就在数据库 lite.db 中建立了一个表 books。对这个表可以增加数据:
>>> cur.execute('insert into books values("python basic","rocky","python")')
<sqlite3.Cursor object at 0x104f296c0>
为了保证数据能够保存,还要进行如下操作:
>>> conn.commit()
>>> cur.close()
>>> conn.close()
以上,在刚才建立的数据库中已经有了一个表 books,表中已经有了一条记录。
2.查询
保存以后我们来查询一下:
>>> conn = sqlite3.connect('lite.db')
>>> cur = conn.cursor(www.feifanyule.cn/)
>>> cur.execute('select * from books')
<sqlite3.Cursor object at 0x104f297a0>
>>> cur.fetchall()
[('python basic', 'rocky', 'python')]
3.批量插入
我们来给 books 表中多增加一些内容,以便于我们进行其它的操作:
>>> books = [("first book","first","c"),("second book","second","c++"),("third book","third","java")]
这次我们来一个批量插入:
>>> cur.executemany('insert into books values (?,?,?)',books)
<sqlite3.Cursor object at 0x104f297a0>
>>> conn.commit()
接下来我们用循环语句来打印一下查询结果:
>>> rows = cur.execute('select www.mingcheng178.com* from books')
>>> for row in rows:
... print(row)
...
('python basic', 'rocky', 'python')
('first book', 'first', 'c')
('second book', www.mhylpt.com/'second', 'c++')
('third book', 'third',www.yigouyule2.cn 'java')
4.更新
正如我们前面所说的,在 cur.execute() 中,可以写 SQL 语句来操作数据库:
>>> cur.execute("update books set title='physics' where author='first'")
<sqlite3.Cursor object at 0x104f297a0>
>>> conn.commit()
接下来我们按照条件查询来看一看:
>>> cur.execute("select * from books where author='first'")
<sqlite3.Cursor object at 0x104f297a0>
>>> cur.fetchall()
[('physics', 'first', 'c')]
5.删除
删除也是操作数据库必须的动作:
>>> cur.execute("www.gcyL157.com select * from books")
<sqlite3.Cursor object at 0x104f297a0>
>>> cur.fetchall(www.michenggw.com)
[('python basic', 'rocky', 'python'), ('physics', 'first', 'c'), ('third book', 'third', 'java')]
最后不要忘记在完成对数据库的操作以后,一定记得给人家「关上门」:
>>> cur.close(www.gcyL157.com )
>>> conn.close()
写在之后
基本的知识差不多就是这些,当然肯定不局限于此。在实际的编程中我们肯定会遇到很多的问题,大家记得要多多去查阅官方文档,学会解决问题。
带着新人学springboot的应用10(springboot+定时任务+发邮件)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
了解Spring之BeanDefinition对象
流年與你作伴之人
2019-02-24 14:04:20
Spring学习之对JDBC的支持
s5650326
2019-02-23 12:59:04
JEESZ分布式框架简介---技术介绍文档
qq593e3b758e013
2019-02-23 12:55:03
声明式事务
liudajiang
2019-02-23 12:53:51
Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
mengmeng89012
2019-02-23 00:33:41
Spring Cloud云架构 - SSO单点登录之OAuth2.0登录认证(1)
mingliabc123
2019-02-23 00:28:04
Spring Cloud云架构 - SSO单点登录之OAuth2.0登录认证(1)
mingliabc123
2019-02-23 00:27:49
Spring Cloud云服务架构 - commonservice-eureka 项目过程构建
mingliabc123
2019-02-23 00:27:48
Spring Cloud微服务分布式云架构 - spring cloud集成项目
mingliabc123
2019-02-23 00:27:48
Spring Cloud微服务架构代码结构详细讲解
mingliabc123
2019-02-23 00:27:47
Spring Cloud自定义引导属性源
mingliabc123
2019-02-23 00:27:47
Spring Cloud Config 加密和解密
mingliabc123
2019-02-23 00:27:47
spring cloud微服务分布式云架构简介
mingliabc123
2019-02-23 00:27:46
Spring Cloud构建微服务架构—服务网关过滤器
mingliabc123
2019-02-23 00:27:38