第一個FreeMarker HelloWorld程序

工作需要,開始接觸FreeMarker,Google了半天,看了些07年 08年的博客文章,感覺都比較適合入門。但太深入的沒有幾篇。

當然,現在已經是2010年,剛開始接觸FreeMarker。熟悉了下FreeMarker例子運行的大概流程,遇到些問題。但也都迎刃而解。還需要時間和精力讀完官方的指導文檔。還是從開發者指南部分開始讀吧。免得浪費時間。

FreeMarkerServlet.java

package com.golfetrip.freemarker;

 

 

import java.io.File;


import java.io.IOException;


import java.io.OutputStreamWriter;


import java.io.Writer;


import java.util.HashMap;


import java.util.Map;

 

 

import javax.servlet.ServletException;


import javax.servlet.http.HttpServlet;


import javax.servlet.http.HttpServletRequest;


import javax.servlet.http.HttpServletResponse;

 

 

import freemarker.template.Configuration;


import freemarker.template.DefaultObjectWrapper;


import freemarker.template.Template;


import freemarker.template.TemplateException;

 

 

public class FreeMarkerServlet extends HttpServlet {


 Configuration cfg;

 

 

 @Override


 protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {


  Map root = new HashMap();


  root.put("user", "Big Joe");


  Map latest = new HashMap();


  root.put("latestProduct", latest);


  latest.put("url", "products/greenmouse.html");


  latest.put("name", "green mouse");


  


  Template temp = cfg.getTemplate("test.ftl");


  


  Writer out = new OutputStreamWriter(System.out);


  


  try {


   temp.process(root, out);


  } catch (TemplateException e) {


   e.printStackTrace();


  }


  


  out.flush();


 }

 

 

 @Override


 public void init() throws ServletException {


  cfg = new Configuration();


  try {


   //System.out.println(new File(getServletContext().getRealPath("/") + "/templates"));


   //cfg.setDirectoryForTemplateLoading(new File(getServletContext().getRealPath("/") + "/templates"));


   cfg.setDirectoryForTemplateLoading(new File("/templates"));


   cfg.setObjectWrapper(new DefaultObjectWrapper());


  } catch (IOException e) {


   e.printStackTrace();


  }


 }


 


}

 

****************************

web.xml

<?xml version="1.0" encoding="UTF-8"?>


<web-app version="2.4"


 xmlns="http://java.sun.com/xml/ns/j2ee"


 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"


 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee


 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">


 


 <servlet>


  <servlet-name>FreeMarkerServlet</servlet-name>


  <servlet-class>com.golfetrip.freemarker.FreeMarkerServlet</servlet-class>


 </servlet>


 <servlet-mapping>


  <servlet-name>FreeMarkerServlet</servlet-name>


  <url-pattern>/FreeMarkerServlet</url-pattern>


 </servlet-mapping>


  <welcome-file-list>


    <welcome-file>index.jsp</welcome-file>


  </welcome-file-list>


</web-app>

************************************

WebRoot下的templates文件夾中的test.ftl

<html>


<head><title>My First FreeMarker Application!</title></head>


<body>


Hi,${user}!


The latest product is <a href="${latestProduct.url}">${latestProduct.name}</a>.


</body>


</html>

***********************************

最基本的運行文件也就這三個,當然別忘記freemarker.jar。

在FreeMarkerServlet.java中,這裏用的是一個servlet,方便在web環境中測試。

其中init方法中首先實例化了一個freemarker必要的Configuration實例,通過下面語句獲取ftl文件加載目錄,當然沒有實際意義的後綴而已,完全可以用html或其他代替。

之後在service方法中設定模板文件。獲取writer對象,最後在process方法中將模板和數據模型融合在一起,返回給客戶端。

此例結果是在後臺打印出來。

 

看似以上的編碼都沒有什麼問題,但在運行的時候會報出找不到模板錯誤。

這裏主要是因爲路徑的問題。new File("/templates");實際是在當前磁盤的根目錄下查找templates文件夾。

解決方法是修改service方法中相關代碼爲

cfg.setDirectoryForTemplateLoading(new File(getServletContext().getRealPath("/") + "/templates"));

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章