用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(), "/");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值