freemarker学习记录
主要涉及到三个文件
1,TestServlet.java如下:
package example;import freemarker.template.Configuration;import freemarker.template.Template;import freemarker.template.TemplateException;import java.io.BufferedWriter;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.io.PrintWriter;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Calendar;import java.util.Date;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.logging.Level;import java.util.logging.Logger;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/*** 测试* @author wesley*/public class TestServlet extends HttpServlet { private Configuration cfg; protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //初始化FreeMarker配置,创建Configuration实例 cfg = new Configuration(); cfg.setDefaultEncoding("UTF-8"); //设置FreeMarker的模版文件位置 cfg.setServletContextForTemplateLoading(getServletContext(), "templates"); //建立数据模型 Map root = new HashMap(); //放入对应数据 root.put("title", "使用Freemarker生成静态页面实例!"); root.put("content", "FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据(如下图)"); root.put("author", "小仇"); root.put("answer", 43); Map latestMap = new HashMap(); latestMap.put("url", "www.baidu.com"); latestMap.put("name", "green mouse"); root.put("latestMap", latestMap); root.put("indexOf", new IndexOfMethod()); List<Map<String, Object>> list = new ArrayList<Map<String,Object>>(); Map<String, Object> map11 = new HashMap<String, Object>(); map11.put("name", "qiuyujiao1"); map11.put("age", 21); list.add(map11); Map<String, Object> map22 = new HashMap<String, Object>(); map22.put("name", "qiuyujiao2"); map22.put("age", 22); list.add(map22); Map<String, Object> map33 = new HashMap<String, Object>(); map33.put("name", "qiuyujiao3"); map33.put("age", 23); list.add(map33); Map<String, Object> map44 = new HashMap<String, Object>(); map44.put("name", "qiuyujiao4"); map44.put("age", 24); list.add(map44); root.put("listtest", list); //建立模型结束--- //获得模版文件 Template template = cfg.getTemplate("test.ftl"); //开始准备生成输出,使用模版文件的charset作为本页面的charset response.setContentType("text/html;charset=" + template.getEncoding()); PrintWriter printWriter = response.getWriter(); try { //合并数据模型和模版,并将结果输出到printWriter中(把数据放到了printWriter里面跟生成动态页面没关系) template.process(root, printWriter); File newHtml = getHtmlFile(); doWrite(template, newHtml.getPath(), root); //生成静态页面 printWriter.print("<a href='"+"2013-01-23"+"/"+newHtml.getName()+"'>"+newHtml.getName()+"</a>"); // String path = dirName+"/"+newHtml.getName();// HttpSession session = request.getSession(true);// session.setAttribute("path", path); } catch (Exception ex) { //Logger.getLogger(TestServlet.class.getName()).log(Level.SEVERE, null, ex); throw new ServletException("处理Template模版中出现错误", ex); } } /** * 得到已经生成的文件,以便根据已经生成的文件获取文件名字和文件路径 * @return 已经生成的文件 */ private File getHtmlFile(){ long htmlName = Calendar.getInstance().getTimeInMillis(); Date date = new Date(htmlName); SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd"); String dirName = f.format(date); //存放生成后的静态页面的目录 eg:2008-9-9 String saveDirectory = getServletContext().getRealPath("/") + dirName + "//"; File dir = new File(saveDirectory); //如果目录不存在,则创建目录 if (!dir.exists()) { dir.mkdir(); } //生成静态文件 File newHtml = new File(dir + "/" + htmlName + ".html"); return newHtml; } /** * 生成静态文件 * @param template : 模版 * @param path : 静态页面路径 * @param root : 数据模型 */ private void doWrite(Template template, String path, Map<String, Object> root) { BufferedWriter bw = null; try { bw = new BufferedWriter(new FileWriter(path)); template.setEncoding(cfg.getDefaultEncoding()); template.process(root, bw); bw.flush(); } catch (TemplateException ex) { Logger.getLogger(TestServlet.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(TestServlet.class.getName()).log(Level.SEVERE, null, ex); } finally { try { bw.close(); } catch (IOException ex) { Logger.getLogger(TestServlet.class.getName()).log(Level.SEVERE, null, ex); } } } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } }
2,模版文件rest.fld如下:
<html> <head> <title>${title}</title> </head> <body> <h1 style="color: green;">内容:${content}!</h1> <h3>作者:${author}</h3> <br> <br> <br> <br> <br> <br> <br> ------------------ <br> <br> ${answer} <br> ${answer?string.percent}<#--类型转换标签的应用--> ${latestMap.url}${latestMap.name} <#assign x = "something"> <#--赋值变量-->${indexOf("met", x)} <#--应用了 方法变量 IndexOfMethod--><br/>${indexOf("foo", x)} <#list listtest as being> <#--list标签的应用-->${being.name}<br>${being.age}</#list> <br><br> <#--自定义的标签greet--><#macro greet person,website>Hello${person}!<br>YourWebsiteis${website}</#macro> <#--使用自定义的greet标签--><@greet person="萤火虫" website="www.52gua.com"/> <br> </body></html>
3,附加的方法变量类IndexOfMethod.java如下
package example;import java.util.List;import freemarker.template.SimpleNumber;import freemarker.template.TemplateMethodModel;import freemarker.template.TemplateModelException;public class IndexOfMethod implements TemplateMethodModel {public Object exec(List args) throws TemplateModelException {// TODO Auto-generated method stubif (args.size() != 2) {throw new TemplateModelException("Wrong arguments");}return new SimpleNumber(((String) args.get(1)).indexOf((String) args.get(0)));}}
简单项目结构图如下: