Freemarker入门案例(一)

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

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

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

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

Freemarker入门案例(一)_第1张图片

 

分离表现层和业务逻辑

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

 

 

提高开发效率

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

 

 

分工明确

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



首先需要到freemarker官方下载freemarker的jar包,导入到项目中,如:freemarker-2.3.19.jar

Freemarker入门案例(一)_第2张图片

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

复制代码



测试



你好${username}

复制代码

02.ftl

复制代码



Insert title here



你好: ${username}

复制代码

03.ftl

复制代码



Insert title here


${user.id}-----${user.name}-----${user.age}

<#if user.age lt 12> ${user.name}还是一个小孩 <#elseif user.age lt 18> ${user.name}快成年 <#else> ${user.name}已经成年 if>
复制代码

04.ftl

复制代码



Insert title here


<#list users as user>
${user.id}---------${user.name}-------${user.age}
复制代码

05.ftl

复制代码



Insert title here




<#list users as user> ${user.id}---------${user.name}-------${user.age}
复制代码

06.ftl

复制代码



Insert title here



${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>

复制代码

实体类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 root = new HashMap();
		root.put("username", "王风");//在ftl中要赋值的变量
		root.put("user", new User(1,"name1",11,new Group("组1")));
		List users = new ArrayList();
		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


你可能感兴趣的:(freemarker)