Freemarker入门案例(一)

来源:互联网 发布:js 严格模式 eval 编辑:程序博客网 时间:2024/04/28 00:27

    FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写FreeMarker被设计用来生成HTMLWeb页面,特别是基于MVC模式的应用程序

     所谓模板,就是一份已经写好了基本内容,有着固定格式的文档,其中空出或者用占位符标识的内容,由使用者来填充,不同的使用者给出的数据是不同的。在模板中的占位符,在模板运行时,由模板引擎来解析模板,并采用动态数据替换占位符部分的内容。

       FreeMarker不是一个Web应用框架,而适合作为Web应用框架一个组件FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java文等。

     虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据(如下图)


 

分离表现层和业务逻辑

       使用JSP开发过程中在页面中大量的存在业务逻辑的代码,使得页面内容凌乱,在后期大量的修改维护过程中就变得非常困难。FreeMarker根本不支持Java脚本代码,而是使用el表达式来输出展示数据。FreeMarker的设计初衷就是:模板+数据模型=输出,模板只负责数据在页面中的表现,不涉及任何的逻辑代码,而所有的逻辑都是由数据模型来处理的。用户最终看到的输出是模板和数据模型合并后创建的。

 

 

提高开发效率

         在我们以往的开发中,使用的都是JSP页面来展示数据的,即所谓的表现层。我们都知道,JSP在第一次执行的时候需要转换成Servlet类,开发阶段进行功能调适时,需要频繁的修改JSP,每次修改都要编译和转换,那么试想一天中我们浪费在程序编译的时间有多少。相对于JSP来说,FreeMarker模板技术不存在编译和转换的问题,所以就不会存在上述问题。而且开发过程中,我们在不必在等待界面设计开发人员完成页面原形后,我们再来开发程序。

 

 

分工明确

        以往用JSP展现数据时,程序员并不熟悉界面设计技术,反之界面开发人员,也并不熟悉程序语言。协调工作很困难,使用FreeMarker后,作为界面开发人员,只专心创建HTML文件、图像以及Web页面的其他可视化方面,不用理会数据;而程序开发人员则专注于系统实现,负责为页面准备要显示的数据。



首先需要到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:/workspace/freemarkprj/page/" + 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>你好: ${username}</h1></body></html>
复制代码

03.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>
复制代码

04.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>
复制代码

05.ftl

复制代码
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body><hr/><#list users as user>${user.id}---------${user.name}-------${user.age}<br/></#list></body></html>
复制代码

06.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

复制代码
package com.freemarker;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import com.freemarker.dto.Group;import com.freemarker.dto.User;public class FreemarkerTest {public static void main(String[] args) {Map<String, Object> root = new HashMap<String, Object>();root.put("username", "王风");//在ftl中要赋值的变量root.put("user", new User(1,"name1",11,new Group("组1")));List<User> users = new ArrayList<User>();users.add(new User(1,"name1",11));users.add(new User(2,"name2",15));users.add(new User(3,"name3",20));users.add(new User(4,"name4",30));root.put("users", users);FreeMarkerUtil util = new FreeMarkerUtil();util.fprint("001.jsp", root, "0001.jsp");util.fprint("01.ftl", root, "01.html");util.fprint("02.ftl", root, "02.html");util.fprint("03.ftl", root, "03.html");util.fprint("04.ftl", root, "04.html");util.fprint("05.ftl", root, "05.html");util.fprint("06.ftl", root, "06.html");}}
复制代码

 



参考文献:


Freemarker(一)简介 http://blog.csdn.net/kanglix1an/article/details/42271639

Freemarker入门案例  http://www.cnblogs.com/linjiqin/p/3387972.html


0 0
原创粉丝点击