Terry.Li-彬

          虛其心,可解天下之問;專其心,可治天下之學(xué);靜其心,可悟天下之理;恒其心,可成天下之業(yè)。

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            143 隨筆 :: 344 文章 :: 130 評論 :: 0 Trackbacks

          FreeMarker概述

          • FreeMarker是一個(gè)模板引擎,一個(gè)基于模板生成文本輸出的通用工具,使用純Java編寫
          • Template + data model = output
          • 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!


          空值的處理

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

          • 模板
           
          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 如果找不到對應(yīng)的語言,就會(huì)用默認(rèn)語言的模板。

          • 程序
           
          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();
          }
          }

            
          }
           
          • 默認(rèn)語言模版:Hello.ftl
          Hello ${user!}! 
          中文模版:Hello_zh_CN.ftl
          你好 ${user!}!

          輸出
          你好 hermit!
          Hello hermit!
           

          在struts項(xiàng)目中使用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、一個(gè)示例頁面
           
          <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的模板看起更簡潔,可讀性更強(qiáng)。比如現(xiàn)在struts2的UI標(biāo)簽就是用freemarker做的。

          freemarker用struts標(biāo)簽做國際化

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

          主要是引入標(biāo)簽的時(shí)候要這樣寫:

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

          freemarker直接使用資源文件進(jìn)行多語言國際化

          • 程序
          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")} 

          默認(rèn)語言資源文件
          hello=Hello {0}\! 

          中文資源文件

          hello=你好 {0}\!
          • 輸出
          你好 hermit!
          Hello hermit!

          關(guān)鍵的地方就是用ResourceBundleModel把ResourceBundle轉(zhuǎn)換一下。

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

          • 普通java類根據(jù)當(dāng)前class上下文環(huán)境加載模板
          cfg.setClassForTemplateLoading(this.getClass(), "/");
          • 在web項(xiàng)目中根據(jù)servlet上下文環(huán)境加載模板
          cfg.setServletContextForTemplateLoading(this.getServlet().getServletContext(), "/");
          posted on 2009-01-28 23:17 禮物 閱讀(1764) 評論(0)  編輯  收藏 所屬分類: 模板
          主站蜘蛛池模板: 额敏县| 镶黄旗| 望江县| 太康县| 资中县| 孙吴县| 荆州市| 天峻县| 南通市| 南乐县| 额敏县| 苏尼特右旗| 宣化县| 临朐县| 大悟县| 冷水江市| 信宜市| 来宾市| 潮州市| 当阳市| 灵宝市| 富源县| 漳州市| 定兴县| 长治县| 永昌县| 夹江县| 石楼县| 高台县| 建宁县| 岚皋县| 华安县| 三穗县| 太原市| 南溪县| 三都| 永吉县| 巨野县| 嵩明县| 海原县| 象山县|