用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(), "/");
用freemarker生产静态页面的更多相关文章
- 使用freemarker生成静态页面
一 说明 需要在spring mvc项目中加入下列包: <dependency> <groupId>org.freemarker</groupId> <art ...
- freeMarker生成静态页面
项目结构图 footer.ftl des==>${f.des}<br/> <a href="http://www.baidu.com"> 百度 < ...
- 使用Freemarker 实现JSP页面的静态化
使用Freemarker 静态化网页 一.原理 Freemarker 生成静态页面,首先需要使用自己定义的模板页面,这个模板页面可以是最最普通的html,也可以是嵌套freemarker中的 取值表达 ...
- Freemarker生成HTML静态页面
这段时间的工作是做一个网址导航的项目,面向用户的就是一个首页,于是就想到了使用freemarker这个模板引擎来对首页静态化. 之前是用jsp实现,为了避免用户每次打开页面都查询一次数据库,所以使用了 ...
- java使用freemarker生成静态html页面
1. 模板文件static.html <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" " ...
- JavaWeb页面静态化之使用freemarker模板生成一个html静态页面
题外话: 页面静态化(展示数据从JSP页面变成HTML页面)实现方式-->模板技术 从本质上来讲,模板技术是一个占位符动态替换技术.一个完整的模板技术需要四个元素:①模板语言(使 ...
- [freemarker篇]02.生成HTML的静态页面
昨天完成了一部分的今天在上次的基础上,完成完成生成HTML静态页面的操作,中间会涉及一点标签的简单使用.今天的代码有一丢丢的对付的感觉!抱歉了,直接就上代码吧!求原谅! 项目结构目录如下: 第一步,新 ...
- Freemarker生成静态代码实例
1.static.html <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http ...
- 经FreeMarkerclasspath加载方式生成静态页面
package htmlskin; import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundExc ...
随机推荐
- 边工作边刷题:70天一遍leetcode: day 86-2
Best Meeting Point 要点: 题本身不难理解,manhattan distance.follow up就变成weighted了(因为一个地方可以有多个住户) 注意input是grid的 ...
- 第8课 goto 和 void 分析
1. 遭人遗弃的goto (1)高手潜规则:禁用goto (2)项目经验:程序质量与goto出现的次数成反比 (3)最后的判决:将goto打入冷宫(1)循环语句的基本工作方式 [实例分析]goto副作 ...
- css中position属性(absolute|relative|static|fixed)概述及应用
position属性的相关定义: static:无特殊定位,对象遵循正常文档流; relative:对象遵循正常文档流; absolute:对象脱离正常文档流 fixed:对象脱离正常文档流 我们先来 ...
- PNG文件
png格式主要由六大块组成:文件头.IHDR块.PLTE块.tRNS块.IDAT块.文件尾文件头一般是 8950 4E47 0D0A 1A0A而本题提示中的IHDR块是png中用来描述图片的基本信息, ...
- android应用中去掉标题栏的方法
现在我坚定的认为写技术博客对自己有很大的帮助,写博客给自己一个学而思的机会. 在Android中去掉标题栏有三种方法,它们也有各自的特点. 1.在代码里实现 this.requestWindowFea ...
- Android Activity的生命周期
一.为什么要了解Activity的生命周期 activity is directly affected by its association withother activities, its tas ...
- 实现Maya FEM节点
准备实现FEM节点. 发现一种让自定义的Locator以及它的变换节点自动命名的方法.代码如下: void FEMSimulationNode::postConstructor() { MFnDepe ...
- 封装WCF客户端调用
在之前的博客中,我记录过如何利用SvcUtil.exe工具生成客户端的代理文件,然后调用的情形. 今天我要讲解的是利用代码直接对服务端进行调用.好处在于,一是不会生成那么大的引用文件,其次是可以方便控 ...
- Linq To Entities 及其相关(进阶)
上篇我们讲解了Linq To Entities的一些基本操作,这篇我们主要是讲解一些比较高级的东西:存储过程查询,SQL语句查询以及表达式树. 存储过程 首先来讲解存储过程查询. //Query a ...
- Java从0开始学——字符串
#,java中的字符串是不可变的: #,比较两个字符串是不是相等,不能用==,因为那只能确认他们是否指向了同一个字符串对象: #,空串和null是不同的: #,代码点和代码单元 #,代码点表示 ...