Java操作FreeMarker模板引擎的基本用法示例小结

时间:2021-05-20

FreeMarker 是一个采用 Java 开发的模版引擎,是一个基于模版生成文本的通用工具。 它被设计用来生成 HTML Web 页面,特别是基于 MVC 模式的应用程序。虽然使用FreeMarker需要具有一些编程的能力,但通常由 Java 程序准备要显示的数据,由 FreeMarker 生成页面,并通过模板显示准备的数据。
http://freemarker.org/

public void process(String template, Map<String, ?> data) throws Exception { Configuration cfg = new Configuration(); cfg.setDirectoryForTemplateLoading(new File("ftl")); cfg.setObjectWrapper(new DefaultObjectWrapper()); //设置字符集 cfg.setDefaultEncoding("UTF-8"); //设置尖括号语法和方括号语法,默认是自动检测语法 // 自动 AUTO_DETECT_TAG_SYNTAX // 尖括号 ANGLE_BRACKET_TAG_SYNTAX // 方括号 SQUARE_BRACKET_TAG_SYNTAX cfg.setTagSyntax(Configuration.AUTO_DETECT_TAG_SYNTAX); Writer out = new OutputStreamWriter(new FileOutputStream(FILE_DIR + template + ".txt"),"UTF-8"); Template temp = cfg.getTemplate(template); temp.process(data, out); out.flush(); }

0、使用freemarker制作HelloWord web页面
新建一个WEB工程,并导入freemarker.jar,在WEB-INF下新建文件夹templates用于存放模版文件,在templates下新建test.ftl,这是示例模版文件。内容就是HTML内容,里面带有一个标记符,用于将来进行变量替换,内容如下:

<html> <head> <title>freemarker测试</title> </head> <body> <h1>${message},${name}</h1> </body> </html>


新建一个Servlet,用于请求设置变量,并处理模版的输出:

package com.test.servlet; import java.io.IOException; import java.io.Writer; import java.util.HashMap; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; @SuppressWarnings("serial") public class HelloFreeMarkerServlet extends HttpServlet { // 负责管理FreeMarker模板的Configuration实例 private Configuration cfg = null; public void init() throws ServletException { // 创建一个FreeMarker实例 cfg = new Configuration(); // 指定FreeMarker模板文件的位置 cfg.setServletContextForTemplateLoading(getServletContext(), "/WEB-INF/templates"); } @SuppressWarnings("unchecked") public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 建立数据模型 Map root = new HashMap(); root.put("message", "hello world"); root.put("name", "java小强"); // 获取模板文件 Template t = cfg.getTemplate("test.ftl"); // 使用模板文件的Charset作为本页面的charset // 使用text/html MIME-type response.setContentType("text/html; charset=" + t.getEncoding()); Writer out = response.getWriter(); // 合并数据模型和模板,并将结果输出到out中 try { t.process(root, out); // 往模板里写数据 } catch (TemplateException e) { e.printStackTrace(); } } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void destroy() { super.destroy(); } }


注意要在你的web.xml中配置该Servlet:

<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http:///">


10、自定义指令Directive

public class SystemDateDirective implements TemplateDirectiveModel { public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException { Calendar cal = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); env.getOut().append(sdf.format(cal.getTime())); } } public class TextCutDirective implements TemplateDirectiveModel { public static final String PARAM_S = "s"; public static final String PARAM_LEN = "len"; public static final String PARAM_APPEND = "append"; @SuppressWarnings("unchecked") public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException { String s = getString(PARAM_S, params); Integer len = getInt(PARAM_LEN, params); String append = getString(PARAM_APPEND, params); if (s != null) { Writer out = env.getOut(); if (len != null) { out.append(textCut(s, len, append)); } else { out.append(s); } } }


....

Map<String, Object> t10root = new HashMap<String, Object>(); t10root.put("systemdate", new SystemDateDirective()); t10root.put("text_cut", new TextCutDirective());

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章