FreeMaker模板搭配Quartz的使用

一、为什么要使用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、对象之间的关系

FreeMaker模板搭配Quartz的使用

  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表达式的语法规则:

FreeMaker模板搭配Quartz的使用

 

  

    ?:表示不确定的值

    ,指定数个值

    -指定一个值的范围

    /指定一个值得开始 n/m 从n开始每次增加m

    L在日中表示一个月的最后一天,在周中表示改约最后一个星期几

    W指离给定日期最近的工作日(周一到周五)

    #表示该月第几周,如6#3 表示该月第3个星期五

 

上一篇:Quartz是怎样将job持久化到数据库的


下一篇:quartz Cron表达式一分钟教程