Java: FreeMarker的配置和使用

初學什麼都不能夠忽略的地方就是這個東西的官方網站:http://freemarker.org/。下載或者API均可以參考這裏。html

FreeMarker是什麼java

很是的簡單明瞭。FreeMarker是一個java包。實現了MVC模式,分離開發者和設計師。也就是分離html也java的代碼。web

 

FreeMarker是如何工做的app

這是官網的圖。很是明確的說明了FreeMarker是如何運做的。首先須要有一個template模板,在那裏就是一堆的html標籤和一些專屬FreeMarker的標籤,這些標籤以後會被具體的數據代替。這些數據就是有左下的Java objects提供。<FreeMarker>就是工程中的Jar包。他把這些模板和Java objects的數據加工組合以後輸出html頁面。因此,FreeMarker的功能,就如官網中一直強調的,不是別的而是一個模板引擎。jsp

在工程中最後把這些捏合在一塊兒,讓他們彼此知道、協同工做的是web.xml配置文件。這裏先介紹web.xml的配置,以後具體說明如何一步一步的添加配置文件中涉及到的模板、java objects等。這樣有利於讀者從整體出發逐步把握每個相關的細節。測試

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <servlet>
        <servlet-name>Test</servlet-name>
        <servlet-class>example.Test</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Test</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

配置依次說明了:有一個叫Test的servlet,對應在代碼的example包的Test類。這個類的名字能夠隨便起,其餘的節點在配置的時候使用的知識servlet-name,而後他會找到這個類。下面的servlet-mapping在url中訪問*.do的時候會訪問這個servlet-name爲Test的節點配置的類。以後,在index.jsp中添加一個指向*.do的超連接。整個的整個測試項目就能夠run起來了。網站

按照MVC的方式理解。在servlet-name中配置的類就是Controller。View就是模板。Model就是以後在HashMap中的數據。下面依次建立在配置文件中直接或者間接須要用到的代碼。this

添加可運行的代碼編碼

這裏假設你已經建立了一個web project,這個project的名字叫作test。首先建立模板。必定要在WebRoot目錄下建立一個templates目錄。而後在裏面添加後綴爲ftl(freemarker template的縮寫),名稱爲Test的模板。在配置文件中沒有出現模板叫什麼,因此這裏你能夠隨便命名這個模板文件。這個文件以後會在Controller中明確指定。不會出現找不到的問題。url

代碼:

<!DOCTYPE html>
<html>
  <head>
    <title>Hello</title>
  </head>
  
  <body>
    This is my HTML page. <br>
    <h1>${user}</h1>
  </body>
</html>

這個模板很是簡單。只在h1標籤中方了一個須要數據「user」的Freemarker標籤。這個「user」數據就是在以後的HashMap提供的。

而後添加Controller,也就是在web.xml配置文件中指定的example.Test類。首先在項目的根目錄下,建立一個「example」的包,而後在裏面添加一個Servlet。Servlet的名稱設定爲Test。名字能夠隨意起,可是在配置文件中的必須和這個類的名稱是一致的。

package example;

import java.io.*;
import java.util.*;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import freemarker.template.*;

public class Test extends HttpServlet {
    
    private Configuration _config;
    
    public void init() {
        // 初始化Freemarker配置
        _config = new Configuration(Configuration.VERSION_2_3_0);
        // 設置Freemarker模板文件的位置
        _config.setServletContextForTemplateLoading(this.getServletContext(), "templates");
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        // 數據
        Map root = new HashMap();
        root.put("user", "Jack");
        
        // 獲取模板
        Template t = _config.getTemplate("Test.ftl");
        
        // 準備輸出, 使用模板的編碼做爲本頁的charset
        response.setContentType("text/html; charset=" + t.getEncoding());
        PrintWriter out = response.getWriter();
        
        try{
            // 在模板中加入動態數據
            t.process(root, out);
        }
        catch(freemarker.template.TemplateException e){
            throw new ServletException("處理Template模版中出現錯誤", e);
        }
    }
}

代碼_config.setServletContextForTemplateLoading(this.getServletContext(), "templates");指定了模板文件所在的目錄,之後的所有的Controller的模板文件都是從這個地方找了,也就是前文指定的在WebRoot下建立的templates目錄。在後面的代碼Template t = _config.getTemplate("Test.ftl");中指定了具體的模板文件是哪個。Map root = new HashMap(); root.put("user", "Jack");指定了具體的數據Model。這個key值必須和在模板中設定的${user}一致。最後在方法t.process(root, out);中,把數據添加到模板中。經過這幾步之後,MVC的幾個部分就結合到了一塊兒。

最後在index.jsp中添加一個超連接:<a href="Hello.do">Freemarker first page</a>。整個例子就能夠運行了。看那看效果吧。

Freemarker是一個功能十分強大的模板引擎。不僅有文中介紹的簡單的數據的替換,還有指令、宏等功能。很是好用。

 

 

參考:

http://freemarker.org/docs/

http://gqsunrise.iteye.com/blog/1659118

相關文章
相關標籤/搜索