网上看了很多相关的资料,感觉乱乱的,现在整理一下,按照以下思路来学习,相信会轻松不少,转载资料已注明
一、先对Freemarker有个概念——摘自百度百科
1、FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。
2、工作原理
假设在一个应用系统中需要一个HTML页面如下:
1
2
3
4
5
6
7
8
9
10
|
<
html
>
<
head
>
<
title
>Welcome!</
title
>
</
head
>
<
body
>
<
h1
>Welcome Big Joe!</
h1
>
<
p
>Our latest product:
<
a
href
=
"products/greenmouse.html"
>green mouse</
a
>!
</
body
>
</
html
>
|
1
2
3
4
5
6
7
8
9
10
|
<
html
>
<
head
>
<
title
>Welcome!</
title
>
</
head
>
<
body
>
<
h1
>Welcome ${user}!</
h1
>
<
p
>Our latest product:
<
a
href
=
"${latestProduct.url}"
>${latestProduct.name}</
a
>!
</
body
>
</
html
>
|
首先需要到freemarker官方下载freemarker的jar包,导入到项目中,如:freemarker-2.3.19.jar
1、先建个freemarker的工具类,FreemarkerUtil.java
package com.ljq.fm; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.util.Map; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; public class FreemarkerUtil { public Template getTemplate(String name) { try { // 通过Freemaker的Configuration读取相应的ftl Configuration cfg = new Configuration(); // 设定去哪里读取相应的ftl模板文件 cfg.setClassForTemplateLoading(this.getClass(), "/ftl"); // 在模板文件目录中找到名称为name的文件 Template temp = cfg.getTemplate(name); return temp; } catch (IOException e) { e.printStackTrace(); } return null; } /** * 控制台输出 * * @param name * @param root */ public void print(String name, Map<String, Object> root) { try { // 通过Template可以将模板文件输出到相应的流 Template temp = this.getTemplate(name); temp.process(root, new PrintWriter(System.out)); } catch (TemplateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 输出HTML文件 * * @param name * @param root * @param outFile */ public void fprint(String name, Map<String, Object> root, String outFile) { FileWriter out = null; try { // 通过一个文件输出流,就可以写到相应的文件中,此处用的是绝对路径 out = new FileWriter(new File("E:/" + outFile)); Template temp = this.getTemplate(name); temp.process(root, out); } catch (IOException e) { e.printStackTrace(); } catch (TemplateException e) { e.printStackTrace(); } finally { try { if (out != null) out.close(); } catch (IOException e) { e.printStackTrace(); } } } }
2 、在src目录下建个ftl包,用于存放ftl模板文件,this.getClass() 就是根据当前类的路径获取模板文件位置(此处已做修改,去掉了两个重复的)
01.ftl
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>测试</title> </head> <body> <h1>你好${username}</h1> </body> </html>
02.ftl
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h1>${user.id}-----${user.name}-----${user.age}</h1> <#if user.age lt 12> ${user.name}还是一个小孩 <#elseif user.age lt 18> ${user.name}快成年 <#else> ${user.name}已经成年 </#if> </body> </html>
03.ftl
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<#list users as user>
${user.id}---------${user.name}-------${user.age}<br/>
</#list>
</body>
</html>
04.ftl
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> ${user.id}-------${user.name}------${user.group!} <#-- !后为空就不输出 --> <#--${user.group.name!}--><#-- 按照以上的方式加! freemarker仅仅只会判断group.name是不是空值 --> ${(user.group.name)!"1234"} ${(a.b)!"没有a.b元素"} <#-- !:指定缺失变量的默认值 ??:判断某个变量是否存在,返回boolean值 --> <#if (a.b)??> <#--if后不用加$--> 不为空 <#else> 为空 </#if> </body> </html>
实体类User.java
package com.ljq.fm; import java.io.Serializable; @SuppressWarnings("serial") public class User implements Serializable { private int id; private String name; private int age; private Group group; public Group getGroup() { return group; } public void setGroup(Group group) { this.group = group; } public User() { } public User(int id, String name, int age) { this.id = id; this.name = name; this.age = age; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
实体类Group.java
package com.ljq.fm; /** * * * @author 林计钦 * @version 1.0 2013-10-25 下午02:36:09 */ public class Group { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
3、再建个Junit的测试类 FreemarkerTest.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
public
class
FreemarkerTest {
@Test
public
void
test(){
FreemarkerUtil util =
new
FreemarkerUtil();
Map<String, Object> map =
new
HashMap<String, Object>();
Group group =
new
Group();
group.setName(
"IT"
);
User user =
new
User();
user.setId(
001
);
user.setName(
"张三"
);
user.setAge(
12
);
user.setGroup(group);
List<User> users =
new
ArrayList<User>();
users.add(user);
users.add(user);
users.add(user);
map.put(
"user"
, user);
//普通EL赋值
//util.print("01.ftl", map );
//判断
//util.fprint("02.ftl", map, "02.html");
//遍历
//map.put("users",users);
//util.print("03.ftl", map);
//子元素判断
util.print(
"04.ftl"
, map);
}
public static void main(String[] args) {
}
}
|
上述实例完毕之后,对freemarker应该有个大致的了解
三、具体教程——内容太多了,直接贴上两个地址
1、http://demojava.iteye.com/blog/800204——关于指令方面的介绍
2、http://wenku.baidu.com/link?url=qnIVrH5QYCzr7KOBLQoL1KSft3diK07mOxeeROOI4U_AyfciL_oep_JLWJLda0jC5z1QxMlJlDnoGlix0K26etdNVpKamw_ysOg0OJMjbCW——百度文库上一篇关于代码的介绍