关闭

Freemaker简明介绍

135人阅读 评论(0) 收藏 举报

声明:

非原创,网络资料整理,自己复习用。多谢。

1. 简介

FreeMarker 是一个“模板引擎”,一个基于模板生成文本输出的第三方工具。可以实现生成HTML 网页,设计人员可以用它改变的外观网而无需更改或重新编译代码,因为应用将程序逻辑( Java 程序)和网页设计( FreeMarker 模板)隔开。


Freemaker模板文件的后缀名为*.ftl

官网:

http://freemarker.org/

官网有手册,有什么不懂的,手册完全搞的定!


2.Freemaker使用

①创建配置实例

首先,必须创建一个freemarker.template.Configuration 实例,并调整其设置。它涉及建立和缓存预解析模板。

Configuration cfg = new Configuration();
// Specify the data source where the template files come from.
// Here I set a file directory for it:
cfg.setDirectoryForTemplateLoading(new File("模板路径"));
//cfg.setServletContextForTemplateLoading(this.getServletContext(), "模板路径");
//cfg.setClassForTemplateLoading(this.class,” 模板路径”)
// Specify how templates will see the data-model. This is an advanced topic...
// but just use this:
cfg.setObjectWrapper(new DefaultObjectWrapper());

②创建数据模型

java.util.Map java.util.List 等。


③获取模板

模板是由freemarker.template.Template 提供。模板实例从Configuration 实例获得。当你需要一个模板你可以用它getTemplate()方法。
test.ftl 是早先设定的目录中的模板文件,那么你可以Template 
temp = cfg.getTemplate("test.ftl");
它会创建一个Template 实例对应于test.ftl ,通过阅读模板路径/test.ftl 并解析它。Template 实例存储的是模板中的解析形式,而不是文字。
Configuration 缓存Template 实例,因此当你再次解析test.ftl,它可能不会创建新的Template 实例,只需返回同一实例。


④合并模板与数据模型

数据模型+模板=输出,我们有一个数据模型和模板,所以要获得的输出,我们必须将它们合并。

Writer out = new OutputStreamWriter(System.out);
temp.process(root, out);
out.flush();
//PrintWriter p = new PrintWriter(new FileOutputStream(new File("1.html")));//如果为servelet
则response.getOutputStream()
temp.process(root, p);//输出

一个Freemaker + Servlet的例子,代码:

Servlet代码:

package cn.demo;

import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import freemarker.template.Configuration;
import freemarker.template.Template;

/**
 * Servlet implementation class FreemarkerServletDemo
 */
public class FreemarkerServletDemo extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public FreemarkerServletDemo() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doPost(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println("--------start---------------");
		/*
		//生成html后的文件  
       String path = getServletContext().getRealPath("/") + "demo.html";
       System.out.println(path);
		try {
			freemarker(request, "test.ftl", path, "template");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
       
       //跳转到刚生成的html文件中  
       request.getRequestDispatcher("/demo.html").forward(request, response);
       */
		try {
			testFreeMarker(request, response);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
       System.out.println("--------end---------------");
	}
	
	/**
	 * 
	 * @param request
	 * @param ftl  ftl文件
	 * @param html 生成html后的文件
	 * @param file 存放ftl文件的路径
	 * @throws Exception
	 */
	public void freemarker(HttpServletRequest request, String ftl, String html, String file) throws Exception {
		Configuration cfg = new Configuration();
		// 设置加载模板的路径
		cfg.setServletContextForTemplateLoading(getServletContext(), "/" + file);
		cfg.setEncoding(Locale.getDefault(), "GBK");

		// 获得模板并设置编码
		Template tep = cfg.getTemplate(ftl);
		tep.setEncoding("GBK");

		// 新建输出,生成html文件
		Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(html), "GBK"));
		// 设置值
		Map map = new HashMap();
		map.put("userName", "LUCAS");
		map.put("email", "lucas003@163.com");
		// 解析并输出
		tep.process(map, out);
	}
	
	public void testFreeMarker(HttpServletRequest req, HttpServletResponse resp) throws Exception{
		String strValue = "this is String";
		Date myDate  = new Date();
		Object[] objectArray = {1,"str",1.2};
		Set<Object> setData = new HashSet<Object>();
		setData.add("dataValue1");
		setData.add("dataValue2");
		setData.add("dataValue3");
		
		List<String> strList = new ArrayList<String>();
		strList.add("字符串1");
		strList.add("字符串2");
		strList.add("字符串3");
		
		Map<String,Object> map = new HashMap<String, Object>();
		map.put("key1", "value1");
		map.put("key2", "value2");
		map.put("key3", "value3");
		
		req.setAttribute("strValue", strValue);  
        req.setAttribute("objectArray", objectArray);  
        req.setAttribute("strList", strList);  
        req.setAttribute("map", map);  
        req.setAttribute("myDate", myDate);  
        req.setAttribute("setData", setData);
        
        resp.setCharacterEncoding("gbk");
        req.getRequestDispatcher("/template/sample.ftl").forward(req, resp);
	}

}

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="WebApp_ID" version="2.5">
  <display-name>FreeMarkerDemo</display-name>
  <servlet>
  	<servlet-name>freemarker</servlet-name>
    <servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class>
    <init-param>
		<param-name>TemplatePath</param-name>
		<param-value>/</param-value>
	</init-param>
	<init-param>
		<param-name>NoCache</param-name>
		<param-value>true</param-value>
	</init-param>
    <init-param>
      <param-name>ContentType</param-name>
      <param-value>text/html; charset=UTF-8</param-value>
    </init-param>
    <init-param>
      <param-name>template_update_delay</param-name>
      <param-value>0</param-value>
    </init-param>
    <init-param>
      <param-name>default_encoding</param-name>
      <param-value>ISO-8859-1</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  
  <servlet-mapping>  
	  <servlet-name>freemarker</servlet-name>  
	  <url-pattern>*.ftl</url-pattern>  
  </servlet-mapping>
  
  <servlet>
  		<servlet-name>FreemarkerServlet</servlet-name>
       <servlet-class>cn.demo.FreemarkerServletDemo</servlet-class>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>FreemarkerServlet</servlet-name>
    <url-pattern>/freemarkerServlet</url-pattern>
  </servlet-mapping>
  
  <welcome-file-list>
    <welcome-file>index.htm</welcome-file>
  </welcome-file-list>
  
</web-app>

模板文件 test.ftl

<html>  
<body>  
   用户名:${userName}<br>  
   邮  箱:${email}  
</body>  
</html>



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:214240次
    • 积分:2802
    • 等级:
    • 排名:第12843名
    • 原创:31篇
    • 转载:181篇
    • 译文:0篇
    • 评论:40条
    文章分类
    最新评论