FreeMarker — 模板开发

1 什么是FreeMarker?

官方解释:FreeMarker 是一款模板引擎, 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。

其实FreeMarker的原理就是:模板+数据模型=输出

image

模板编写为FreeMarker Template Language (FTL),渲染前台界面后需要更改名为 xxx.ftl,同理xxx.jsp

特点:
轻量级模版引擎,不需要servlet,web容器
其次freemarker是java写的,很多语法很java是有密切联系的

2 FreeMarker测试环境搭建

直接使用IDEA 选择springboot 构建集成环境,勾选上web和freemarker

image

如果没有选择这这种方法的,在maven里面加入或者引入Jar即可

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>

用例测试

// 实体类
public class User {
    private Integer id;
    private String name;
    private String email;
    // ...getter and setter
}
// Controller类,存储值并跳转到index.htl界面
@Controller
@RequestMapping(value = "/index")
public class IndexController {

    @RequestMapping(value = "/login")
    public ModelAndView index(ModelAndView modelAndView) {
        List<User> userList=new ArrayList<User>();
        userList.add(new User(1,"augus","augu@163.com"));
        userList.add(new User(2,"aili","aili@163.com"));
        userList.add(new User(3,"beleng","beleng@163.com"));
        modelAndView.addObject("userList", userList);
        modelAndView.setViewName("index");
        return modelAndView;
    }

}
<!-- 前台-->
<!DOCTYPE html>
<html>
<body>
<table border="1">
    <tr>
        <th>name</th>
        <th>email</th>
    </tr>
    <!-- 遍历输出-->
    <#list userList as user>
        <tr>
            <th>${user.name}</th>
            <th>${user.email}</th>
        </tr>
    </#list>
</table>
</body>
<html>

测试结果
后台存储的3个用户,显示在前台界面上

image

3 FreeMarker 知识点

构成

模板由文本+插值+FTL标签+注释组成

  • 文本:HTML原来的内容
  • 插值:${}代表的就是插值,一般来说就是后台传过来的值显示在前台用${}表示
  • FTL标签:比如<#list></#list> 不会显示在界面上,和html标签类似
  • 注释:<#-- 注释 -->
    谨记一点,就是插值只能放在文本中,不能放在FTL标签中,不然渲染模板的时候会报错
正确的示范
<h2>${user.name}</h2>
错误的示范
<#if ${user.name} == "augus"></#if>
在FTL标签中,直接user.name 即可,不用插值

语法

定义变量

<#assign var = value > 定义变量并初始化

<!--定义字符串-->
<#assign str = "hello world" > 
<!--定义字数值-->
<#assign num = 13.2 > 
<!--定义布尔-->
<#assign flag = true > 
<!--定义数组-->
<#assign arr = ["foo", "boo", "get"]/>
<!--定义map-->
<#assign uMap={"name":"augus", "email":"augus@163.com"}>
if标签 判断

规范:<#if condition><#elseif condition><#else></#if>
比较运算符:x == y (等于) ,x!=y(不等于) ,x lt y(小于), x lte y(小于等于), x gt y(大于), x gte y (大于等于)

<!--定义数值num-->
<#assign num = 13.2 > 
<#if num gt 16>
    <p>num大于16</p>
<#elseif num lt 12>
    <p>num大于16</p>
<#else>
    <p>num在12~16的范围中</p>
</#if>

输出:
    num在12~16的范围中
list标签 循环

规范:<#list hash_or_seq as var></#list>

<!--定义数组-->
<#assign arrs = ["foo", "boo", "get"]/>
<!--循环-->
<#list arr as arr>
    ${arr},
</#list>

输出:
    foo, boo, get,
! 的空值操作

freemarker 针对防止null有特定的操作符

<p>${"name:"+name!}<p/>
<p>${(maxNumber!)+1}</p>

输出:
    name:

在页面中并未存在 name和maxNumber的,通过加 ! 可以处理null值的存在,如果上述例子不加 !操作符,模板加载时会报错 “The following has evaluated to null or missing:”

自定义函数和指令

可以在模板中使用function作为自定义函数,类似于js自定义funciton,在必要的时候直接调用即可

函数规范:<#function name param1 param2 ... paramN>

<!-- 函数测试 -->
<!-- 定义函数 -->
<#function sum num1 num2>
    <#return num1 + num2>
</#function>

<!-- 调用函数-->
${sumInt(5, 7)}

输出:

在模板中存在多个相同的操作的时候,可以自定义指令,进行重复的操作

指令规范:<#macro name param1 param2 ... paramN></#macro>

<!-- 指令测试 -->
<#macro prInfo name email>
    <p>姓名:${name}</p>
    <p>邮箱:${email}</p>
</#macro>
<!--调用自定 @操作符-->
<@prInfo "张三" "287159@qq.com"/>
<!-- 前台会将指令区域的值替换后输出HTML-->
输出:
    姓名:张三
    邮箱:287159@qq.com
    

4 结束

以上内容基本都是FreeMarker的常用知识点,我基本上是参考中文在线手册学习的,这里的FreeMarker知识点都是模板开发,并未涉及到程序开发,如有未涉及的知识点,可以参考FreeMarker中文在线手册,如果有心学习的话,基本上一天之内就可以将FreeMarker学习完
FreeMarker中文手册地址莫失精诚赤子心
原文出处:https://www.cnblogs.com/augusduan/p/9271516.html