使用FreeMarker將資料模型中的值合併到模板檔案中
步驟如下:
①建立Configuration例項,該例項負責管理FreeMarker的模板載入路徑,負責生成模板例項。
②使用Configuration例項來生成Template例項,同時需要指定使用的模板檔案。
③填充資料模型,資料模型就是一個Map物件。
④呼叫Template例項的process方法完成合並。
根據上面步驟,下面提供一個使用FreeMarker建立輸出的Java程式,該程式程式碼如下:
public class HelloFreeMarker
{
//負責管理FreeMarker模板檔案的Configuration例項
private Configuration cfg;
//負責初始化Configuration例項的方法
public void init() throws Exception
{
//初始化FreeMarker配置
//建立一個Configuration例項
cfg = new Configuration();
//設定FreeMarker的模板檔案位置
cfg.setDirectoryForTemplateLoading(new File("templates"));
}
//處理合並的方法
public void process() throws Exception
{
//建立資料模型
Map root = new HashMap();
root.put("name", "FreeMarker!");
root.put("msg", "您已經完成了第一個FreeMarker的例項!");
//使用Configuration例項來載入指定模板
Template t = cfg.getTemplate("test.flt");
//處理合並
t.process(root, new OutputStreamWriter(System.out));
}
public static void main(String[] args) throws Exception
{
HelloFreeMarker hf = new HelloFreeMarker();
hf.init();
hf.process();
}
}
上面程式碼建立了一個Map例項root,這個root將作為模板檔案的資料模型,在該資料模型中儲存了兩個
key-value對,其中第一個是name,第二個是msg,這兩個key都有對應的value,這兩個value將會填充到模板中對應的插值處。
雖然FreeMarker可以在Java中使用,但大部分時候FreeMarker都用於生成HTML頁面。
下面介紹在Web應用中使用FreeMarker,用Servlet來合併模板和資料模型,下面是Servlet應用中的程式碼:
public class HelloServlet extends HttpServlet
{
//負責管理FreeMarker模板檔案的Configuration例項
private Configuration cfg;
//負責初始化Configuration例項的方法
public void init() throws Exception
{
//初始化FreeMarker配置
//建立一個Configuration例項
cfg = new Configuration();
//設定FreeMarker的模板檔案位置
cfg.setServletContextForTemplateLoading(getServletContext(), "WEB-INF/templates");
}
//生成使用者響應
public void service(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException
{
//建立資料模型
Map root = new HashMap();
root.put("message", "Hello FreeMarker!");
//使用Configuration例項來載入指定模板,即:取得模板檔案
Template t = cfg.getTemplate("test.flt");
//開始準備生成輸出
//使用模板檔案的charset作為本頁面的charset
//使用text/html,MIME-type
response.setContentType("text/html; charset=" + t.getEncoding());
Writer out = response.getWriter();
//合併資料模型和模板,並將結果輸出到out中
try
{
t.process(root, out);
}
catch(TemplateException e)
{
throw new ServletException("處理Template模板中出現的錯誤", e);
}
}
}