一、为什么要使用FreeMaker
传统的JSP页面需要每次访问数据库,对数据库造成很大的负荷,不利于高并发的开发。FreeMaker则可以自动生成静态html文件,搭配Quartz进行定时更新,只需要定期访问一次数据库即可,避免了用户同时访问数据库的情况,大量减少了数据库的压力。
二、FreeMaker入门
2.1、依赖jar包
<dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.23</version> </dependency>
2.2、创建模板文件 .ftl
<html> <head> <meta charset="utf-8"/> <title>这是我的第一个模板</title> </head> <body> <#-- 这是一个注释,不会有任何的输出 --> ${name},您好。${message} </body> </html>
2.3、生成文件
//1.创建配置类 Configuration configuration = new Configuration(Configuration.getVersion()); //2.设置模板所在目录 configuration.setDirectoryForTemplateLoading(new File(path)); //3.设置字符集 configuration.setDefaultEncoding("utf-8"); //4.加载模板 Template template = configuration.getTemplate("example.ftl"); //5.创建数据模型 Map<String, Object> map = new HashMap<>(); map.put("name", "张三"); map.put("message", "欢迎来到freemarker的神奇世界"); //6.输出 Writer out = new FileWriter(new File(path+"example.html")); template.process(map, out); //7.关闭流 out.close();
三、FTL指令
3.1、assign 定义变量,include 引入其它模板文件
<#--assign:此指令用于在页面上定义一个变量--> <#assign myname="example"> 联系人:${myname} <hr/> <#-- assign还可以定义对象类型 --> <#assign info={"name":"张三","age":18,"address":"武汉"}> 该对象的姓名: ${info.name},年龄:${info.age},地址:${info.address}
在该模板文件中使用include指令引入example.ftl <#include "example.ftl">
3.2、if 和 list指令
if:
map.put("success", true); <#if success=true> 值是true <#else> 值是false </#if>
list:
Map<String, Object> map = new HashMap<>(); List<Student> list = new ArrayList<>(); list.add(new Student(1, "王重阳", 30)); list.add(new Student(2, "欧阳锋", 29)); list.add(new Student(3, "洪七公", 28)); map.put("mylist", list);
<table border="1"> <tr> <th>循环中的索引</th> <th>学号</th> <th>姓名</th> <th>年龄</th> </tr> <#list mylist as stu> <tr> <td>${stu_index}</td> <td>${stu.id}</td> <td>${stu.name}</td> <td>${stu.age}</td> </tr> </#list> </table>
3.3、内建函数
格式: ${变量?函数名}
example:${mylist?size}
将json字符串转化为对象
<#-- 定义对象:<#assign text={"name":"张三","age":18}> --> <#-- 定义json字符串 --> <#assign text="{'name':'工商银行','jc':'工行'}"> <#-- 将json字符串转换成json对象 --> <#assign data=text?eval> 银行名称:${data.name},简称:${data.jc}
日期格式化
在java代码中对变量赋值 map.put("today", new Date());
在ftl模板中应用
<p> 日期:${today?date} </p> <p> 时间:${today?time} </p> <p> 日期+时间:${today?datetime} </p> <p> ${today?string('yyyy年MM月dd日 HH:mm:ss')} </p>
将数字转化为字符串
在java代码中给变量赋值 map.put("num", 123456789); 模板中应用 ${num} 显示效果 123,456,789 如果不需要 ,分隔符则使用 ${num?c}
3.4、空值处理运算符
sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use
myOptionalVar?? 如果该变量存在,返回true,显示when-present,否则返回false,显示 when-missing <#if myOptionalVar??> when-present <#else> when-missing </#if>
3.5、缺失值表达式
如变量aaa有值则显示,无值则显示“ !”后的内容
<#-- ${aaa!"aaa值缺失"} --> ${aaa!}
3.6、运算符
算术运算符:+ - * / %
逻辑运算符:&& || !
比较运算符:
= 或者== 判断两个值是否相等 != 判断两个值是否不等 > 或者 gt 判断左边的值是否大于右边的值 < 或者 lt 判断左边的值是否小于右边的值 >=或者gte 判断左边的值是否大于或等于右边的值 <=或者 lte 判断左边的值是否小于或等于右边的值
四、Quartz触发器
4.1、依赖jar
<!-- quartz(如果quartz要和spring整合,必须依赖spring-context-support) --> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.3</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.3.2.RELEASE</version> </dependency>
4.2、Quartz框架的核心对象
Scheduler: 核心调度器
Job: 任务
JobDetail: 任务描述
Trigger: 触发器
4.3、对象之间的关系
4.4、使用
创建Job类
package XX.job; import java.io.File; import java.io.FileWriter; import java.io.Writer; import java.util.HashMap; import java.util.List; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import cn.kgc.mapper.BookMapper; import cn.kgc.pojo.Book; import cn.kgc.pojo.BookExample; import freemarker.template.Configuration; import freemarker.template.Template; public class MyScheduler { @Autowired private BookMapper bookMapper; public void generatorHtml(){ System.out.println("计划任务被执行了....."); BookExample example = new BookExample(); //查询书籍列表 List<Book> list = bookMapper.selectByExample(example); //-----------------freemarker------------------- try { Configuration configuration = new Configuration(Configuration.getVersion()); configuration.setDirectoryForTemplateLoading(new File("F:\\ssm_freemarker\\src\\main\\webapp\\WEB-INF\\ftl")); configuration.setDefaultEncoding("utf-8"); //加载模板 Template template = configuration.getTemplate("index.ftl"); //创建数据模型 Map<String, Object> map = new HashMap<String, Object>(); map.put("list", list); //创建wirter对象 Writer writer = new FileWriter(new File("F:\\ftl\\index.html")); //输出 template.process(map, writer); //关闭流 writer.close(); } catch (Exception e) { e.printStackTrace(); } } }
在spring中注入Job
<bean id="myScheduler" class="XX.job.MyScheduler"></bean>
给Job配置JobDetail
<!-- 将job类配置jobDetail(加载任务类,并且执行要执行的方法) --> <bean id="springQuartzJobMethod" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject"> <ref bean="myScheduler"/> </property> <!-- 还要执行的方法名 --> <property name="targetMethod" value="generatorHtml"></property> </bean>
配置调度触发器Trigger
<bean id="cronTriggerFactoryBean" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="springQuartzJobMethod"></property> <!-- corn表达式,就是定时任务的时间规则(每隔5秒钟执行一次) --> <property name="cronExpression" value="0/5 * * * * ?"></property> </bean>
配置核心调度器Scheduler
<bean id="springJobSchedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="cronTriggerFactoryBean"/> </list> </property> </bean>
至此已完成所有配置
五、拓展Cron表达式
cron
表达式被用来配置CronTrigger
实例。cron
表达式是字符串,实际上由七个子表达式组成,描述个别细节的时间表,并且这些表达式是用空格分开的。
Cron表达式的语法规则:
?
:表示不确定的值
,
指定数个值
-
指定一个值的范围
/
指定一个值得开始 n/m 从n开始每次增加m
L
在日中表示一个月的最后一天,在周中表示改约最后一个星期几
W
指离给定日期最近的工作日(周一到周五)
#
表示该月第几周,如6#3 表示该月第3个星期五