Freemarker详解 Freemarker 自定义标签详解 Freemarker是一款模板引擎,是一种基于模版生成静态文件的通用工具,它是使用纯java编写的,一般用来生成HTML页面。 原理 Freemarker 生成静态页面,首先需要使用自己定义的模板页面,这个模板页面可以是最最普通的html,也可以是嵌套freemarker中的 取值表达式, 标签或者自定义标签等等,然后后台读取这个模板页面,解析其中的标签完成相对应的操作, 然后采用键值对的方式传递参数替换模板中的的取值表达式,做完之后 根据配置的路径生成一个新的html页面, 以达到静态化访问的目的。 FreeMarker模板文件 文本,直接输出的部分 注释,即<#--...-->格式不会输出 插值(Interpolation):即${..}或者#{..}格式的部分,将使用数据模型中的部分替代输出 FTL指令:FreeMarker指令,和HTML标记类似,名字前加#予以区分,不会输出。 <html> <body> <#-- 注释部分 --> <br> <#-- 下面使用插值 --> <h1>Welcome ${user} !</h1> <p>We have these animals: <u1> <#-- 使用FTL指令 --> <#list animals as being> <li>${being.name} </li> <#list> <u1> </body> </html> 指令 1. list <#list nameList as names> ${names} </#list> 主要是进行迭代服务器端传递过来的List集合,name是list循环的时候取的一个循环变量.相关指令 item_index:当前变量的索引值 item_has_next:是否存在下一个对象 break:跳出迭代 2. if指令 <#if (names=="javaschool")> 请访问:www.codingdict.com </#if> 该标签主要是做if判断用的,要注意的是条件等式必须用括号括起来。 3. include <#include filename> <#include filename options> 该标签用于导入文件。option包含下面2种属性: encoding=”GBK” 编码格式 parse=true 是否作为ftl语法解析,默认是true,false就是以文本方式引入.注意在ftl文件里布尔值都是直接赋值的如parse=true,而不是parse=”true” <#include "include.html"/> <#include "/common/copyright.ftl" encoding=”GBK”> 4. switch , case , default , break指令 <#switch value> <#case refValue>...<#break> <#case refValue>...<#break> <#default>... </#switch> 5. import指令 <#import path as hash> 类似于java里的import,它导入文件,然后就可以在当前文件里使用被导入文件里的宏组件。 6. noparse指令 <#noparse>...</#noparse> noparse指令指定FreeMarker不处理该指定里包含的内容。 <#noparse> <#list books as book> <tr><td>${book.name}<td>作者:${book.author} </#list> </#noparse> 7. escape,noescape指令 <#escape identifier as expression>... <#noescape>...</#noescape> </#escape> escape指令导致body区的插值都会被自动加上escape表达式,但不会影响字符串内的插值,只会影响到body内出现的插值。 8. assign指令 <#assign name=value> or <#assign name1=value1 name2=value2 ... nameN=valueN> <#assign same as above... in namespacehash> <#assign name> capture this </#assign> <#assign name in namespacehash> capture this </#assign> assign指令用于为该模板页面创建或替换一个顶层变量。 9. setting指令 <#setting name=value> 该指令用于设置FreeMarker的运行环境,name的取值范围包含如下几个: locale:该选项指定该模板所用的国家/语言选项 number_format:指定格式化输出数字的格式 boolean_format:指定两个布尔值的语法格式,默认值是true,false date_format,time_format,datetime_format:指定格式化输出日期的格式 time_zone:设置格式化输出日期时所使用的时区 搭建Freemarker环境 使用maven来构建,pom.xml下载jar包 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.wxp.freemarker</groupId> <artifactId>freemarker01</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>freemarker01</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> <!-- Freemarker --> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.20</version> </dependency> </dependencies> </project> 2. 创建Freemarker根据数据和模型生成Html页面的工具类FreemarkerUtil package test.freemarker; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.util.Map; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; public class FreemarkerUtil { public Template getTemplate(String name) { Template temp = null; try { // 通过Freemarker的Configuration读取相应的Ftl Configuration cfg = new Configuration(); // 设定去哪里读取相应的ftl模板 cfg.setClassForTemplateLoading(this.getClass(), "/ftl"); // 在模板文件目录中寻找名称为name的模板文件 temp = cfg.getTemplate(name); } catch (IOException e) { e.printStackTrace(); } return temp; } /** * 控制台输出文件内容 * @param name * @param rootMap */ public void print(String name, Map<String, Object> rootMap) { try { // 通过Template类可以将模板文件输出到相应的文件 Template temp = this.getTemplate(name); temp.process(rootMap, new PrintWriter(System.out)); } catch (TemplateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 将替换后的模板内容输出到文件 * @param name * @param rootMap * @param outFile */ public void fprint(String name, Map<String, Object> rootMap, String outFile) { FileWriter out = null; try { out = new FileWriter(new File("D:\\freemarker\\ftl\\html\\" + outFile)); Template template = this.getTemplate(name); template.process(rootMap, out); } catch (TemplateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (null != out) try { out.close(); } catch (IOException e) { e.printStackTrace(); } } } } 3. 来创建Freemarker的模板ftl文件 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> 你好,${username} </body> </html> 4. 测试生成html页面 package test.freemarker; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.Before; import org.junit.Test; import org.wxp.freemarker.model.User; public class TestFreemarker { private FreemarkerUtil freemarkerUtil; private Map<String, Object> rootMap = null; @Before public void setUp() { freemarkerUtil = new FreemarkerUtil(); rootMap = new HashMap<String, Object>(); } @Test public void test01() { // 填充数据 rootMap.put("username", "codingdict"); // 打印到控制台 freemarkerUtil.print("01.ftl", rootMap); // 输出到文件 freemarkerUtil.fprint("01.ftl", rootMap, "01.html"); } } 运行结果生成html页面 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> 你好,codingdict </body> </html> 总结 FreeMarker是一款模板引擎:即一种基于模板、用来生成输出文本(任何来自于 HTML格式的文本用来自动生成源代码)的通用工具。它是为 Java 程序员提供的一个开发包,或者说是一个类库。 FreeMarker 不是 Web 开发的应用程序框架。它是一个适用于Web应用程序框架中的组件,但是FreeMarker引擎本身并不知道 HTTP协议或 Java Servlet 的存在。它仅仅来生成文本内容。 Freemarker 自定义标签详解