FreeMarker2.3
FreeMarker笔记 收藏
FreeMarker2.3
一 介绍... 2
二 HelloWorld. 3
1 java应用程序中... 3
1.1 aa.ftl---------模板文件... 3
1.2 FreeMarkerTest调用模板及使用方法... 3
1.3 FreeMarkerTest.java----------调用freeMarker的测试程序... 4
2 web应用程序... 7
1.1 web与java应用程序的区别在于: 7
1.2 完整代码... 7
3 读XML数据源----- java应用程序中... 9
三 语法... 10
1 常用... 10
1.1 ${ varName!" value"}---------指定缺省值... 10
1.2 <#-- aaaaaaaa --> 注释... 10
1.3 条件语句 <#if condition><#elseif condition><#else></#if>. 10
1.4 变量定义 <#assign varName=value>. 11
1.5 <#local var = value> 在 macro 或者 function 中定义局部变量并初始化... 11
1.6 <#global var = value > 定义全局变量并初始化... 11
1.7 序列 [item1,item2,item3,…] 11
1.8 list-----遍历指令... 11
1.9 条件分支 <#switch 条件> <#case "值n" > <#default></#switch>. 12
1.10 key:value, key2:value2 ...} 直接定义一个hash表... 12
1.11 macro-----宏... 12
1.12 <#nested>-----FreeMarker个性十足的指令... 13
1.13 function-------函数... 14
1.14 内部函数调用---------由问号、函数名与实参构成... 14
四 常用函数... 15
1 字符串... 15
1.1 取子串--substirng. 15
1.2 第一个字母大写-------cap_first 15
1.3 第一个字母不大写-----uncap_first 15
1.4 以空格间格的字符串,第一个字母大写--------capitalize. 15
1.5 日期、时间函数---------date, time, datetime. 15
1.6 html-----把字符串转成html传输的格式... 16
1.7 index_of--------求字串在原串中的位置... 16
1.8 j_string--------把空格替换成左斜线... 16
1.9 js_string--------把左斜线换成 空格... 16
1.10 其他字符串函数... 16
2 数字... 16
1.1 带常见单位的数字... 16
1.2 格式化数字... 16
1.3 其他函数round, floor, ceiling. 17
3 日期... 17
一 介绍
FreeMarker是一个文本文件模板。
文本文件中,设定特定字符串,FreeMarker会把用户指定的数据,按规定替代这些字符串,从而产生新的文件,或流数据。
例:有文本文件-------a.ftl 如下:
你好!${userName}
用户把“张三”数据放入FreeMarker中,FreeMarker将会产生新的文件,其内容会变成:
你好!张三!
作用:
非常 精致强悍,可生成网页、生成java文件、.net文件,总之任何格式的文本文件。
当然,模板文件要按这些格式书写!
说明:
(1) FreeMarker的数据源:
--------来自xml文件,或
-------- 用Map作为基本的存储单元;且必须是树结构。
(2) 官方网址
FreeMarker是开源的;官方网址http://freemarker.org/
二 HelloWorld
1 java应用程序中
1.1 aa.ftl---------模板文件
<html>
<head>
<title>Welcome!</title>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
</head>
<body>
<h1>Welcome ${user}!</h1>
</body>
</html>
说明:
${user}-----是freemarker指令。意思用 user所存数据对它进行替换。
user所存数据-----放在数据源中。
Freemarker----是模板,程序,数据相分离。
1.2 FreeMarkerTest调用模板及使用方法
下面是加载模板文件
Configuration cfg = new Configuration();
cfg.setEncoding(Locale.getDefault(),"UTF-8");
// 指定模板文件的数据源,这里是一个文件目录。
cfg.setDirectoryForTemplateLoading( new File("d:\\aaa") );
cfg.setObjectWrapper(new DefaultObjectWrapper()); //这条语句可省略
//加载文件,模板文件,输出文件都要保证用UTF-8-----解决乱码
Template template = cfg.getTemplate("aa.ftl");//加载模板文件
下面是使用方法
template.setEncoding("UTF-8");
File htmlFile = new File("t.html");
Writer out = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(htmlFile), "UTF-8"));//输出文件
HashMap propMap = new HashMap();//定义Map树结构数据源
propMap.put("user", "张三");
template.process(propMap, out);
注意:加载文件,模板文件,输出文件都要保证用UTF-8-----解决乱码
Configuration. setEncoding//要在Configuration对象后就要加入
template.setEncoding("UTF-8")
OutputStreamWriter(new FileOutputStream(htmlFile), "UTF-8")
1.3 FreeMarkerTest.java----------调用freeMarker的测试程序
package jap1;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Locale;
import freemarker.template.Configuration;
import freemarker.template.Template;
public class FreeMarkerTest {
public static void main(String[] args) throws IOException {
FreeMarkerTest test = new FreeMarkerTest();
test.getFile();
test.getFile(Locale.CHINA);
}
private String basePath;
public String getBasePath() {
return basePath;
}
public void setBasePath(String basePath) {
this.basePath = basePath;
}
public FreeMarkerTest(){
basePath="";
}
public FreeMarkerTest(String basePath ){
this.basePath=basePath;
}
public void getFile() throws IOException {
Configuration cfg = new Configuration();//加载FreeMarker配置文件
if (basePath.equals("")){
//设本类运行时所在的路径为路劲
cfg.setClassForTemplateLoading(this.getClass(),"/");
} else{
//设用户指定路径为基路径
cfg.setDirectoryForTemplateLoading(new File(basePath));
}
cfg.setEncoding(Locale.getDefault(),"UTF-8");
Template template;
try {
template = cfg.getTemplate("aa.ftl");
template.setEncoding("UTF-8");
File htmlFile = new File("t.html");
Writer out = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(htmlFile), "UTF-8"));
HashMap propMap = new HashMap();
propMap.put("user", "张三");
template.process(propMap, out);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
//FreeMarker国际化支持,
public void getFile(Locale loc) {
Configuration cfg = new Configuration();
cfg.setClassForTemplateLoading(this.getClass(),"/");
cfg.setEncoding(Locale.getDefault(),"UTF-8");
Template template;
try {
template = cfg.getTemplate("aa.ftl",loc);
template.setEncoding("UTF-8");
String fileName="t_"+loc.getLanguage()+"_"
+loc.getCountry()+".html";
File htmlFile = new File(fileName);
Writer out = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(htmlFile), "UTF-8"));
HashMap propMap = new HashMap();
propMap.put("user", "张三");
template.process(propMap, out);
out.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
}
2 web应用程序
1.1 web与java应用程序的区别在于:
(1) 配置类的路径指定:
有两种方式: (在web程序中)
A 模板文件在web中。针对servlet.。
下例的表示模板文件位于WEB-INF的子文件a中。
configuration.setServletContextForTemplateLoading(
getServletContext(), "WEB-INF/a");
B 模板文件在class中。
下像表示模板文件在src\java下。注:在netbeans6.5中调试。
configuration.setObjectWrapper(new DefaultObjectWrapper());
configuration.setTemplateLoader(new ClassTemplateLoader(
NewServlet1.class, "/"));
(2) 文件输出
web文件用response对象输出文件。或用像StringWriter之类的对象输出 。
1.2 完整代码
(1) 模板文件---------test.ftl-----------位于web /web-inf/a
<body>
sdad描述信息是 : ${message}
</body>
(2) NewServlet1.java---------调用FreeMarker把模板输出到浏览器中。
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import java.util.Locale;
import javax.servlet.http.HttpServlet;
public class NewServlet1 extends HttpServlet {
private Configuration configuration;
public NewServlet1() {
super();
}
@Override
public void destroy() {
configuration = null;
}
@Override
public void init() throws ServletException {
configuration = new Configuration();
configuration.setEncoding(Locale.getDefault(),"UTF-8");
configuration.setServletContextForTemplateLoading(
getServletContext(), "WEB-INF/a");
// configuration.setObjectWrapper(new DefaultObjectWrapper());
// configuration.setTemplateLoader(new ClassTemplateLoader(
// NewServlet1.class, "/"));
}
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
Map root = new HashMap();
root.put("message", "Hello World!帅哥,靓女!");
Template t = configuration.getTemplate("test.ftl");
Writer out = response.getWriter();
try {
t.process(root, out);
StringWriter stringWriter = new StringWriter();
t.process(root, stringWriter);
System.out.println(stringWriter.toString());
} catch (TemplateException e) {
throw new ServletException(
"Error while processing FreeMarker template", e);
}
}
}
注意:
1 configuration.setEncoding(Locale.getDefault(),"UTF-8");
要紧随configuration生成设置;否则,模板中的中文会成乱码。
2 response.setContentType("text/html;charset=UTF-8");
这句不设置;输进模板中的数据,将有可能是乱码。
3 读XML数据源----- java应用程序中
FreeMark2.3支持 XML;在程序中可直接把xml文件作为数据模型,按用户模板文件的要求,输出相应的文件(或流)给用户。
与前面相比,关键有:
1 freemarker.ext.dom.NodeModel.parse这个方法将把xml文件处理成map树状结构的模型;该方法支持以File对象,读xml;也提供了一个流适配器,从面能用InsputStream流对象读xml文件。
2 Map root = new HashMap();
root.put("doc", freemarker.ext.dom.NodeModel.parse( ins));
这里要注意:经处理后:”doc”,在数据模型中是根;而xml文件的根是它的子节点;
在读数据时,要从doc开始,否则出错。当然,”doc”也可改成其他名字。
3 增加了一个recurse指令。
FreeMarker这样处理的xml结构的数据模型的:
(1) 按层定义宏;宏名---就是节点名。(这是强行约定的)
(2) recurse----将循环调用处理子节点的宏
下面是在java应用程序中,应用freemarker的示例:
(1) ddd.xml
注意:ddd.xml位于classpath下的jap1文件夹下,与下面的 FMtest.java的位置相同。在netbean开发环境中,位于 src\java\jsp1下。
<?xml version="1.0" encoding="UTF-8"?>
<root>
<user>
<name>张三1111</name>
</user>
<user>
<name>