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://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"> <servlet> <servlet-name>hello</servlet-name> <servlet-class> com.test.servlet.HelloFreeMarkerServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
为了方便测试,访问工程直接跳转到Servlet,对主页index.jsp做一个简单修改:
<%@ page language=\"java\" import=\"java.util.*\" pageEncoding=\"UTF-8\"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+\"://\"+request.getServerName() +\":\"+request.getServerPort()+path+\"/\"; %> <html> <body> <% String mypath = \"hello\"; response.sendRedirect(basePath + mypath); %> </body> </html>
部署工程到Tomcat,启动并访问http://localhost:8080/f ,这里我建立的工程名称就是 f 。
1、计算式
<#-- 1、算术运算 -->[BR] ${3 + 4} <#-- 2、内建函数 -->[BR] ${\"rensanning\"?upper_case}
2、输出一个值
HashMap t2root = new HashMap<String, String>(); t2root.put(\"user\", \"RenSanNing\"); ${user}, Welcome!
3、输出一个列表
Map<String, Object> t3root = new HashMap<String, Object>(); List<Food> menu = new ArrayList<Food>(); menu.add(new Food(\"iText in Action\", 98)); menu.add(new Food(\"iBATIS in Action\", 118)); menu.add(new Food(\"Lucene in Action\", 69)); t3root.put(\"menu\", menu); <#list menu as food> ${food.name} ${food.price?string.currency} </#list>
4、逻辑判断(IF,SWITCH)
Map<String, Object> t4root = new HashMap<String, Object>(); t4root.put(\"x\", 2); t4root.put(\"y\", \"medium\");
<1>if, else, elseif: <#if x == 1> x is 1 <#elseif x == 2> x is 2 <#elseif x == 3> x is 3 <#elseif x == 4> x is 4 <#else> x is not 1 nor 2 nor 3 nor 4 </#if> <2>switch, case, default, break: <#switch y> <#case \"small\"> This will be processed if it is small <#break> <#case \"medium\"> This will be processed if it is medium <#break> <#case \"large\"> This will be processed if it is large <#break> <#default> This will be processed if it is neither </#switch> <3>list, break: <#assign seq = [\"winter\", \"spring\", \"summer\", \"autumn\"]> <#list seq as x> ${x_index + 1}. ${x}<#if x_has_next>,</#if> </#list>
5、自定义函数
<#function fact n> <#if n == 0> <#return 1 /> <#else> <#return fact(n - 1) * n /> </#if> </#function> <#list 0..10 as i> ${i}! => ${fact(i)} </#list>
6、定义变量
<#-- 1、本地变量 -->[BR] <#function partg n lst> <#local ans = []> <#list lst as x> <#if (x >= n)> <#local ans = ans + [x]> </#if> </#list> <#return ans> </#function> <#assign ls = [10, 2, 4, 5, 8, 1, 3]> <#list partg(4, ls) as x>${x} </#list> <#-- 2、变量域测试 -->[BR] <#macro test> 03. ${x} <#global x = \"global2\"> 04. ${x} <#assign x = \"assign2\"> 05. ${x} <#local x = \"local1\"> 06. ${x} <#list [\"循环1\"] as x> 07. ${x} <#local x = \"local2\"> 08. ${x} <#assign x = \"assign3\"> 09. ${x} </#list> 10. ${x} </#macro> <#global x = \"global1\" /> 01. ${x} <#assign x = \"assign1\" /> 02. ${x} <@test /> 11. ${x}
7、定义宏macro
<#-- 1、无参数 -->[BR] <#macro greet> Welcome! </#macro> <@greet /> <#-- 2、有参数 -->[BR] <#macro greet user> ${user}, Welcome! </#macro> <@greet user=\"RenSanNing\"/> <#-- 3、有多个参数 -->[BR] <#macro table cols rows> <table> <#list 1..rows as row> <tr> <#list 1..cols as col> <td>${row}, ${col}</td> </#list> </tr> </#list> </table> </#macro> <@table cols=3 rows=2 /> <#-- 4、中间跳出 -->[BR] <#macro out> 显示文字 <#return> 不显示文字 </#macro> <@out /> <#-- 5、嵌套 -->[BR] <#macro lprint lst> <#list lst as item> ・${item}<#nested item /> </#list> </#macro> <@lprint 1..3; x>^2 = ${x * x}</@lprint> <@lprint 1..3; x>^3 = ${x * x * x}</@lprint> <@lprint [\"Let\'s go\", \"to the\", \"land of Medetai\"] />
8、include
<#include \"T108include.ftl\"> ${url} <@greet name=\"rensanning\" />
<#macro greet name> ${name}, Welcome! </#macro> <#assign url=\"http://www.baidu.com/\">
9、名字空间
<#import \"T109include.ftl\" as my> <#assign url=\"http://www.google.com/\"> ${my.url} <@my.greet name=\"rensanning\" /> ${url}
T109include.ftl
<#macro greet name> ${name}, Welcome! </#macro> <#assign url=\"http://www.baidu.com/\">
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());
本文地址:https://www.stayed.cn/item/1379
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我