<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

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

    常用鏈接

    留言簿(68)

    隨筆分類(136)

    隨筆檔案(122)

    最新隨筆

    搜索

    •  

    積分與排名

    • 積分 - 525306
    • 排名 - 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_語言_國家地區.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上下文環境加載模板
    ?
    cfg.setClassForTemplateLoading(this.getClass(), "/");
    ?
    • 在web項目中根據servlet上下文環境加載模板
    ?
    cfg.setServletContextForTemplateLoading(this.getServlet().getServletContext(), "/");
    ?
    ?
    posted on 2007-05-29 17:03 交口稱贊 閱讀(5643) 評論(0)  編輯  收藏 所屬分類: freemarker
    主站蜘蛛池模板: 国产午夜亚洲精品不卡免下载| 国产亚洲精品看片在线观看| 国内精自视频品线六区免费| 免费看黄视频网站| 亚洲人成无码网WWW| 亚洲精品国产成人中文| 亚洲av无码专区青青草原| 成人免费乱码大片A毛片| 久久爰www免费人成| 免费高清在线爱做视频| 国产gv天堂亚洲国产gv刚刚碰| 亚洲国产精品张柏芝在线观看| 男人和女人高潮免费网站| 91九色老熟女免费资源站| 亚洲精品国产高清嫩草影院| 亚洲AV无码一区二区三区牛牛| a级成人毛片免费视频高清| 国产日产成人免费视频在线观看| 亚洲午夜久久久久妓女影院| 久久亚洲精品无码av| 亚洲国产精品毛片av不卡在线| 亚洲人成www在线播放| 日本成人免费在线| 亚洲一区动漫卡通在线播放| 中出五十路免费视频| 老司机亚洲精品影院| jizz18免费视频| 四虎永久成人免费| 亚洲人成网站999久久久综合| 国产成人免费午夜在线观看| 亚洲无码一区二区三区| 欧洲黑大粗无码免费| 亚洲第一网站免费视频| 日韩免费观看视频| 国产一级在线免费观看| 亚洲一卡2卡3卡4卡乱码 在线| 天天影院成人免费观看| 一级毛片免费视频网站| 亚洲性久久久影院| 免费h片在线观看网址最新| 阿v免费在线观看|