09-Freemarker模板引擎

nobility 发布于 2021-09-29 1108 次阅读


Freemarker模板引擎

Freemarker是一个免费开源的,解释型的模板引擎,简单易用,扩展能力强,内置标签,后缀名为**.ftl**,可从Freemarker官网获取jar包,导入项目,并在web.xml中做以下配置即可

<!--配置Freemarker中自带的Servlet类,映射到以.ftl结尾的URL路径上-->
<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> <!--ftl文件不需要用户访问,所以放在WEB-INF目录下-->
  </init-param>
</servlet>
<servlet-mapping>
  <servlet-name>Freemarker</servlet-name>
  <url-pattern>*.ftl</url-pattern>
</servlet-mapping>

对于使用的数据,该模板引擎会自动从:当前页面、请求对象、会话对象和全局上下文对象依次递进式进行寻找变量,模板引擎就是为了将数据展示和数据生产解耦,所以模板引擎无法使用java代码,可通过Servlet请求转发的形式生产数据,可在模板中使用<#assign>标签定义变量

基本语法

  • ${key}:用法和EL表达式基本一致,将对应的自定义属性取出,或简单的表达式计算
    • 对于对象点属性来说会调用对应的getter方法,直接输出对象会调用该对象的toString()方法
    • 字符串比较不再需要equals()方法,直接使用双等号即可
  • ${key!default}:叹号后跟默认值,当key为null时会输出默认值
    • 对于null会报错
  • ${key?string}:问号后跟函数,将key格式化输出
  • ${key["mapKey"]}:方括号中可跟Map对象中的key,取出与之对应的value

myservlet.ftl中内容如下:

<h1>${key}</h1>
<h1>${nul!"默认值"}</h1>
<h1>${number?string("0,000.00")}</h1>   <#--默认是以货币形式进行数字格式化输出-->
<h1>${date?string("yyyy-MM-dd HH:mm:ss.SSS")}</h1>  <#--时间输出必须指定格式化,否则会报错-->
<h1>${map["mapKey"]}</h1>

Servlet中准备数据如下:

@WebServlet("/myservlet")
public class MyServlet extends HttpServlet {
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
    request.setAttribute("key", "value");
    request.setAttribute("nul", null);
    request.setAttribute("number", 123456.654321);
    request.setAttribute("date", new java.util.Date());

    HashMap<String, String> hashMap = new HashMap<>();
    hashMap.put("mapKey", "mapValue");
    request.setAttribute("map", hashMap);
    request.getRequestDispatcher("/myservlet.ftl").forward(request, response);
  }
}

条件分支和循环

单分支

<#assign score=100>	<#--定义变量-->
<#if (score == 100)>
    <h1>满分</h1>
<#elseif (score >= 60)>
    <h1>及格</h1>
<#else >
    <h1>重修</h1>
</#if>

<#if (nul??)>   <#--使用双问号可快速对null进行判断-->
    <h1>nul不为空</h1>
</#if>

多分支

<#assign score=88>	<#--定义变量-->
<#switch (score % 10)>
    <#case 9>
    <#case 8>
        <h1>80分以上</h1>
        <#break >
    <#case 7>
        <h1>70分以上</h1>
        <#break >
    <#default >
        <h1>重修</h1>
</#switch>

循环

<ul>
<#list list as item>    <#--使用item_index可获得索引,注意没有点-->
    <li>${item_index}、${item}</li>
</#list>
</ul>

<ul>
<#list map?keys as key> <#--使用keys函数先获取key的set集合后再进行遍历-->
    <li>${key_index}、${key}:${map[key]}</li>
</#list>
</ul>

Servlet中准备数据:

@WebServlet("/myservlet") //使用星号通配符
public class MyServlet extends HttpServlet {
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
    ArrayList<Integer> list = new ArrayList<>();
    list.add(1);
    list.add(2);
    list.add(3);
    list.add(4);
    request.setAttribute("list", list);

    HashMap<String,String> map = new HashMap<>();
    map.put("key1","value1");
    map.put("key2","value2");
    map.put("key3","value3");
    map.put("key4","value4");
    request.setAttribute("map", map);
    
    request.getRequestDispatcher("/myservlet.ftl").forward(request, response);
  }
}

常用内建函数

更多函数可参考Freemarker中文参考手册

函数名 描述
lower_case 转小写
upper_case 转大写
cap_first 首字母大写
index_of 查找字符索引
length 获取字符串长度
round 四舍五入
floor 向下取整
ceiling 向上取整
size 获取集合中元素个数
first 获取第一个元素
last 获取最后一个元素
sort_by 对集合进行排序
reverse 翻转序列
<h1>"HELLO"?lower_case: ${"HELLO"?lower_case}</h1>
<h1>"hello"?upper_case: ${"hello"?upper_case}</h1>
<h1>"hello"?cap_first: ${"hello"?cap_first}</h1>
<h1>"hello"?length: ${"hello"?length}</h1>
<h1>"hello"?index_of("llo"): ${"hello"?index_of("llo")}</h1>
<h1>3.5?round: ${3.5?round}</h1>
<h1>3.5?float: ${3.5?float}</h1>
<h1>3.5?ceiling: ${3.5?ceiling}</h1>
<h1>[1,2,3]?size: ${[1,2,3]?size}</h1>
<h1>[1,2,3]?first: ${[1,2,3]?first}</h1>
<h1>[1,2,3]?last: ${[1,2,3]?last}</h1>
<hr>
<h1>[1,3,2]?sort: </h1>
<ul>
    <#list [1,3,2]?sort as item>
        <li>${item}</li>
    </#list>
</ul>
<h1>[1,3,2]?sort?reverse:</h1>
<ul>
    <#list [1,3,2]?sort?reverse as item>
        <li>${item}</li>
    </#list>
</ul>
<ul>
    <#list objs?sort_by("field") as item>   <#--对对象的属性进行排序sort_by函数接收obj的属性参数-->
        <li>${item}</li>
    </#list>
</ul>
此作者没有提供个人介绍
最后更新于 2021-09-29