freemarker的使用

时间:2022-06-01
本文章向大家介绍freemarker的使用,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

一:freemarker是什么?

freemarker是一个模板引擎,基于定义的模板和数据生成对应的文本(HTML,xml,java等),是一个生成文本的工具。

二:freemarker的使用方法

(1)在工程中引入freemarker相关的依赖

<dependency>
  <groupId>org.freemarker</groupId>
  <artifactId>freemarker</artifactId>
  <version>2.3.23</version>
</dependency>

(2)使用的步骤

第一步:创建一个Configuration对象,直接new一个即可,构造参数是freemarker的版本号

第二步:设置模板文件所在的路径,需要给出在磁盘上储存的全路径

第三步:设置生成的文件的编码格式,一般为utf-8格式

第四步:加载模板,创建模板对象

第五步:创建模板使用的数据集,可以使pojo也可以是map类型的

第六步:创建Write流对象,将文件文件输出,需要指定生成的文件的名称

第七步:调用模板的process方法,生成相应的文本

第八步:关闭流

@Test
    public void genFile() throws Exception {
        // 第一步:创建一个Configuration对象,直接new一个对象。构造方法的参数就是freemarker对于的版本号。
        Configuration configuration = new Configuration(Configuration.getVersion());
        // 第二步:设置模板文件所在的路径。
        configuration.setDirectoryForTemplateLoading(new File("D:/workspace/item-web/src/main/webapp/WEB-INF/ftl"));
        // 第三步:设置模板文件使用的字符集。一般就是utf-8.
        configuration.setDefaultEncoding("utf-8");
        // 第四步:加载一个模板,创建一个模板对象。
        Template template = configuration.getTemplate("hello.ftl");
        // 第五步:创建一个模板使用的数据集,可以是pojo也可以是map。一般是Map。
        Map dataModel = new HashMap<>();
        //向数据集中添加数据
        dataModel.put("hello", "this is my first freemarker test.");
        // 第六步:创建一个Writer对象,一般创建一FileWriter对象,指定生成的文件名。
        Writer out = new FileWriter(new File("D:/temp/out/hello.html"));
        // 第七步:调用模板对象的process方法输出文件。
        template.process(dataModel, out);
        // 第八步:关闭流。
        out.close();
    }

(3)模板的语法

1.访问map中的key

${key}即可获得对应的value值

2.访问pojo中的属性

以student对象为例: ${student.id}  ${student.name}即可取得student对象中的id值和name值

3.去集合中的元素

例如:遍历学生对象集合,取出每一个学生的id值和name值

<#list studentList as student>

  ${student,id} ${student.name} 

<#list>

4.取集合中的下标

<#list studentList as student>

  对象+下划线+index 即可获得下标值

  ${student_index}

<#list>

5.判断

<#list sutdnetList as student>

  进行奇偶数的判断

  <#if student_index % 2 ==0>

    //偶数的处理过程

  <#else>

    //奇数的处理过程

  <#if>

<#list>

6.日期类型的格式化

${date?date}  当前日期

${date?time}  当前时间

${date?datetime} 当前日期和时间

${date?string("yyyy-MM-dd hh:mm:ss")} 设置日期格式

7.NULL的处理

!对输出的控制处理,只输出,无返回值

${name} 如果name为空就会报错

${name!}如果name为空,不会报错,没有输出

${name!"默认值'} 如果name为空,就会输出默认值

${name!666}如果name为空,会输出666

${student.name}如果student或者name为空,报错

${student.name!"默认值"}如果student为空,会报错,name为空,输出默认值

??测试是否为null,返回Boolean类型的值

product.color??将只测试color是否为null


(product.color)??将测试product和color是否存在null 


??和?的区别

??是判断对象是否为空,例如:<#if object??>object对象不为空(即object存在)</#if>

?后面要加内建函数名,例如:<#if object?exists>object对象不为空(即object存在)</#if>

<#if str??>${str?string}</#if><#--将str以字符串形式显示-->

8.include标签

<#include “模板名称“>

三:freemarker和spring的整合

(1)将Configuration对象的创建交给spring统一管理,为该对象注入两个属性,模板路径和文件的编码格式

<bean id="freemarkerConfig"
        class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
        <property name="templateLoaderPath" value="/WEB-INF/ftl/" />
        <property name="defaultEncoding" value="UTF-8" />
    </bean>

(2)进行测试

@Controller
public class HtmlGenController {
    
    @Autowired
    private FreeMarkerConfigurer freeMarkerConfigurer;

    @RequestMapping("/genhtml")
    @ResponseBody
    public String genHtml()throws Exception {
        // 1、从spring容器中获得FreeMarkerConfigurer对象。
        // 2、从FreeMarkerConfigurer对象中获得Configuration对象。
        Configuration configuration = freeMarkerConfigurer.getConfiguration();
        // 3、使用Configuration对象获得Template对象。
        Template template = configuration.getTemplate("hello.ftl");
        // 4、创建数据集
        Map dataModel = new HashMap<>();
        dataModel.put("hello", "1000");
        // 5、创建输出文件的Writer对象。
        Writer out = new FileWriter(new File("D:/temp/term197/out/spring-freemarker.html"));
        // 6、调用模板对象的process方法,生成文件。
        template.process(dataModel, out);
        // 7、关闭流。
        out.close();
        return "OK";
    }
}

错误的地方希望大家指正。