<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
    主站蜘蛛池模板: 国产麻豆一精品一AV一免费| 久久国产色AV免费看| 亚洲VA中文字幕无码毛片| 四虎免费影院ww4164h| 亚洲乱亚洲乱妇24p| 中文字幕亚洲不卡在线亚瑟| 1000部啪啪未满十八勿入免费| 亚洲A∨精品一区二区三区下载| 国产午夜亚洲精品理论片不卡| 最近免费中文字幕大全高清大全1 最近免费中文字幕mv在线电影 | 午夜亚洲国产理论秋霞| 在线免费观看a级片| 99久久免费国产精精品| 亚洲男人的天堂网站| 久久精品亚洲综合一品| 小小影视日本动漫观看免费| 一区二区在线免费观看| 老司机午夜性生免费福利| 亚洲欧洲精品在线| 久久亚洲国产精品123区| 成人毛片免费视频| 国产成人精品无码免费看| 免费的黄色网页在线免费观看| 亚洲精品午夜视频| 国产亚洲精AA在线观看SEE| 精品久久免费视频| 精品国产无限资源免费观看| 中文字幕免费在线观看动作大片| 亚洲中文字幕精品久久| 久久夜色精品国产亚洲AV动态图| 免费在线一级毛片| 四虎永久在线精品免费网址 | 麻豆国产VA免费精品高清在线 | 日韩精品视频免费观看| 亚洲免费二区三区| av永久免费网站在线观看| 黄色网址免费在线| 国产成人 亚洲欧洲| 亚洲日韩AV一区二区三区中文| 亚洲制服在线观看| 亚洲卡一卡2卡三卡4卡无卡三|