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()
方法,直接使用双等号即可
- 对于对象点属性来说会调用对应的getter方法,直接输出对象会调用该对象的
${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>
Comments NOTHING