Freemarker模板应用

Freemarker模板应用

freemark.jar包

<!--maven中支持freemark的包  -->
<dependency>
	<groupId>org.freemarker</groupId>
	<artifactId>freemarker</artifactId>
	<version>2.3.19</version>
</dependency>
<!-- apache文件工具包 -->
	<dependency>
	    <groupId>commons-io</groupId>
	    <artifactId>commons-io</artifactId>
	    <version>2.4</version>
	</dependency>

一.自动生成代码应用

1.创建模板文件,在/resource/template目录下建立codeModel.ftl文件。

Java代码 

package com.order.model;   
  
public class ${class} {   
  
  <#list properties as prop>  
    private ${prop.type} ${prop.name};  
  </#list>  
  
  <#list properties as prop>  
    public ${prop.type} get${prop.name?cap_first}(){  
      return ${prop.name};  
    }  
    public void set${prop.name?cap_first}(${prop.type} ${prop.name}){  
      this.${prop.name} = ${prop.name};  
    }  
  </#list>  
  
}

 

2.应用代码生成模板文件。

Java代码 

public class GenerateCodeTest {  
  
    public static void main(String args[]) throws IOException,  
                                                  TemplateException {  
        Configuration cfg = new Configuration();  
        cfg.setDirectoryForTemplateLoading(new File(  
                "D:/myspace/freemarker/resource/template/"));  
        cfg.setObjectWrapper(new DefaultObjectWrapper());  
  
        /* 获取模板文件 */  
        Template template = cfg.getTemplate("codeModel.ftl");  
  
        /* 模板数据 */  
        Map<String, Object> root = new HashMap<String, Object>();  
        root.put("class", "Order");  
        Collection<Map<String, String>> properties = new HashSet<Map<String, String>>();  
        root.put("properties", properties);  
  
        /* 字段1 orderId */  
        Map<String, String> orderId = new HashMap<String, String>();  
        orderId.put("name", "orderId");  
        orderId.put("type", "Long");  
        properties.add(orderId);  
  
        /* 字段2 orderName */  
        Map<String, String> orderName = new HashMap<String, String>();  
        orderName.put("name", "orderName");  
        orderName.put("type", "String");  
        properties.add(orderName);  
  
        /* 字段3 money */  
        Map<String, String> money = new HashMap<String, String>();  
        money.put("name", "money");  
        money.put("type", "Double");  
        properties.add(money);  
  
        /* 生成输出到控制台 */  
        Writer out = new OutputStreamWriter(System.out);  
        template.process(root, out);  
        out.flush();  
  
        /* 生成输出到文件 */  
        File fileDir = new File("D:/generateCodeFile");  
        // 创建文件夹,不存在则创建  
        org.apache.commons.io.FileUtils.forceMkdir(fileDir);  
        // 指定生成输出的文件  
        File output = new File(fileDir + "/Order.java");  
        Writer writer = new FileWriter(output);  
        template.process(root, writer);  
        writer.close();  
    }  
}

二。在Servlet中使用FreeMarker

1、在WEB-INF文件夹下创建一个文件夹pages用来放freemark相关的模板文件,我创建了一个名为hello.ftl的模板文件,内容如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>使用Freemarker渲染2</title> 
</head> 
<body> 
hello ${userName!}! 
</body> 
</html>

2、创建一个servlet

package freemark.web.test;

import java.io.IOException;
import java.io.Writer;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

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;
import freemarker.template.TemplateException;

/**
 * Servlet implementation class HelloAction
 */
public class HelloAction extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public HelloAction() {
        super();
        // TODO Auto-generated constructor stub
    }
    private Configuration configuration; 
    public void init() throws ServletException { 
        configuration = new Configuration(); 
        configuration.setServletContextForTemplateLoading(getServletContext(), "WEB-INF/pages"); 
        //设置编码模板的编码方式,否则会乱码
        configuration.setEncoding(Locale.CHINA, "UTF-8"); 
    }
    
    public void destroy() { 
        super.destroy(); 
        if(configuration != null){ 
            configuration = null; 
        } 
    } 
	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doGet(request, response);
	
	}
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    	    response.setContentType("text/html;charset=UTF-8"); 
    	    //创建数据模型 
	        Map map = new HashMap(); 
	        map.put("userName", "小龙女");
	        //加载模板
	        Template template = configuration.getTemplate("hello.ftl"); 
	        //Writer对象将输出内容打印到HttpServletResponse对象的输出流中
	        Writer out = response.getWriter(); 
	        try{ 
	        	//模板与数据模型结合
	            template.process(map,out); 
	        }catch (TemplateException e) { 
	            e.printStackTrace(); 
	        }
	    }

	}

3、配置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" xmlns:web="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">
<!--***************************************关于freemark的相关配置*********************************-->
	<servlet>
		<servlet-name>freemarker</servlet-name>
		<servlet-class>
			freemarker.ext.servlet.FreemarkerServlet
		</servlet-class>
		<!-- FreemarkerServlet 设置: -->
		<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>
			<!-- 强制使用 UTF-8作为输出编码格式! -->
		</init-param>
		<!-- FreeMarker 设置: -->
		<init-param>
			<param-name>template_update_delay</param-name>
			<param-value>0</param-value>
			<!-- 0 只对开发使用! 否则使用大一点的值. -->
		</init-param>
		<init-param>
			<param-name>default_encoding</param-name>
			<param-value>UTF-8</param-value>
			<!-- 模板文件的编码方式. -->
		</init-param>
		<init-param>
			<param-name>number_format</param-name>
			<param-value>0.##########</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,用来调用freemark模板***** -->
	<servlet>
		<servlet-name>HelloAction</servlet-name>
		<servlet-class>freemark.web.test.HelloAction</servlet-class>
	</servlet>

	<servlet-mapping>
		<servlet-name>HelloAction</servlet-name>
		<url-pattern>/HelloAction</url-pattern>
	</servlet-mapping>

</web-app>

4、浏览器中访问:http://localhost:8080/freemark/HelloAction结果如下:


hello 小龙女!


 三.JSP调用模板文件输出。


1.首先创建模板文件,在WEB-INF/templates目录下建立test.ftl文件。

Java代码 

  1. Hello,${name}!  

2.解析模板文件类,传入pageContext参数。

Java代码

public class FreemarkerTest {  
      
    public void execute(PageContext pageContext) throws Exception  
    {          
        Configuration cfg = new Configuration();          
        // 设置模板的路径  
        cfg.setServletContextForTemplateLoading(pageContext.getServletContext(),   
                                                "WEB-INF/templates");          
        Map root = new HashMap();  
        root.put("name", "Tom");          
        // 获取模板文件  
        Template t = cfg.getTemplate("test.ftl");          
        Writer out = pageContext.getResponse().getWriter();          
        t.process(root, out);  
    }  
}

 3.创建JSP文件调用输出。

Html代码 

<%@ page language="java" contentType="text/html; charset=GB2312"  
    pageEncoding="GB2312"%>  
<%@page import="com.freemarker.test.FreemarkerTest;"%>  
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"   
    "http://www.w3.org/TR/html4/loose.dtd">  
<html>  
    <head>  
        <meta http-equiv="Content-Type" content="text/html; charset=GB2312">  
        <title>HelloWorld</title>  
    </head>  
    <body>  
        <%  
            FreemarkerTest c1 = new FreemarkerTest();  
            c1.execute(pageContext);  
        %>  
    </body>  
</html>

 四.Servlet调用模板文件生成html文件进行页面展示。


1.创建模板文件,在WebRoot/index目录下建立test.ftl文件。 

Java代码 

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

 

2.创建Servlet文件解析模板文件并生成html文件进行页面输出。

Java代码  收藏代码

public class FreemarkerServletTest extends HttpServlet {  
  
    public FreemarkerServletTest() {  
           super();  
    }  
    public void destroy() {  
       super.destroy();   
    }  
    public void doGet(HttpServletRequest request, HttpServletResponse response)  
        throws ServletException, IOException {  
        doPost(request, response);  
    }  
    public void doPost(HttpServletRequest request, HttpServletResponse response)  
        throws ServletException, IOException {  
       //生成html后的文件  
       String path = getServletContext().getRealPath("/") + "index.htm";  
       System.out.println(path);  
       try {  
        freemarker(request, "test.ftl", path, "index");  
       } catch (Exception e) {  
        e.printStackTrace();  
       }  
       //跳转到刚生成的html文件中  
       request.getRequestDispatcher("/index.htm").forward(request, response);  
    }  
  
    /** 
    * 生成静态文件 
    * @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(), "GB18030");  
        
       //获得模板并设置编码  
       Template tep = cfg.getTemplate(ftl);  
       tep.setEncoding("GB18303");  
         
       //新建输出,生成html文件  
       Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(html),"GB18030"));  
       //设置值  
       Map map = new HashMap();  
       map.put("userName", "wxj");  
       map.put("email", "[email protected]");  
       // 解析并输出  
       tep.process(map, out);  
    }  
  
    public void init() throws ServletException {          
    }  
}

 

3.web.xml文件进行servlet配置。

Xml代码  收藏代码

<servlet>     
    <servlet-name>FreemarkerServletTest</servlet-name>  
    <servlet-class>com.servlet.FreemarkerServletTest</servlet-class>  
</servlet>  
  
<servlet-mapping>  
    <servlet-name>FreemarkerServletTest</servlet-name>  
    <url-pattern>/servlet/FreemarkerServletTest</url-pattern>  
</servlet-mapping>

4.页面访问如下Url:
  http://localhost:8080/freemarkerWeb/servlet/FreemarkerServletTest   
输出结果如下:

Java代码  收藏代码

  1. 用户名:wxj  

  2. 邮  箱:jxauwxj@126.com  

 

同时会在部署环境的目录下生成index.htm文件。


你可能感兴趣的:(Freemarker模板应用)