FreeMarker与Servlet结合示例

一、最原始示例

1、引入POM依赖

        <!-- https://mvnrepository.com/artifact/org.freemarker/freemarker -->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.26-incubating</version>
        </dependency>

        <!-- Servlet Library -->
        <!-- http://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>

2、在WEB-INF/ftl中建立test.ftl

<html>
<head>
  <title>Welcome!</title>
</head>
<body>
  <h1>
    Welcome ${user}<#if user == "Big Joe">, our beloved leader</#if>!
  </h1>
</body>
</html>

3、添加TestServlet.java

package com.jsoft.testfreemarker;

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

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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 TestServlet
 */
@WebServlet(name = "test", urlPatterns = "/test")
public class TestServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    private Configuration cfg;

    @Override
    public void init() throws ServletException {
        // initialize operation
        cfg = new Configuration(Configuration.VERSION_2_3_26);
        cfg.setServletContextForTemplateLoading(getServletContext(), "WEB-INF/ftl");
    }

    /**
     * Default constructor.
     */
    public TestServlet() {
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setCharacterEncoding("utf-8");
        Map<String, Object> data = new HashMap<String, Object>();
        data.put("user", "Big Joe");
        // 得到模板
        try {
            // 将模板和数据结合,并返回浏览器
            Template template = cfg.getTemplate("test.ftl");
            template.process(data, response.getWriter());
        } catch (Exception e) {
            // e.printStackTrace();
            response.getWriter().print("暂时无数据");
        }
    }

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

}

提示:采用了Servlet3.x的注解功能,不需要在web.xml中再配置映射。

4、测试效果

测试工程:https://github.com/easonjim/5_java_example/tree/master/freemarker/test2

二、高级一点的集成

1、在web.xml引入FreeMarker提供的Servlet

    <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>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>number_format</param-name>
            <param-value>0.##########</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>freemarker</servlet-name>
        <url-pattern>*.ftl</url-pattern>
    </servlet-mapping>

2、新建test.ftl模板文件

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-CN" dir="ltr">  
<head>  
 <title>test!</title>  
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>  
</head>  
<body>  
    <div>  
        直接显示字符串<br />  
        String:${strValue}<br/>     
        <hr/>  
    </div>  
      
    <div>  
    显示日期  
    date:${myDate?date}<br/>  
    <hr/>  
    显示时间  
    time:${myDate?time}<br/>  
    <hr/>  
    显示时间戳  
    datetime:${myDate?datetime}<br/>  
    <hr/>   
    </div>  
      
    <div>  
    访问对象数组  
    ObjectArray:  
    ${objectArray[0]},${objectArray[1]},${objectArray[2]}  
    <br />  
    <hr/>       
    </div>  
      
    <div>  
    遍历Set中的元素  
    SetData:<br />  
    <#list setData as value>  
        ${value}  
    </#list>  
    <hr/>   
    </div>  
      
    <div>  
    遍历List中的元素  
    strList:<br/>  
    <#list strList as strValue >  
    <#if strValue_index == 0>  
        ${strValue} is first element  
    <#elseif !strValue_has_next>  
        ${strValue} is last element  
    <#else>  
        ${strValue}  
    </#if>  
    <br />  
    </#list>  
    <hr/>   
    </div>  
      
    <div>  
    获取map中的值  
    <br/>  
    map:  
    key1=${map.key1},key2=${map.key2},key3=${map.key3}  
    <hr/>       
    </div>  
      
      
    <#include "foot.html">  
</body>     
</html>    

foot.html为了演示模板中引入文件的效果

<div style="margin-top: 50px;text-align: center;font-size: 12px">  
<hr />  
this is foot  
</div>  

3、编写Servlet,这次的Servlet完全不用涉及到FreeMarker的类库使用,只关心Model即可。

package com.jsoft.testfreemarker;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

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

/**
 * Servlet implementation class TestServlet
 */
@WebServlet(name = "test", urlPatterns = "/test")
public class TestServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * Default constructor.
     */
    public TestServlet() {
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String strValue = "this is String";
        Date myDate = new Date();
        Object[] objectArray = new Object[] { 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");

        request.setAttribute("strValue", strValue);
        request.setAttribute("objectArray", objectArray);
        request.setAttribute("strList", strList);
        request.setAttribute("map", map);
        request.setAttribute("myDate", myDate);
        request.setAttribute("setData", setData);
        request.getRequestDispatcher("/WEB-INF/ftl/test.ftl").forward(request, response);
    }

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

}

4、测试效果

测试工程:https://github.com/easonjim/5_java_example/tree/master/freemarker/test3

原文地址:https://www.cnblogs.com/EasonJim/p/7091074.html