模板引擎二 FreeMarker

目录

一、了解FreeMarker

二、FreeMarker基本语法

三、FreeMarker快速入门

四、FreeMarker高级指令--list

五、FreeMarker--内建函数

六、FreeMarker在web项目中的应用


在线中文参考手册:http://freeMarker.foofun.cn/toc.html
在线模板测试网站:https://try.freeMarker.apache.org

一、了解FreeMarker

模板引擎,基于模板和要改变的数据,用来生成输出文本(HTML网页、电子邮件、配置文件、源代码)的通用工具。是一个Java类库,一款组件。
与JSP区别:FreeMarker是根据模板生成各种文件,而JSP是需要jsp的引擎,来解析成servlet,然后把servlet编译成字节码文件来执行。

FreeMarker的特点:
    彻底分离表现层和业务逻辑
    性能好,提高开发效率
    使得开发过程中的人员分工更加明确
    学习成本低
    支持表达式、宏定义(类似jsp标签)

二、FreeMarker基本语法

1、数据类型:

标量:基本数据类型。字符串、数字、布尔值、日期/时间
容器:哈希表(类似于HashMap)、序列(类似于List)、集合
子程序:方法和函数、用户自定义指令

2、算术运算符

数字运算:+-*/%
字符串运算:${name}、${"hello,${name}"}、${"hello,"+name}、<#if isBig>Wow!</#if>、变量下标为0和4的字符:${name[0]}${name[4]}、下标为0到4的字符:${name[0..4]}
    指令:以<#标识:错误:<#if ${isBig}>Wow!</#if>    正确:<#if isBig>Wow!</#if>,isBig变量不需要加表达式,可以直接写
逻辑运算符:与&&、或||、非!
比较运算符:>(gt) <(lt) >=(gte) <=(lte) ==(或=) != (推荐使用英文符号)
    只能比较数字和日期,不能比较字符串,返回为布尔类型不能直接输出
    由于FreeMarker会将>解释成FTL标记的结束字符,所以对于>和>=可以使用括号来避免这种情况,比如<#if (x>y)>
空值运算符:
    ??(判断是否为空):FreeMarker中没有null的定义,需要判断是否为空。
        检查对象的属性是否为空:<#if object.attribute??></#if>,检查对象或属性是否为空:<#if (object.attribute)??></#if>
    !(指定缺少变量的默认值,如果不指定则默认值是空字符串、长度为0的序列或长度为0的Map对象)
        ${aaa!}:如果aaa变量没定义,不报错,默认没有任何输出
        ${aaa!'-'}:如果aaa变量没定义,为空,就默认设置该表达式输出的值为横杠-,这里不会为aaa变量赋值
        ${(user.name)!"默认值"}:如果user或name为空,就输出默认值
        ${user.name!"默认值"}:如果user为空会报错,如果name为空会输出默认值
        
3、模板中的代码片段

    ${...}:表达式,称为interpolation插值
    注释:<#-- --> 注释的内容不会输出
    FTL标签:FreeMarker的指令。这些标签的名字以#开头。用户自定义的标签则需要使用@来代替#。
    
4、基本指令
    
条件判断指令:
    if指令:<#if 条件>输出</#if>
    if-else指令:<#if 条件>输出<#else>输出</#if>
    if-elseif-else指令:<#if 条件1>输出<#elseif 条件2>输出<#else>输出</#if>
    switch、case、break、default指令:参数可以为数字、字符串。<#switch var><#case 条件1>输出<#break><#case 条件2>输出<#break><#default>输出</#switch>

三、FreeMarker快速入门

静态网页、动态网页

页面静态化:适用于高并发、要求响应速度快、大规模且数据变化不太频繁的页面场景

使用FreeMarker生成HTML文件
使用FreeMarker生成Java类

还写什么curl,通通搞个模板一键生成!!!

四、FreeMarker高级指令--list

1、list指令:两种写法

<#list users as user>
    ${user}
<#else>
    "list为空"
</#list>

<#list users>
  <ul>
    <#items as user>
      <li>${user}</li>
    </#items>
  </ul>
<#else>
  <p>"list为空"
</#list>

2、sep指令:可在每一个迭代项中间放一些内容,不会把内容插入到第一项之前或最后一项之后。可结合迭代指令List使用

<#list users as user>
    ${user}<#sep>, </#sep>
</#list>

通过内建函数实现sep指令效果:

<#list users as user>
    ${user}<#if user?has_next>, </#if>
</#list>

3、break指令:配合if指令使用,满足条件时跳出迭代

<#list 1..10 as x>
    ${x}
    <#if x=3><#break></#if>
</#list>
1..10:代表1到10

4、list指令排序

升序:sort、sort_by()
对users升序排序:
<#list users?sort as user>
</#list>
根据年龄对用户list升序排序:
<#list users?sort_by("age") as user>
</#list>
降序:sort_by()?reverse
<#list users?sort_by("age")?reverse as user>
</#list>

5、list遍历Map

<#list dataMap?keys as key>
    <option value="${key}">${dataMap[key]}</option>
    ${key}-${dataMap[key]}<#if key?has_next>, </#if>
</#list>

像else、items、break只能在指令体内部使用,而不能移出到宏或被包含的模板中

五、FreeMarker--内建函数

内建函数:由语法规定存在的内建函数。包含在编译器的运行时库中,直接调用即可,其实现由编译器对应的厂商完成。
使用到的内建函数:sort、sort_by、reverse、keys、has_next
特点:都是写在?后面,实现某个功能(函数)
编译器提供了针对各种数据类型的内建函数、结点(xml)内建函数、循环变量内建函数、独立类型内建函数、其他内建函数(很少使用或专家级的)
相关内建函数参考可见:http://freemarker.foofun.cn/ref_builtins.html

六、FreeMarker在web项目中的应用

1、添加依赖:
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-freemarker</artifactId>
    </dependency>

2、指定freemarker文件的后缀为ftl,默认为ftlh
spring.freemarker.suffix=.ftl

3、创建一个以.ftl为后缀的文件 src\main\resources\templates\test.ftl

<html>
<body>
<div class="container">
    <table class="table table-dark table-hover">
        <thead>
        <tr>
            <th>name</th>
            <th>age</th>
            <th>sex</th>
        </tr>
        </thead>
        <tbody>
        <#list userlist?sort_by("age") as user>
        <tr>
            <td>
                <#if (user.name)??>
                    ${user.name}
                <#else>
                    姓名不详
                </#if>
            </td>
            <td>${user.age!"年龄不详"}</td>
            <td>${user.sex!"性别不详"}</td>
        </tr>
        </#list>
        </tbody>
    </table>
</div>
</body>
</html>

4、编写Controller,跳转到freemarker文件

@Data
@NoArgsConstructor
@AllArgsConstructor
public class TestUser {
    private String name;
    private String age;
    private String sex;
}
@Controller
public class TestController {
    @RequestMapping("/test")
    public String test(HttpSession session){
        TestUser user1 = new TestUser("zhangsan","23","男");
        TestUser user2 = new TestUser("lisi","18",null);
        TestUser user3 = new TestUser(null,"20","女");
        List<TestUser> userlist = new ArrayList();
        userlist.add(user1);
        userlist.add(user2);
        userlist.add(user3);
        session.setAttribute("userlist",userlist);
        return "test";
    }
}

5、效果展示

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章