|
FreeMarker模板文件主要由如下4個部分組成: 1,文本:直接輸出的部分 2,注釋:<#-- ... -->格式部分,不會輸出 3,插值:即${...}或#{...}格式的部分,將使用數(shù)據(jù)模型中的部分替代輸出 4,FTL指令:FreeMarker指定,和HTML標記類似,名字前加#予以區(qū)分,不會輸出 下面是一個FreeMarker模板的例子,包含了以上所說的4個部分 <html><br> <head><br> <title>Welcome!</title><br> </head><br> <body><br> <#-- 注釋部分 --><br> <#-- 下面使用插值 --> <h1>Welcome ${user} !</h1><br> <p>We have these animals:<br> <u1><br> <#-- 使用FTL指令 --> <#list animals as being><br> <li>${being.name} for ${being.price} Euros<br> <#list><br> <u1><br> </body><br> </html> 在java程序中使用FreeMarker FreeMarker的模板就是一個.ftl文本文件,在該文件中使用了一些FreeMarker的特別標記,這些標記會動態(tài)顯示,或者控制程序輸出,如下面的模板文件代碼: ${name},你好!${msg} 這里類似于${}的就是動態(tài)的內(nèi)容,稱作"插值". 為了使用FreeMarker來將數(shù)據(jù)模型中的值合并到模板文件中,可按如下步驟進行: 1,創(chuàng)建Configuration實例,該實例負責管理FreeMarker的模板加載路徑,負責生成模板實例 2,使用Configuration實例來生成Template實例,同進需要指定使用的模板文件 3,填充數(shù)據(jù)模型,數(shù)據(jù)模型就是一個Map對象 4,調(diào)用Template實例的process方法完成合并. 下面是一個使用FreeMarker創(chuàng)建輸出的Java程序,程序源代碼如下: package lee; import java.util.*; import java.io.*; import freemarker.template.*; public class HelloFreeMarker { private Configuration cfg; public void init() throws Exception { //初始化FreeMarker配置 //創(chuàng)建一個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" , "您已經(jīng)完成了第一個FreeMarker的示例"); Template t = cfg.getTemplate("test.ftl"); t.process(root, new OutputStreamWriter(System.out)); } public static void main(String[] args)throws Exception { HelloFreeMarker hf = new HelloFreeMarker(); hf.init(); hf.process(); } } 上面的代碼創(chuàng)建了一個Map實例,這個Map將作為模板文件的數(shù)據(jù)模型,我們要使用FreeMarker必須導入freemarker.jar文件,FreeMarker的官網(wǎng)是http://freemarker./,雖然FreeMarker可以在Java程序中使用,但大部分時候還是用來生成HTML頁面. 在Web應用中使用FreeMarker 在Web應用中使用FreeMarker跟在Java程序中使用并沒有太大的區(qū)別.下面是一個在Web中使用的例子,用來生成HTML頁面的模板文件內(nèi)容如下: <html> <head> <title>FreeMarker的HelloWorld</title> </head> <body> ${message} </body> </html> 我們在Web應用中使用FreeMarker時,應該讓Servlet來合并模板和數(shù)據(jù),因此,Servlet負責創(chuàng)建Configuration實例,并負責合并模板和數(shù)據(jù),下面是Servlet源代碼: package lee; import java.util.*; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import freemarker.template.*; public class HelloServlet extends HttpServlet { private Configuration cfg; public void init() { //初始化FreeMarker配置 //創(chuàng)建一個Configuration實例 cfg = new Configuration(); //設置FreeMarker的模版文件位置 cfg.setServletContextForTemplateLoading(getServletContext(), "WEB-INF/templates"); } public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //建立數(shù)據(jù)模型 Map root = new HashMap(); root.put("message", "Hello FreeMarker!"); //取得模版文件 Template t = cfg.getTemplate("test.ftl"); // 開始準備生成輸出 // - 使用模版文件的charset作為本頁面的charset // - 使用text/html MIME-type response.setContentType("text/html; charset=" + t.getEncoding()); Writer out = response.getWriter(); //合并數(shù)據(jù)模型和模版,并將結(jié)果輸出到out中 try { t.process(root, out); } catch (TemplateException e) { throw new ServletException("處理Template模版中出現(xiàn)錯誤", e); } } } 可以看到這個Servlet類的代碼與普通的Java程序中使用FreeMarker大致一樣,區(qū)別有兩個:1,設置FreeMarker加載模板的方法不一樣,在Servlet中設置加載的方法是setServletContextForTemplateLoading,第一個參數(shù)是本web應用的ServletContext,第二個參數(shù)是模板文件的路徑.;2,結(jié)果必須輸出到HttpServletResponse中,才能被瀏覽器加載. 配置Servlet的web.xml文件中的代碼如下: <web-app> <servlet> <servlet-name>hello</servlet-name> <servlet-class>lee.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app>
轉(zhuǎn)載請注明出處: 程序員之家 http://www. |
|
|