FreeMarker获取单个模板文件并渲染,工具类

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FreeMarker获取单个模板文件并渲染,工具类相关的知识,希望对你有一定的参考价值。

参考技术A SpringBoot集成FreeMarker,此工具可以借助FreeMarker渲染一个模板文件

引入pom.xml

FreeMarkerUtils.java

Freemarker

Freemarker

简介

  • FreeMarker 是一款 主流的模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。
  • 模板引擎的目标是数据+模板=结果
  • 模板编写为FreeMarker Template Language (FTL)。它是简单的,专用的语言,

安装使用

下载地址:http://mirror.bit.edu.cn/apache/freemarker/engine/2.3.28/binaries/apache-freemarker-2.3.28-bin.tar.gz

使用步骤:

  • 加载模板

    • 创建核心配置对象
    • 设置加载目录
    • 获取模板对象
  • 创建数据

  • 产生输出

FreemarkerDemo1.java

        //创建核心配置对象
        Configuration configuration = new Configuration(Configuration.VERSION_2_3_28);
        //设置加载目录
        configuration.setClassForTemplateLoading(FreemarkerDemo1.class,"");
        //得到模板对象
        Template t = configuration.getTemplate("demo2.ftl");
        //创建数据
        Map<String,Object> data = new HashMap<String,Object>();
        List<Student> students=new ArrayList<>();
        students.add(new Student("1001","Jack",18));
        students.add(new Student("1002","Lucy",17));
        students.add(new Student("1003","Tom",19));
        students.add(new Student("1004","Tim",20));
        students.add(new Student("1005","Marry",18));
        data.put("students",students);
        //产生输出
        t.process(data, new OutputStreamWriter(System.out));

FIL取值

语法:

$属性 $name $student.name

$属性 ! 默认值 $name ! "不存在该属性"

$属性 ?String() $salary ? String("0.00")

list迭代列表

Student.java

package entity;

public class Student 
    private String sno;
    private String name;
    private Integer age;

    public Student(String sno, String name, Integer age) 
        this.sno = sno;
        this.name = name;
        this.age = age;
    

    public String getSno() 
        return sno;
    

    public void setSno(String sno) 
        this.sno = sno;
    

    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

    public Integer getAge() 
        return age;
    

    public void setAge(Integer age) 
        this.age = age;
    

FreemarkerDemo2.java

package freemarker;

import entity.Student;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.*;

public class FreemarkerDemo2 
    public static void main(String[] args) throws IOException, TemplateException 
        //创建核心配置对象
        Configuration configuration = new Configuration(Configuration.VERSION_2_3_28);
        //设置加载目录
        configuration.setClassForTemplateLoading(FreemarkerDemo2.class,"");
        //得到模板对象
        Template t = configuration.getTemplate("demo2.ftl");
        //创建数据
        Map<String,Object> data = new HashMap<String,Object>();
        List<Student> students=new ArrayList<>();
        students.add(new Student("1001","Jack",18));
        students.add(new Student("1002","Lucy",17));
        students.add(new Student("1003","Tom",19));
        students.add(new Student("1004","Tim",20));
        students.add(new Student("1005","Marry",18));
        data.put("students",students);
        //产生输出
        t.process(data, new OutputStreamWriter(System.out));
    

demo2.ftl

<#list students as s>
    序号:$s_index+1     
    学号:$s.sno
    姓名:$s.name
    年龄:$s.age
-------------------------------
</#list>

list迭代Map

FreemarkerDemo3.java

package freemarker;

import entity.Student;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.*;

public class FreemarkerDemo3 
    public static void main(String[] args) throws IOException, TemplateException 
        //创建核心配置对象
        Configuration configuration = new Configuration(Configuration.VERSION_2_3_28);
        //设置加载目录
        configuration.setClassForTemplateLoading(FreemarkerDemo3.class,"");
        //得到模板对象
        Template t = configuration.getTemplate("demo3.ftl");
        //创建数据
        Map<String,Object> data = new HashMap<String,Object>();
        List<Student> students=new ArrayList<>();
        students.add(new Student("1001","Jack",18));
        students.add(new Student("1002","Lucy",17));
        students.add(new Student("1003","Tom",19));
        students.add(new Student("1004","Tim",20));
        students.add(new Student("1005","Marry",18));
        data.put("students",students);
        Map studentMap=new LinkedHashMap();
        for(Student s:students)
            studentMap.put(s.getSno(),s);
        
        data.put("studentMap",studentMap);
        //产生输出
        t.process(data, new OutputStreamWriter(System.out));
    

Demo03.ftl

<#list studentMap?keys as k>
    $k-$studentMap[k].name
</#list>

内建函数

参考手册:http://freemarker.foofun.cn/

技术图片

Freemarker与Servlet整合

  • 在WEB-INF目录下的lib文件夹中导入freemarker包
  • 配置web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>freemarker</servlet-name>
        <servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class>
        <!--设置加载目录-->
        <init-param>
            <param-name>TemplatePath</param-name>
            <param-value>/WEB-INF/ftl</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>freemarker</servlet-name>
        <!--映射路径--><!--所有扩展名为ftl文件被freemarker加载-->
        <url-pattern>*.ftl</url-pattern>
    </servlet-mapping>
</web-app>
  • 编写Servlet类
package Freemarker;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@WebServlet("/fre_servlet")
public class FreemarkerServlet extends HttpServlet 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 

    

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
        System.out.println("----------------------------");
        List<Map> students= new ArrayList<>();
        for (int i = 0; i < 5; i++) 
            Map<String, Object> student = new HashMap<>();
            student.put("sno", "S" + i);
            student.put("name", "Jack" + i);
            students.add(student);
        
        request.setAttribute("students", students);
        request.getRequestDispatcher("student.ftl").forward(request, response);
    

  • 编写ftl文件
<#list students as student>

学号:$student.sno-----姓名:$student.name<br>

</#list>
  • 启动Tomcat,访问Servlet

技术图片

以上是关于FreeMarker获取单个模板文件并渲染,工具类的主要内容,如果未能解决你的问题,请参考以下文章

页面静态化

Freemarker模板引擎

在 Freemarker 模板中,如何获取数据模型类的名称?

如何从 FreeMarker 模板调用对象的 java 方法?

Freemarker

freemarker如何停止渲染