freemarker學習記錄

來源:互聯網
上載者:User

主要涉及到三個檔案

1,TestServlet.java如下:

package example;import freemarker.template.Configuration;import freemarker.template.Template;import freemarker.template.TemplateException;import java.io.BufferedWriter;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.io.PrintWriter;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Calendar;import java.util.Date;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.logging.Level;import java.util.logging.Logger;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/*** 測試* @author wesley*/public class TestServlet extends HttpServlet {    private Configuration cfg;    protected void processRequest(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        //初始化FreeMarker配置,建立Configuration執行個體        cfg = new Configuration();        cfg.setDefaultEncoding("UTF-8");        //設定FreeMarker的模版檔案位置        cfg.setServletContextForTemplateLoading(getServletContext(), "templates");        //建立資料模型        Map root = new HashMap();        //放入對應資料        root.put("title", "使用Freemarker產生靜態頁面執行個體!");        root.put("content", "FreeMarker是一個模板引擎,一個基於模板產生文本輸出的通用工具,使用純Java編寫FreeMarker被設計用來產生HTML Web頁面,特別是基於MVC模式的應用程式雖然FreeMarker具有一些編程的能力,但通常由Java程式準備要顯示的資料,由FreeMarker產生頁面,通過模板顯示準備的資料(如)");        root.put("author", "小仇");        root.put("answer", 43);                Map latestMap = new HashMap();        latestMap.put("url", "www.baidu.com");        latestMap.put("name", "green mouse");        root.put("latestMap", latestMap);                root.put("indexOf", new IndexOfMethod());                List<Map<String, Object>> list = new ArrayList<Map<String,Object>>();                Map<String, Object> map11 = new HashMap<String, Object>();        map11.put("name", "qiuyujiao1");        map11.put("age", 21);        list.add(map11);                Map<String, Object> map22 = new HashMap<String, Object>();        map22.put("name", "qiuyujiao2");        map22.put("age", 22);        list.add(map22);                Map<String, Object> map33 = new HashMap<String, Object>();        map33.put("name", "qiuyujiao3");        map33.put("age", 23);        list.add(map33);                Map<String, Object> map44 = new HashMap<String, Object>();        map44.put("name", "qiuyujiao4");        map44.put("age", 24);        list.add(map44);                root.put("listtest", list);        //建立模型結束---        //獲得模版檔案        Template template = cfg.getTemplate("test.ftl");         //開始準備產生輸出,使用模版檔案的charset作為本頁面的charset        response.setContentType("text/html;charset=" + template.getEncoding());        PrintWriter printWriter = response.getWriter();         try {            //合并資料模型和模版,並將結果輸出到printWriter中(把資料放到了printWriter裡面跟產生動態網頁面沒關係)            template.process(root, printWriter);            File newHtml = getHtmlFile();            doWrite(template, newHtml.getPath(), root);   //產生靜態頁面            printWriter.print("<a href='"+"2013-01-23"+"/"+newHtml.getName()+"'>"+newHtml.getName()+"</a>");            //            String path = dirName+"/"+newHtml.getName();//            HttpSession session = request.getSession(true);//            session.setAttribute("path", path);                  } catch (Exception ex) {            //Logger.getLogger(TestServlet.class.getName()).log(Level.SEVERE, null, ex);            throw new ServletException("處理Template模版中出現錯誤", ex);        }    }    /**     * 得到已經產生的檔案,以便根據已經產生的檔案擷取檔案名稱字和檔案路徑     * @return  已經產生的檔案     */    private File getHtmlFile(){     long htmlName = Calendar.getInstance().getTimeInMillis();         Date date = new Date(htmlName);         SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");         String dirName = f.format(date);         //存放產生後的靜態頁面的目錄 eg:2008-9-9         String saveDirectory = getServletContext().getRealPath("/") + dirName + "//";         File dir = new File(saveDirectory);         //如果目錄不存在,則建立目錄         if (!dir.exists()) {             dir.mkdir();         }         //產生靜態檔案         File newHtml = new File(dir + "/" + htmlName + ".html");         return newHtml;        }                /**     * 產生靜態檔案     * @param template : 模版     * @param path : 靜態頁面路徑     * @param root : 資料模型     */    private void doWrite(Template template, String path, Map<String, Object> root) {         BufferedWriter bw = null;        try {            bw = new BufferedWriter(new FileWriter(path));            template.setEncoding(cfg.getDefaultEncoding());            template.process(root, bw);            bw.flush();        } catch (TemplateException ex) {            Logger.getLogger(TestServlet.class.getName()).log(Level.SEVERE, null, ex);        } catch (IOException ex) {            Logger.getLogger(TestServlet.class.getName()).log(Level.SEVERE, null, ex);        } finally {            try {                bw.close();            } catch (IOException ex) {                Logger.getLogger(TestServlet.class.getName()).log(Level.SEVERE, null, ex);            }        }    }    @Override    protected void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        processRequest(request, response);    }    @Override    protected void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        processRequest(request, response);    }   }

2,模版檔案rest.fld如下:

<html>    <head>        <title>${title}</title>           </head>    <body>        <h1 style="color: green;">內容:${content}!</h1>        <h3>作者:${author}</h3>        <br> <br> <br> <br> <br> <br> <br>        ------------------         <br> <br>                  ${answer}         <br>         ${answer?string.percent}<#--類型轉換標籤的應用-->                                    ${latestMap.url}${latestMap.name}         <#assign x = "something">   <#--賦值變數-->${indexOf("met", x)}        <#--應用了  方法變數   IndexOfMethod--><br/>${indexOf("foo", x)}    <#list listtest as being>   <#--list標籤的應用-->${being.name}<br>${being.age}</#list>          <br><br>                      <#--自訂的標籤greet--><#macro greet person,website>Hello${person}!<br>YourWebsiteis${website}</#macro>         <#--使用自訂的greet標籤--><@greet person="螢火蟲" website="www.52gua.com"/>                                                               <br>    </body></html>

3,附加的方法變數類IndexOfMethod.java如下

package example;import java.util.List;import freemarker.template.SimpleNumber;import freemarker.template.TemplateMethodModel;import freemarker.template.TemplateModelException;public class IndexOfMethod implements TemplateMethodModel {public Object exec(List args) throws TemplateModelException {// TODO Auto-generated method stubif (args.size() != 2) {throw new TemplateModelException("Wrong arguments");}return new SimpleNumber(((String) args.get(1)).indexOf((String) args.get(0)));}}

簡單項目結構圖如下:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.