FreeMarker概述
- FreeMarker是一個(gè)模板引擎,一個(gè)基于模板生成文本輸出的通用工具,使用純Java編寫(xiě)
- Template + data model = output
-
Hello world
- FreeMarkerTest.java
import java.io.StringWriter;import java.util.HashMap;import java.util.Locale;
import freemarker.template.Configuration;import freemarker.template.Template;
publicclass FreeMarkerTest {
publicstaticvoid main(String[] args){
FreeMarkerTest test = new FreeMarkerTest();
test.sayHello("Hermit");
}
publicvoid sayHello(String name){
Configuration freemarkerCfg = new Configuration();
freemarkerCfg.setClassForTemplateLoading(this.getClass(), "/");
freemarkerCfg.setEncoding(Locale.getDefault(), "UTF-8");
Template template;
Locale.setDefault(Locale.ENGLISH);
try{
template = freemarkerCfg.getTemplate("Hello.ftl");
template.setEncoding("UTF-8");
HashMap root = newHashMap();
root.put("user", name);
StringWriter writer = newStringWriter();
template.process(root, writer);
System.out.println(writer.toString());
}catch(Exception e){
e.printStackTrace();
}}
}
Hello ${user}!
Hello Hermit!
空值的處理
在我們的程序中難免會(huì)碰到值為空的時(shí)候,如果用一個(gè)空值直接去替換模板中的標(biāo)記,freemarker會(huì)毫不猶豫的拋出異常,并把錯(cuò)誤信息直接寫(xiě)到輸出結(jié)果里。為了對(duì)付這種情況我們有兩種寫(xiě)法
Hello ${user!}!
Hello ${user?if_exists}
Hello ${user!'your name'}!
Hello ${user?default('your name')}
test.sayHello(null);
Hello !
Hello your name!
Hello
Hello your name
freemarker國(guó)際化模板
freemarker支持多語(yǔ)言國(guó)際化,只要把模板名稱按照java資源文件的寫(xiě)法就可以了,也就是name_語(yǔ)言_國(guó)家地區(qū).ftl 如果找不到對(duì)應(yīng)的語(yǔ)言,就會(huì)用默認(rèn)語(yǔ)言的模板。
import java.io.StringWriter;import java.util.HashMap;import java.util.Locale;
import freemarker.template.Configuration;import freemarker.template.Template;
publicclass FreeMarkerTest {
publicstaticvoid main(String[] args){
FreeMarkerTest test = new FreeMarkerTest();
test.sayHello("hermit",Locale.CHINA);
test.sayHello("hermit",Locale.ENGLISH);
}
publicvoid sayHello(String name,Locale locale){
Configuration freemarkerCfg = new Configuration();
freemarkerCfg.setClassForTemplateLoading(this.getClass(), "/");
freemarkerCfg.setEncoding(Locale.getDefault(), "UTF-8");
Template template;
Locale.setDefault(Locale.ENGLISH);
try{
template = freemarkerCfg.getTemplate("Hello.ftl",locale);
template.setEncoding("UTF-8");
HashMap root = newHashMap();
root.put("user", name);
StringWriter writer = newStringWriter();
template.process(root, writer);
System.out.println(writer.toString());
}catch(Exception e){
e.printStackTrace();
}
}
}
- 默認(rèn)語(yǔ)言模版:Hello.ftl
Hello ${user!}!
中文模版:Hello_zh_CN.ftl
你好 ${user!}!
輸出
你好 hermit!
Hello hermit!
在struts項(xiàng)目中使用freemarker
- 1、引入freemarker.jar
- 2、web.xml加入
<!-- FreeMarker view servlet (to replace JSP) -->
<servlet><servlet-name>freemarker</servlet-name><servlet-class>
freemarker.ext.servlet.FreemarkerServlet
</servlet-class>
<!-- FreemarkerServlet settings: -->
<init-param>
<param-name>TemplatePath</param-name>
<param-value>/</param-value>
</init-param>
<init-param>
<param-name>NoCache</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>ContentType</param-name>
<param-value>text/html</param-value>
</init-param>
<!-- FreeMarker settings: --><init-param><param-name>template_update_delay</param-name><param-value>0</param-value>
<!-- 0 is for development only! Use higher value otherwise. -->
</init-param><init-param><param-name>default_encoding</param-name>
<param-value>utf-8</param-value></init-param>
<init-param><param-name>locale</param-name><param-value>en_US</param-value></init-param>
<init-param><param-name>number_format</param-name><param-value>0.##########</param-value></init-param>
<load-on-startup>1</load-on-startup></servlet>
<servlet-mapping><servlet-name>freemarker</servlet-name><url-pattern>*.ftl</url-pattern></servlet-mapping>
- 3、一個(gè)示例頁(yè)面
<html><head><title>Say Hello</title><METAHTTP-EQUIV="Content-Type"CONTENT="text/html; charset=utf-8"></head><body><h1>Hello ${user}!</h1></body></html>
我們完全可以用freemarker的模板取代JSP頁(yè)面。用freemarker的模板看起更簡(jiǎn)潔,可讀性更強(qiáng)。比如現(xiàn)在struts2的UI標(biāo)簽就是用freemarker做的。
freemarker用struts標(biāo)簽做國(guó)際化
<#assign html =JspTaglibs["/WEB-INF/struts-html.tld"]><#assign bean =JspTaglibs["/WEB-INF/struts-bean.tld"]><#assign logic =JspTaglibs["/WEB-INF/struts-logic.tld"]><html><head><title> FreeMarker Struts Example </title><metahttp-equiv ="Content-type"content ="text/html; charset=utf-8"></ head ><body><@bean.message key ="hello" arg0 ="hermit"/></body></html>
主要是引入標(biāo)簽的時(shí)候要這樣寫(xiě):
<#assign html =JspTaglibs["/WEB-INF/struts-html.tld"]>
freemarker直接使用資源文件進(jìn)行多語(yǔ)言國(guó)際化
import java.io.StringWriter;import java.util.HashMap;import java.util.Locale;import java.util.ResourceBundle;
import freemarker.ext.beans.BeansWrapper;import freemarker.ext.beans.ResourceBundleModel;import freemarker.template.Configuration;import freemarker.template.Template;
publicclass FreeMarkerTest {
publicstaticvoid main(String[] args){
FreeMarkerTest test = new FreeMarkerTest();
test.sayHello("hermit",Locale.CHINA);
test.sayHello("hermit",Locale.ENGLISH);
}
publicvoid sayHello(String name,Locale locale){
Configuration freemarkerCfg = new Configuration();
freemarkerCfg.setClassForTemplateLoading(this.getClass(), "/");
freemarkerCfg.setEncoding(Locale.getDefault(), "UTF-8");
Template template;
Locale.setDefault(Locale.ENGLISH);
try{
template = freemarkerCfg.getTemplate("Hello.ftl");
template.setEncoding("UTF-8");
HashMap root = newHashMap();
root.put("user", name);
ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle("ApplicationResources",locale);
ResourceBundleModel rsbm = new ResourceBundleModel(RESOURCE_BUNDLE,new BeansWrapper());
root.put("bundle", rsbm);
StringWriter writer = newStringWriter();
template.process(root, writer);
System.out.println(writer.toString());
}catch(Exception e){
e.printStackTrace();
}}
}
模板
${bundle("hello","hermit")}
默認(rèn)語(yǔ)言資源文件
hello=Hello {0}\!
中文資源文件
hello=你好 {0}\!
你好 hermit!
Hello hermit!
關(guān)鍵的地方就是用ResourceBundleModel把ResourceBundle轉(zhuǎn)換一下。
常用的2種加載模板的方式
- 普通java類根據(jù)當(dāng)前class上下文環(huán)境加載模板
cfg.setClassForTemplateLoading(this.getClass(), "/");
- 在web項(xiàng)目中根據(jù)servlet上下文環(huán)境加載模板
cfg.setServletContextForTemplateLoading(this.getServlet().getServletContext(), "/");
posted on 2008-05-13 18:40
xyz 閱讀(845)
評(píng)論(0) 編輯 收藏 所屬分類:
網(wǎng)絡(luò)文摘