FreeMarker與Servlet結合示例

1、最原始示例html

一、引入POM依賴java

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

二、在WEB-INF/ftl中創建test.ftlgit

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

三、添加TestServlet.javagithub

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中再配置映射。web

四、測試效果api

 

測試工程:https://github.com/easonjim/5_java_example/tree/master/freemarker/test2數組

 

2、高級一點的集成瀏覽器

一、在web.xml引入FreeMarker提供的Servletapp

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

二、新建test.ftl模板文件ide

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

三、編寫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);
    }

}

四、測試效果

 

測試工程:https://github.com/easonjim/5_java_example/tree/master/freemarker/test3

相關文章
相關標籤/搜索