Freemarker是一款模板引擎。
模板 + 数据模型 = 输出

从上图不难看出FreeMarker就是将数据模型中的值填充到模板文件中指定的插值处,最后将填充后的文本形式输出。
使用FreeMarker将数据模型中的值合并到模板文件中,一般有以下步骤:
1、创建Configuration实例,该实例负责管理FreeMarker的模板加载路径,负责生产模板实例。
2、使用Configuration实例来生成Template实例,同时需要指定使用的模板文件。
3、填充数据模型,数据模型一般就是一个Map对象。
4、调用Template实例的process()方法完成合并。
**在Java中使用FreeMarker

**
FreeMarkerTest.java
1public class FreeMarkerTest { 2 3 private Configuration cfg = null; 4 5 public static void main(String[] args) throws Exception { 6 FreeMarkerTest maker = new FreeMarkerTest(); 7 maker.init(); 8 maker.process(); 9 } 10 11 //初始化工作 12 public void init() throws Exception { 13 cfg = new Configuration(); 14 //设置模板文件位置 15 cfg.setDirectoryForTemplateLoading(new File("src/template")); 16 } 17 18 //模板 + 数据模型 = 输出 19 public void process() throws Exception { 20 //创建数据模型 21 Map<String, String> rootMap = new HashMap<String, String>(); 22 rootMap.put("name", "FreeMarker"); 23 rootMap.put("message", "FreeMarker For Java Project"); 24 25 //使用Configuration实例加载指定模板 26 Template template = cfg.getTemplate("user.ftl"); 27 //合并处理(模板 + 数据模型) 28 template.process(rootMap, new OutputStreamWriter(System.out)); 29 } 30}
创建的Map对象rootMap作为模板文件的数据模型,该数据模型中的两个Value值会填充到模板(user.ftl)中对应key值的插值处。
user.ftl
${name}, ${message}
Console
FreeMarker, FreeMarker For Java Project
**在Java Web中使用FreeMarker
**大部分时候FreeMarker都用于在Web应用中生成HTML页面。

FreeMarkerServlet.java
1public class FreeMarkerServlet extends HttpServlet { 2 3 private Configuration cfg = null; 4 5 public void init() throws ServletException { 6 cfg = new Configuration(); 7 //设置模板文件位置 8 cfg.setServletContextForTemplateLoading(getServletContext(), "/template"); 9 } 10 11 public void doGet(HttpServletRequest request, HttpServletResponse response) { 12 //建立数据模型 13 Map<String, String> rootMap = new HashMap<String, String>(); 14 rootMap.put("name", "FreeMarker模板"); 15 rootMap.put("message", "FreeMarker For JavaWeb"); 16 17 try { 18 //取得模板文件 19 Template template = cfg.getTemplate("hello.ftl"); 20 response.setContentType("text/html; charset=utf-8 "); 21 Writer out = response.getWriter(); 22 //合并数据模型和模板,并将结果输出到response.getWriter()中 23 template.process(rootMap, out); 24 }catch(IOException e) { 25 e.printStackTrace(); 26 }catch(TemplateException t) { 27 t.printStackTrace(); 28 } 29 } 30}
hello.ftl
1<html> 2 <head> 3 <title>FreeMarker For JavaWeb</title> 4 </head> 5 <body> 6 <h1 style = "color:blue">${name}</h1> 7 <h1 style = "color:red">${message}</h1> 8 </body> 9</html>
访问 http://localhost:8080/FreeMarkerForJavaWeb/FreeMarkerServlet结果页面:

这两个示例的不同之处在于Servlet中加载模板的方法是setServletContextForTemplateLoading(Object o, String s),该方法的第一个参数是本应用的ServletContext实例,第二个参数是模板文件所在的路径。
**在Struts2中使用FreeMarker

**
index.jsp
1<body> 2 <h1>Register Information</h1> 3 <s:form action="login" method="post"> 4 <s:label value="username" /> 5 <!-- name属性和Action中的字段名一致 --> 6 <s:textfield id="username" name="name" /> 7 <s:label value="password" /> 8 <s:password id="password" name="pwd" /> 9 <s:label value="age" /> 10 <s:textfield id="age" name="age" /> 11 <s:label value="register" /> 12 <s:textfield id="register" name="registerDate" /> 13 <s:submit value="submit" /> 14 </s:form> 15 <hr> 16 </body>
LoginAction.java
1public class LoginAction extends ActionSupport { 2 private String name; 3 private String pwd; 4 private int age; 5 private Date registerDate; 6 7 8 9 10 11 省略getter、setter 12 13 @Override 14 public String execute() throws Exception { 15 return SUCCESS; 16 } 17}
struts.xml
1<struts> 2 <package name="FreeMarker For Struts2" extends="struts-default"> 3 <action name="login" class="cn.struts2.action.LoginAction"> 4 <result type="freemarker">/WEB-INF/templates/userlist.ftl</result> 5 </action> 6 </package> 7</struts>
userlist.ftl
1<html> 2 <head> 3 </head> 4 <body> 5 用户名:${name} <br> 6 密码:${pwd} <br> 7 年龄:${age} <br> 8 注册日期:${registerDate} <br> 9 </body> 10</html>
