初學什么都不可以忽略的地方就是這個東西的官方網站:http://freemarker.org/。下載或者API都可以參考這里。
FreeMarker是什么
非常的簡單明了。FreeMarker是一個java包。實現了MVC模式,分離開發者和設計師。也就是分離html也java的代碼。
FreeMarker是如何工作的

這是官網的圖。非常明確的說明了FreeMarker是如何運作的。首先需要有一個template模板,在那里就是一堆的html標簽和一些專屬FreeMarker的標簽,這些標簽之后會被具體的數據代替。這些數據就是有左下的Java objects提供。<FreeMarker>就是工程中的Jar包。他把這些模板和Java objects的數據加工組合之后輸出html頁面。所以,FreeMarker的功能,就如官網中一直強調的,不是別的而是一個模板引擎。
在工程中最后把這些捏合在一起,讓他們彼此知道、協同工作的是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中的數據。下面依次創建在配置文件中直接或者間接需要用到的代碼。
添加可運行的代碼
這里假設你已經創建了一個web project,這個project的名字叫做test。首先創建模板。一定要在WebRoot目錄下創建一個templates目錄。然后在里面添加后綴為ftl(freemarker template的縮寫),名稱為Test的模板。在配置文件中沒有出現模板叫什么,所以這里你可以隨便命名這個模板文件。這個文件之后會在Controller中明確指定。不會出現找不到的問題。
代碼:
<!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

