<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麻豆| 国产成人亚洲综合网站不卡| 久艹视频在线免费观看| 亚洲成A∨人片在线观看不卡 | 亚洲日本天堂在线| 久久久高清免费视频| 亚洲熟妇无码AV不卡在线播放| 亚洲第一区二区快射影院| 国产免费不卡v片在线观看| 久久精品国产亚洲AV久 | 成在线人免费无码高潮喷水| 在线观看亚洲精品国产| a免费毛片在线播放| 亚洲一区二区三区无码中文字幕| 亚洲精品中文字幕乱码| 男男AV纯肉无码免费播放无码 | 国产一级淫片a免费播放口之| 国产精品亚洲片在线观看不卡| 在线亚洲高清揄拍自拍一品区| 日批视频网址免费观看| 亚洲av永久无码精品国产精品| 亚洲国产美女精品久久久| 国产在线观看免费不卡| 一区二区三区免费视频播放器| 色吊丝最新永久免费观看网站 | 最新久久免费视频| 亚洲视频网站在线观看| 国产成人免费爽爽爽视频| 美女黄色毛片免费看| 亚洲国产精品无码AAA片| 最近中文字幕免费2019| 蜜桃传媒一区二区亚洲AV| 在线亚洲97se亚洲综合在线| 18禁美女裸体免费网站| 在线观看亚洲免费| 亚洲日本va午夜中文字幕一区| 免费人成在线观看播放a| 日本高清在线免费| 精品在线视频免费| 666精品国产精品亚洲|