用freemarker生產靜態頁面

FreeMarker概述
•FreeMarker是一個模板引擎,一個基於模板生成文本輸出的通用工具,使用純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!

 


空值的處理
在我們的程序中難免會碰到值爲空的時候,如果用一個空值直接去替換模板中的標記,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(), "/");
本篇文章來源於 新技術天空 原文鏈接:http://www.ntsky.com/tech/java/opensource/template/2007-10-20/59e034abc198936c.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章