FreeMarker模板文件主要由如下4個(gè)部分組成: 1,文本:直接輸出的部分 2,注釋:<#-- ... -->格式部分,不會(huì)輸出 3,插值:即${...}或#{...}格式的部分,將使用數(shù)據(jù)模型中的部分替代輸出 4,FTL指令:FreeMarker指定,和HTML標(biāo)記類似,名字前加#予以區(qū)分,不會(huì)輸出 下面是一個(gè)FreeMarker模板的例子,包含了以上所說的4個(gè)部分 <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的模板就是一個(gè).ftl文本文件,在該文件中使用了一些FreeMarker的特別標(biāo)記,這些標(biāo)記會(huì)動(dòng)態(tài)顯示,或者控制程序輸出,如下面的模板文件代碼: ${name},你好!${msg} 這里類似于${}的就是動(dòng)態(tài)的內(nèi)容,稱作"插值". 為了使用FreeMarker來將數(shù)據(jù)模型中的值合并到模板文件中,可按如下步驟進(jìn)行: 1,創(chuàng)建Configuration實(shí)例,該實(shí)例負(fù)責(zé)管理FreeMarker的模板加載路徑,負(fù)責(zé)生成模板實(shí)例 2,使用Configuration實(shí)例來生成Template實(shí)例,同進(jìn)需要指定使用的模板文件 3,填充數(shù)據(jù)模型,數(shù)據(jù)模型就是一個(gè)Map對(duì)象 4,調(diào)用Template實(shí)例的process方法完成合并. 下面是一個(gè)使用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)建一個(gè)Configuration實(shí)例 cfg = new Configuration(); //設(shè)置FreeMarker的模版文件位置 cfg.setDirectoryForTemplateLoading(new File("templates")); } public void process()throws Exception { Map root = new HashMap(); root.put("name", "FreeMarker!"); root.put("msg" , "您已經(jīng)完成了第一個(gè)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)建了一個(gè)Map實(shí)例,這個(gè)Map將作為模板文件的數(shù)據(jù)模型,我們要使用FreeMarker必須導(dǎo)入freemarker.jar文件,FreeMarker的官網(wǎng)是http://freemarker./,雖然FreeMarker可以在Java程序中使用,但大部分時(shí)候還是用來生成HTML頁面. 在Web應(yīng)用中使用FreeMarker 在Web應(yīng)用中使用FreeMarker跟在Java程序中使用并沒有太大的區(qū)別.下面是一個(gè)在Web中使用的例子,用來生成HTML頁面的模板文件內(nèi)容如下: <html> <head> <title>FreeMarker的HelloWorld</title> </head> <body> ${message} </body> </html> 我們?cè)?/span>Web應(yīng)用中使用FreeMarker時(shí),應(yīng)該讓Servlet來合并模板和數(shù)據(jù),因此,Servlet負(fù)責(zé)創(chuàng)建Configuration實(shí)例,并負(fù)責(zé)合并模板和數(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)建一個(gè)Configuration實(shí)例 cfg = new Configuration(); //設(shè)置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"); // 開始準(zhǔn)備生成輸出 // - 使用模版文件的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)錯(cuò)誤", e); } } } 可以看到這個(gè)Servlet類的代碼與普通的Java程序中使用FreeMarker大致一樣,區(qū)別有兩個(gè):1,設(shè)置FreeMarker加載模板的方法不一樣,在Servlet中設(shè)置加載的方法是setServletContextForTemplateLoading,第一個(gè)參數(shù)是本web應(yīng)用的ServletContext,第二個(gè)參數(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)載請(qǐng)注明出處: 程序員之家 http://www. |
|