亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

freemarker快速上手+空值的多種處理方法

系統(tǒng) 1967 0


------------------------------------------------------------
前言:

????? 為什么要用模板?有了JSTL,還需要freemarker嗎?

????? 模板技術(shù)與容器無關(guān),同樣可以應用于非Web應用程序環(huán)境。ftl文件改動之后是不需要編譯的,這點不同于Jsp 。JSTL只能用在jsp中,修改了jsp,需要重新編譯,從而使用模板更有效率。

一、上手實例

? 1. 在WEB-INF/lib中放置freemarker.jar,新建一個Servlet,Hello.java

Java代碼 復制代碼 ? 收藏代碼
  1. package ?com.fbysss.test.servlet;? ??
  2. ??
  3. import ?java.io.IOException;? ??
  4. import ?java.io.Writer;? ??
  5. import ?java.util.HashMap;? ??
  6. import ?java.util.Map;? ??
  7. ??
  8. import ?javax.servlet.ServletException;? ??
  9. import ?javax.servlet.http.HttpServletRequest;? ??
  10. import ?javax.servlet.http.HttpServletResponse;? ??
  11. ??
  12. import ?freemarker.core.Environment;? ??
  13. import ?freemarker.template.Configuration;? ??
  14. import ?freemarker.template.Template;? ??
  15. import ?freemarker.template.TemplateException;? ??
  16. ??
  17. /**? ?
  18. ?*?Servlet?implementation?class?for?Servlet:?hello? ?
  19. ?*? ?
  20. ?*/ ? ??
  21. ? public ? class ?Hello? extends ?javax.servlet.http.HttpServlet? implements ?javax.servlet.Servlet?{? ??
  22. ??? static ? final ? long ?serialVersionUID?=?1L;? ??
  23. ??? private ?Configuration?cfg;? ??
  24. ???? /*?(non-Java-doc)? ?
  25. ?????*?@see?javax.servlet.http.HttpServlet#HttpServlet()? ?
  26. ?????*/ ? ??
  27. ???? public ?Hello()?{? ??
  28. ???????? super ();? ??
  29. ????}???????? ??
  30. ????? ??
  31. ???? /*?(non-Java-doc)? ?
  32. ?????*?@see?javax.servlet.http.HttpServlet#doGet(HttpServletRequest?request,?HttpServletResponse?response)? ?
  33. ?????*/ ? ??
  34. ???? protected ? void ?doGet(HttpServletRequest?request,?HttpServletResponse?response)? throws ?ServletException,?IOException?{? ??
  35. ????????Map?root?=? new ?HashMap();? ??
  36. ????????? ??
  37. ????????root.put( "msg" , "你好,freemarker!" );? ??
  38. ????????root.put( "intValue" ,? 10 );? ??
  39. ????????root.put( "nullTag" ,? "n" );? ??
  40. ????????? ??
  41. ????????Template?template?=?cfg.getTemplate( "test.ftl" );? ??
  42. ???????? //response.setContentType("text/html;charset=gbk");//設定字符集,否則有漢字亂碼? ??
  43. ????????Writer?out?=?response.getWriter();? ??
  44. ??
  45. ???????? try ?{? ??
  46. ???????????? //1.用Enviroment? ??
  47. ????????????Environment?env?=?template.createProcessingEnvironment(root,?out);? ??
  48. ????????????env.setClassicCompatible( true );? ??
  49. ????????????env.process();? ??
  50. ???????????? //2.template.process(root,?out);//兩種方法都可以? ??
  51. ??
  52. ???????????? //out.flush();//清除緩沖區(qū)? ??
  53. ????????}? catch ?(TemplateException?e)?{? ??
  54. ???????????? //?TODO?Auto-generated?catch?block? ??
  55. ????????????e.printStackTrace();? ??
  56. ????????}? ??
  57. ????????? ??
  58. ????}???? ??
  59. ????? ??
  60. ???? /*?(non-Java-doc)? ?
  61. ?????*?@see?javax.servlet.http.HttpServlet#doPost(HttpServletRequest?request,?HttpServletResponse?response)? ?
  62. ?????*/ ? ??
  63. ???? protected ? void ?doPost(HttpServletRequest?request,?HttpServletResponse?response)? throws ?ServletException,?IOException?{? ??
  64. ???????? //?TODO?Auto-generated?method?stub? ??
  65. ????}???????? ??
  66. ????? ??
  67. ??
  68. ???? /*?(non-Javadoc)? ?
  69. ?????*?@see?javax.servlet.GenericServlet#init()? ?
  70. ?????*/ ? ??
  71. ???? public ? void ?init()? throws ?ServletException?{? ??
  72. ???????? //?TODO?Auto-generated?method?stub? ??
  73. ???????? super .init();? ??
  74. ????????cfg?=? new ?Configuration();? ??
  75. ????????? ??
  76. ????????cfg.setServletContextForTemplateLoading(getServletContext(), "WEB-INF/templates" );? ??
  77. ???????? //cfg.setClassicCompatible(true);//處理空值為空字符串? ??
  78. ????????? ??
  79. ????}???? ??
  80. }??
    package com.fbysss.test.servlet; 

import java.io.IOException; 
import java.io.Writer; 
import java.util.HashMap; 
import java.util.Map; 

import javax.servlet.ServletException; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import freemarker.core.Environment; 
import freemarker.template.Configuration; 
import freemarker.template.Template; 
import freemarker.template.TemplateException; 

/** 
 * Servlet implementation class for Servlet: hello 
 * 
 */ 
 public class Hello extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet { 
   static final long serialVersionUID = 1L; 
   private Configuration cfg; 
    /* (non-Java-doc) 
     * @see javax.servlet.http.HttpServlet#HttpServlet() 
     */ 
    public Hello() { 
        super(); 
    }        
     
    /* (non-Java-doc) 
     * @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
     */ 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
        Map root = new HashMap(); 
         
        root.put("msg","你好,freemarker!"); 
        root.put("intValue", 10); 
        root.put("nullTag", "n"); 
         
        Template template = cfg.getTemplate("test.ftl"); 
        //response.setContentType("text/html;charset=gbk");//設定字符集,否則有漢字亂碼 
        Writer out = response.getWriter(); 

        try { 
            //1.用Enviroment 
            Environment env = template.createProcessingEnvironment(root, out); 
            env.setClassicCompatible(true); 
            env.process(); 
            //2.template.process(root, out);//兩種方法都可以 

            //out.flush();//清除緩沖區(qū) 
        } catch (TemplateException e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
        } 
         
    }    
     
    /* (non-Java-doc) 
     * @see javax.servlet.http.HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
     */ 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
        // TODO Auto-generated method stub 
    }        
     

    /* (non-Javadoc) 
     * @see javax.servlet.GenericServlet#init() 
     */ 
    public void init() throws ServletException { 
        // TODO Auto-generated method stub 
        super.init(); 
        cfg = new Configuration(); 
         
        cfg.setServletContextForTemplateLoading(getServletContext(),"WEB-INF/templates"); 
        //cfg.setClassicCompatible(true);//處理空值為空字符串 
         
    }    
}
  



2.在WEB-INF/templates/下建立test.ftl文件


Freemarker代碼 復制代碼 ? 收藏代碼
  1. <!--#escape?x?as?x! "" -->? ??
  2. <!--#setting?classic_compatible=true-->? ??
  3. <html>? ??
  4. <head>? ??
  5. ??<title>FreeMarker?Example?</title>? ??
  6. </head>? ??
  7. <body>? ??
  8. ??${msg}? ??
  9. ??${intValue}? ??
  10. ??${empty?default( "empty?Value" )}? ??
  11. ??${empty!}? ??
  12. ??${newTag}? ??
  13. ??${nullTag}? ??
  14. </body>? ??
  15. </html>? ??
  16. <!--/#escape-->???
    <!--#escape x as x!""--> 
<!--#setting classic_compatible=true--> 
<html> 
<head> 
  <title>FreeMarker Example </title> 
</head> 
<body> 
  ${msg} 
  ${intValue} 
  ${empty?default("empty Value")} 
  ${empty!} 
  ${newTag} 
  ${nullTag} 
</body> 
</html> 
<!--/#escape--> 
  


3.測試servlet,看到結(jié)果了,這里主要要注意亂碼和空值的處理。亂碼問題,把//response.setContentType("text/html;charset=gbk");注釋去掉即可。下面重點說說空值的處理。

二、空值處理

${empty}
如果empty標簽沒有在servlet中添加key或者值為null,會報錯 empty Value Expression newTag is undefined。
有人說這是個好的控制錯誤的機制,但本人不這么認為,因為空值太常見了,誰知道什么時候里面就成空值了?每個變量理論上都有可能。
難道每個變量都要加入一個判斷?就像struts中丑陋的<empty>標簽?既然是模板引擎,就要靈活,何必來那么多限制?
還好,freemarker至少提供了解決辦法,否則我只好選擇其它引擎了。
freemarker中空值的多種處理方法:
1.按照freemarker的規(guī)范,老老實實的判斷是否有空值,有空值怎么處理。這在某種時候是有用的。格式:${empty!"EmptyValue of fbysss"}
比如值為空時,你可以給出一個友好的說明,但是很多的變量都要這么說明,未免太麻煩了。
2.<#escape x as x!""></#escape>可以對所有的變量進行空值處理,這里是全部替換為空字符串。當然也可以替換為其它字符串。
如果其中某些變量不需要這種替換,可以加入<#noescape></#noescape>標簽。
3.屬性配置方法:
配置classic_compatible=true可以滿足一般需要。默認情況變量為null則替換為空字符串,如果需要自定義,寫上${empty!"EmptyValue of fbysss"}的形式即可
a.通過Configuration設置。Configuration cfg = new Configuration(); cfg.setClassicCompatible(true);//設置屬性
b.通過Eviroment設置。
?? Environment env = template.createProcessingEnvironment(root, out);
?? env.setClassicCompatible(true);
c.通過ftl設置:在ftl前加入<!--#setting classic_compatible=true-->,
d.通過Spring配置文件設置

Xml代碼 復制代碼 ? 收藏代碼
  1. < bean ? id = "freemarkerConfig" ??
  2. ???? class = "org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer" > ??
  3. ?? < property ? name = "freemarkerSettings" > ??
  4. ???? < props > ??
  5. ?????? < prop ? key = "classic_compatible" > true </ prop > ??
  6. ???? </ props > ??
  7. ?? </ property > ??
  8. </ bean > ??
    <bean id="freemarkerConfig"
    class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
  <property name="freemarkerSettings">
    <props>
      <prop key="classic_compatible">true</prop>
    </props>
  </property>
</bean>
  



e.class目錄下添加freemarker.properties文件:加入classic_compatible=true
(需要struts2或spring)

舉一反三,其他屬性也可以用類似方法進行設置。

?

?

轉(zhuǎn)自: http://huxiao.iteye.com/blog/470927

freemarker快速上手+空值的多種處理方法


更多文章、技術(shù)交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲视频网 | 久久综合综合 | ww亚洲ww在线观看国产 | 激情五月婷婷基地 | 国产精品久久久久久久久久影院 | 俄罗斯毛片免费大全 | 91国内精品视频 | 成年人黄色小视频 | 久青草国产视频 | 四虎成人精品在永久免费 | 日日干夜夜骑 | 欧美一区在线观看视频 | 亚洲国产精品久久综合 | 日韩精品中文字幕一区三区 | 91精品国产免费久久久久久 | 99精品久久久久久久婷婷 | 久久综合久色欧美婷婷 | 色插综合 | 久久精品在线免费观看 | 亚洲成在人网站天堂一区二区 | 亚洲精品1区 | 亚洲狠狠操| 国产精品一级毛片不收费 | 国产高清自拍一区 | 欧美视频在线观看免费 | www.日韩视频 | 欧美日韩色综合网站 | 亚洲伊人久久综合影院2021 | 亚洲va在线va天堂va四虎 | 水浒传删减剧情在线观看 | 视频二区 素人 欧美 日韩 | 日本不卡在线视频 | 日本精品一区二区三区在线观看 | 国内精品久久影院 | 久久久久久久久久久9精品视频 | 蜜桃久久久久久久久久久 | 亚洲第一综合网站 | 免费的爱爱视频 | 精品欧美一区二区三区免费观看 | 啪啪综合网 | 国产日韩一区二区三区在线播放 |