<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)

    最新隨筆

    搜索

    •  

    積分與排名

    • 積分 - 525163
    • 排名 - 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
    主站蜘蛛池模板: 久久久久亚洲国产AV麻豆| 国产美女亚洲精品久久久综合| 中文字幕亚洲综合久久| 日本一区二区三区在线视频观看免费 | 久久国产精品一区免费下载| 在线观看亚洲成人| 国产国产人免费人成成免视频| 日韩一区二区在线免费观看| 亚洲一级免费视频| 久久久久国产精品免费免费搜索| 亚洲av无码一区二区三区天堂古代 | 亚洲国产精品午夜电影| 日韩在线播放全免费| 亚洲美女色在线欧洲美女| 性xxxxx免费视频播放| 亚洲AV无码专区在线亚| 成年女人18级毛片毛片免费观看| 亚洲精品天堂无码中文字幕| 国产伦精品一区二区三区免费下载| 阿v免费在线观看| 中文字幕亚洲专区| 日韩视频在线观看免费| 亚洲免费人成视频观看| 日本黄页网站免费| 久久久免费观成人影院| 久久久久亚洲AV无码永不| 无码国产精品一区二区免费I6| 亚洲av无码一区二区三区人妖| 亚洲国产一成久久精品国产成人综合 | 亚洲自偷自拍另类12p| 无码区日韩特区永久免费系列| 亚洲成aⅴ人片久青草影院按摩| 亚洲精品动漫人成3d在线| 久久国产乱子精品免费女 | 国产精品亚洲五月天高清| 亚洲中文字幕在线观看| 国产精品成人免费福利| 日本高清不卡中文字幕免费 | 久久综合久久综合亚洲| 亚洲日韩涩涩成人午夜私人影院| 一级毛片在线免费看|