隨筆 - 119  文章 - 3173  trackbacks - 0
          <2007年5月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          交友莫獨酒,茅臺西鳳游。
          口干古井貢,心徜洋河流。
          稱多情杜康,趟無量雙溝。
          贊中華巍巍,無此不銷愁。

          常用鏈接

          留言簿(68)

          隨筆分類(136)

          隨筆檔案(122)

          最新隨筆

          搜索

          •  

          積分與排名

          • 積分 - 527101
          • 排名 - 93

          最新評論

          FreeMarker概述

          • FreeMarker是一個模板引擎,一個基于模板生成文本輸出的通用工具,使用純Java編寫
          • Template + data model = output
          • overview.png

          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.ftl
          ?
          ?
          Hello ${user}!
          ?
          ?
          • 輸出

          Hello Hermit!


          空值的處理

          在我們的程序中難免會碰到值為空的時候,如果用一個空值直接去替換模板中的標記,freemarker會毫不猶豫的拋出異常,并把錯誤信息直接寫到輸出結果里。為了對付這種情況我們有兩種寫法

          • 模板
          ?
          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國際化模板

          freemarker支持多語言國際化,只要把模板名稱按照java資源文件的寫法就可以了,也就是name_語言_國家地區(qū).ftl 如果找不到對應的語言,就會用默認語言的模板。

          • 程序
          ?
          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();
          		}}
          ?
          ?
          ?
          }
          ?
          • 默認語言模版:Hello.ftl
          ?
          Hello ${user!}!
          ?


          • 中文模版:Hello_zh_CN.ftl
          ?
          你好 ${user!}!
          ?
          • 輸出
          ?
          你好 hermit!
          Hello hermit!
          ?

          在struts項目中使用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、一個示例頁面
          ?
          <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頁面。用freemarker的模板看起更簡潔,可讀性更強。比如現在struts2的UI標簽就是用freemarker做的。

          freemarker用struts標簽做國際化

          • 示例模板
          ?
          <#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> 
          ?

          主要是引入標簽的時候要這樣寫:

          ?
          <#assign  html =JspTaglibs["/WEB-INF/struts-html.tld"]> 
          ?

          freemarker直接使用資源文件進行多語言國際化

          • 程序
          ?
          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")}
          ?
          • 默認語言資源文件
          ?
          hello=Hello {0}\!
          ?
          • 中文資源文件
          ?
          hello=你好 {0}\!
          ?
          • 輸出
          ?
          你好 hermit!
          Hello hermit!
          ?

          關鍵的地方就是用ResourceBundleModel把ResourceBundle轉換一下。

          常用的2種加載模板的方式

          • 普通java類根據當前class上下文環(huán)境加載模板
          ?
          cfg.setClassForTemplateLoading(this.getClass(), "/");
          ?
          • 在web項目中根據servlet上下文環(huán)境加載模板
          ?
          cfg.setServletContextForTemplateLoading(this.getServlet().getServletContext(), "/");
          ?
          ?
          posted on 2007-05-29 17:03 交口稱贊 閱讀(5647) 評論(0)  編輯  收藏 所屬分類: freemarker
          主站蜘蛛池模板: 武鸣县| 济源市| 南昌市| 南川市| 萍乡市| 云和县| 赫章县| 侯马市| 凤台县| 五河县| 镇赉县| 遂川县| 穆棱市| 五寨县| 定州市| 玛纳斯县| 元谋县| 东乡族自治县| 苏尼特左旗| 连平县| 江永县| 清流县| 开平市| 吉林省| 紫阳县| 焦作市| 石狮市| 毕节市| 扬中市| 攀枝花市| 正镶白旗| 长沙市| 伊宁县| 河北省| 左云县| 连云港市| 桐柏县| 商河县| 新干县| 闸北区| 巴林左旗|