FreeMarker
Freemarker是免費開源的模板引擎技術;
Freemarker腳本為Freemarker Template Language;
Freemarker提供了大量內建函數來簡化開發;
JSP與Freemarker
JSP | Freemarker | |
---|---|---|
官方標准 | 是 | 否 |
執行方式 | 編譯型 | 解釋型 |
執行效率 | 高 | 低 |
開發效率 | 低 | 高 |
擴展能力 | 弱 | 強 |
數據提取 | JSTL+EL | 內置標簽 |
FreeMarker基本用法
FreemarkerSample1.java
package freemarker;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.Map;
import freemarker.core.ParseException;
import freemarker.template.Configuration;
import freemarker.template.MalformedTemplateNameException;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateNotFoundException;
public class FreemarkerSample1 {
public static void main(String[] args) throws TemplateNotFoundException, MalformedTemplateNameException,
ParseException, IOException, TemplateException {
// 1.加載模板
// 創建核心配置對象
Configuration config = new Configuration(Configuration.VERSION_2_3_28);
// 設置加載的目錄
config.setClassForTemplateLoading(FreemarkerSample1.class, ""); // ""代表當前包
// 得到模板對象
Template t = config.getTemplate("sample1.ftl");
// 2.創建數據
Map<String, Object> data = new HashMap<>();
data.put("site", "百度");
data.put("url", "http://www.baidu.com");
// 3.產生輸出
t.process(data, new OutputStreamWriter(System.out));
}
}
sample1.ftl
<#-- 這是注釋 -->
${site}-${url}
控制台輸出
百度-http://www.baidu.com
FTL取值
- ${屬性名} 取值,可對屬性進行計算
- ${屬性名!默認值} 如果屬性不存在的話使用默認值
- ${屬性名?string("")} 格式化輸出
分支判斷
<#-- if -->
<#if state == 1>
我是1
<#elseif state == 2>
我是2
</#if>
<#if user??> <#-- 判斷對象是否為null -->
我不是null
</#if>
<#-- switch -->
<#switch state>
<#case 1>
我是1
<#break>
<#case 2>
我是2
<#break>
<#default>
其他
</#switch>
list迭代
<#-- list迭代列表 -->
<#list students as stu>
<li>${stu_index}-${stu.name}</li>
</#list>
<#-- list迭代Map -->
<#list map?keys as key>
${key}:${map[key]}
</#list>
常用內建函數
函數名 | 說明 | 示例 |
---|---|---|
lower_case/upper_case | 大小寫轉換 | "abcdefg"?upper_case |
cap_first | 首字母大寫 | "jackson"?cap_first |
index_of | 查找字符索引 | "abcdef"?index_of("b") |
length | 返回字符串長度 | "abcdef"?length |
round/floor/ceiling | 四舍五入/下取整/上取整 | pi?floor |
size | 得到集合元素總數 | students?size |
first/last | 獲取第一個/最后一個元素 | students?first |
sort_by | 按某個屬性對集合排序 | list?sort_by("time") |
<#-- ?string可以實現三目運算符的操作 -->
${(words?index_of("blood") != -1)?string("包含敏感詞匯", "不包含敏感詞匯")}
<#-- replace -->
${words?replace("blood", "*****")}
<#-- sort_by返回一個新的集合,默認升序排列 -->
<#-- reverse將順序反轉 -->
<#list computers?sort_by("price")?reverse as c>
${c.sn}-${c.price}
</#list>
freemarker中文官方參考手冊: http://freemarker.foofun.cn/
Freemarker與Servlet整合
配置FreemarkerServlet
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>fm</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<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>
<url-pattern>*.ftl</url-pattern>
</servlet-mapping>
</web-app>