FreeMarker教程整理

来源:互联网 发布:魔兽世界 7.0 数据库 编辑:程序博客网 时间:2024/06/14 00:32

网上看了很多相关的资料,感觉乱乱的,现在整理一下,按照以下思路来学习,相信会轻松不少,转载资料已注明


一、先对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>
页面中的用户名(即上面的“Big Joe”)是登录这个网页的访问者的名字, 并且最新产品的数据应该来自于数据库才能随时更新。所以,不能直接在HTML页面中输入“Big Joe”、“greenmouse”及链接, 不能使用静态HTML代码。可以使用要求输出的模板来解决,模板和静态页面是相同的,只是它会包含一些FreeMarker将它们变成动态内容的指令:
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>
模板文件存放在Web服务器上,当有人来访问这个页面,FreeMarker就会介入执行,然后动态转换模板,用最新的数据内容替换模板中${...}的部分,之后将结果发送到访问者的Web浏览器中。访问者的Web浏览器就会接收到例如第一个HTML示例那样的内容(也就是没有FreeMarker指令的HTML代码),访问者也不会察觉到服务器端使用的FreeMarker。(存储在Web服务器端的模板文件是不会被修改的;替换也仅仅出现在Web服务器的响应中。)

二、做一个简单的示例,先不用管原理,看下效果——转自http://www.cnblogs.com/linjiqin/p/3387972.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) {
FreemarkerTest test=new FreemarkerTest();
test.test();
}
}

上述实例完毕之后,对freemarker应该有个大致的了解


三、具体教程——内容太多了,直接贴上两个地址

1、http://demojava.iteye.com/blog/800204——关于指令方面的介绍

2、http://wenku.baidu.com/link?url=qnIVrH5QYCzr7KOBLQoL1KSft3diK07mOxeeROOI4U_AyfciL_oep_JLWJLda0jC5z1QxMlJlDnoGlix0K26etdNVpKamw_ysOg0OJMjbCW——百度文库上一篇关于代码的介绍

0 0
原创粉丝点击