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生产静态页面的更多相关文章

  1. 使用freemarker生成静态页面

    一 说明 需要在spring mvc项目中加入下列包: <dependency> <groupId>org.freemarker</groupId> <art ...

  2. freeMarker生成静态页面

    项目结构图 footer.ftl des==>${f.des}<br/> <a href="http://www.baidu.com"> 百度 < ...

  3. 使用Freemarker 实现JSP页面的静态化

    使用Freemarker 静态化网页 一.原理 Freemarker 生成静态页面,首先需要使用自己定义的模板页面,这个模板页面可以是最最普通的html,也可以是嵌套freemarker中的 取值表达 ...

  4. Freemarker生成HTML静态页面

    这段时间的工作是做一个网址导航的项目,面向用户的就是一个首页,于是就想到了使用freemarker这个模板引擎来对首页静态化. 之前是用jsp实现,为了避免用户每次打开页面都查询一次数据库,所以使用了 ...

  5. java使用freemarker生成静态html页面

    1. 模板文件static.html <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" " ...

  6. JavaWeb页面静态化之使用freemarker模板生成一个html静态页面

    题外话:       页面静态化(展示数据从JSP页面变成HTML页面)实现方式-->模板技术   从本质上来讲,模板技术是一个占位符动态替换技术.一个完整的模板技术需要四个元素:①模板语言(使 ...

  7. [freemarker篇]02.生成HTML的静态页面

    昨天完成了一部分的今天在上次的基础上,完成完成生成HTML静态页面的操作,中间会涉及一点标签的简单使用.今天的代码有一丢丢的对付的感觉!抱歉了,直接就上代码吧!求原谅! 项目结构目录如下: 第一步,新 ...

  8. Freemarker生成静态代码实例

    1.static.html <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http ...

  9. 经FreeMarkerclasspath加载方式生成静态页面

    package htmlskin; import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundExc ...

随机推荐

  1. CSU 1081 集训队分组

    题意:有n个学生,比了一场比赛,但是榜单看不到了.现在告诉你m段信息,每段信息的内容是(a,b),表示a的排名比b的高.问你能不能根据这些信息得出这场比赛的前k名. 思路:用拓扑排序找出一组符合k个人 ...

  2. linux部署的java应用,浏览器访问时,报域名解析错误

    工作中,经常需要在Linux环境中部署Tomcat,配置java应用.在浏览器中访问应用时,却报域名解析错误,该怎么样解决呢? 解决方法:关闭防火墙 iptables -L -n     查看已添加的 ...

  3. java 20 - 4 IO流概述和一个简单例子解析

    IO流的分类:  流向: 输入流 读取数据  输出流 写出数据 数据类型:  字节流  字节输入流 读取数据 InputStream  字节输出流 写出数据 OutputStream  字符流  字符 ...

  4. 使用EXISTS语句注意点

    1.使用EXISTS语句,其目标列一般用“*”,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义. 2.使用EXISTS语句一定要注意上下两个表之间要建立联系. 例如,查询所有选修了1号 ...

  5. 【转】【UML】使用Visual Studio 2010 Team System中的架构师工具(设计与建模)

    Lab 1: 应用程序建模 实验目标 这个实验的目的是展示如何在Visual Studio 2010旗舰版中进行应用程序建模.团队中的架构师会通过建模确定应用程序是否满足客户的需求. 你可以创建不同级 ...

  6. 【MFC】WM_GETMINMAXINFO 设置无边框窗口最大花不遮挡任务栏

    LRESULT OnGetMinMaxInfo( UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/ ) { ...

  7. 【转】【WPF】WPF 登录窗口关闭时打开主窗口

    在WPF中设计登录窗口关闭时打开主窗口,自动生成的App.xaml不能满足要求, 1.把App.xaml的属性窗口中的生成操作设定为 无 2.添加Program类 static class Progr ...

  8. ASP.NET中进行消息处理(MSMQ) 二

    在我上一篇文章<ASP.NET中进行消息处理(MSMQ)一>里对MSMQ做了个通俗的介绍,最后以发送普通文本消息和复杂的对象消息为例介绍了消息队列的使用. 本文在此基础上继续介绍MSMQ的 ...

  9. 后盾网VIP美团网开发(基于HDPHP)(全套38课)

    教程简介 本教程由后盾网讲解,共40节,主要介绍了美团网的开发,从需求分析出发,对商铺的建立.购物流程的构建及订单处理等都做了详细的介绍,非常适合做电子商务开发的朋友和同学参考学习使用,完整教程可以在 ...

  10. 从0开始学Java——JSP&Servlet——HttpServletRequest相关的几个路径信息

    在HttpServletRequest中有几个获取路径的接口:getRequestURI/getContextPath/getServletPath/getPathInfo 这些接口互相之间有什么区别 ...