void

          Struts2下使用FreeMarker

          當今的頁面展示技術主要分為兩種:基于JSP和EL表達式、采用模板引擎(FreeMarker、Velocity等)。 FreeMarker是一個用java語言編寫的模板引擎,它基于模板生成文本輸出。它強制將展示層和業務邏輯層分開,使開發人員不能像JSP頁面那樣在頁面中添加業務邏輯。

          FreeMarker采用${…}的語法形式在模塊中充當占位符,運行時,由模板引擎解析模板,并用動態數據替換${…}部分的內容。FreeMarker不僅可以用作表現層的實現技術,還可以生成XMLJspJava文件等。

          FreeMarker模板主要由四部分組成 :

          ◆普通文本

          ◆注釋 <#--注釋內容-->

          插值:${..}和#{..} 

          ◆FTL標簽。FTL標簽的名字以#開始,如:<#if user=“admin”>…</#if>;自定義標簽使用@代替#。

           

          一、使用FreeMarker作為Struts2表現層的示例

          1. package com.action.convention;  
          2.   
          3. import java.util.ArrayList;  
          4. import java.util.List;  
          5. import org.apache.struts2.convention.annotation.Action;  
          6. import org.apache.struts2.convention.annotation.Result;  
          7. import com.opensymphony.xwork2.ActionSupport;  
          8.   
          9. @Result(name = "success", location = "/freemarker.ftl")  
          10. public class HelloAction extends ActionSupport {  
          11.   
          12.     public String execute() {  
          13.         System.out.println("execute");  
          14.         return SUCCESS;  
          15.     }  
          16.   
          17.     public List<String> getList() {  
          18.         List<String> list = new ArrayList<String>();  
          19.         list.add("aaa");  
          20.         list.add("bbb");  
          21.         list.add("ccc");  
          22.         list.add("ddd");  
          23.         return list;  
          24.     }  
          25. }  

           

          freemarker.ftl

          1. <html>  
          2. <head>  
          3. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">  
          4. <title>Insert title here</title>  
          5. </head>  
          6. <body>  
          7. This is my first freemarker page!  
          8. <br/>  
          9. <#--循環list里的內容-->  
          10. <#list list as item>  
          11. ${item}  
          12. </#list>  
          13. </body>  
          14. </html>  

           

          生成的頁面如下:

           

          二、使用FreeMarker模板生成Action示例

           

          為了使用FreeMarker來將數據模型中的值合并到模板文件中,可按如下步驟進行:

          1,創建Configuration實例,該實例負責管理FreeMarker的模板加載路徑,負責生成模板實例

          2,使用Configuration實例來生成Template實例,同進需要指定使用的模板文件

          3,填充數據模型,數據模型就是一個Map對象

          4,調用Template實例的process方法完成合并

          1. private static void createAction() throws Exception {  
          2.     // 第一步:創建freemarker.template.Configuration實例  
          3.     Configuration cfg = new Configuration();  
          4.     File directory = new File("src/resources/template");  
          5.     // 指定.ftl模板路徑  
          6.     cfg.setDirectoryForTemplateLoading(directory);  
          7.   
          8.     // 第二步:使用Configuration實例來生成Template實例,同進需要指定使用的模板文件  
          9.     String tempFile = "action.ftl";  
          10.     Template template = cfg.getTemplate(tempFile);  
          11.   
          12.     // 第三步:填充數據模型,數據模型就是一個Map對象  
          13.     LoginUser user1 = new LoginUser();  
          14.     user1.setUsername("Cui");  
          15.     user1.setPassword("1212");  
          16.     Map<String, Object> map = new HashMap<String, Object>();  
          17.     map.put("user", user1);  
          18.   
          19.     // 第四步:調用Template實例的process方法完成合并  
          20.     Writer writer = new FileWriter("./bin/createAction.java");  
          21.     template.process(map, writer);  
          22. }  

           

          action.ftl模板內容如下:

          1. import com.opensymphony.xwork2.ActionSupport;  
          2.   
          3. public class ${user.username}Action extents ActionSupport{  
          4. public String execute() {  
          5.         System.out.println("${user.password}");  
          6.         return SUCCESS;  
          7.     }  
          8. }  

           

          運行測試方法createAction()在指定路徑下生成createAction.java文件,文件內容如下:

          import com.opensymphony.xwork2.ActionSupport;

          public class CuiAction extents ActionSupport{
          public String execute() {
                  System.out.println("1212");
                  return SUCCESS;
              }
          }

          可見,用user對象的值填充了freemarker文件中的占位符。

          PS:在上面的示例完成后又在工程下做了一些其他的示例,這兩天學習FreeMarker重新運行第一個示例時FreeMarker卻報錯了,提示無法獲取list變量,錯誤信息如下:

             把list放入Session中可以正常顯示,但是手動把變量放入Session中不僅麻煩session也會越來越大,這樣肯定不能解決問題。重新創建了一個strut2工程,取消了struts-convention插件支持,測試成功,這讓我懷疑是struts-convention插件對FreeMarker的支持有問題,但寫這篇博客時做的示例就好好的。后來換到LoginAction下進行測試,但是又發現一個問題:登錄form中的username和password無法通過屬性驅動傳遞到LoginAction的username和password屬性中,提取參數并將參數傳遞給Action屬性的工作是由param攔截器實現的,難不成param攔截器出問題了?應該也不會,上網搜了一下發現http://topic.csdn.net/u/20110213/14/59b09329-b292-4164-a0fa-e2e6d7fa20d8.html?65640中遇到的問題和我的一樣,他提到去掉AOP支持就可以正常傳值,這才想到自己前幾天做了一個Spring AOP的示例,把applicationContext.xml中關于AOP的配置去掉,頁面到Action的傳值成功,Action中的屬性傳值給FreeMarker模板也成功了。關于Spring AOP造成傳值失敗需要再查找一下。

          分享到: 
        1. 上一篇:JQuery日期插件datepicker的使用
        2. 下一篇:SSH下Action中無法注入業務bean的解決方法
        3. 查看評論
          1樓 zrzking 2012-05-28 13:47發表 [回復]
          我也遇到類似問題,很是困擾,最后是如何解決的?
          Re: cuisea 2012-06-01 13:58發表 [回復]
          回復zrzking:你也用到AOP了嗎?我的報錯是因為自定義了一個AOP攔截器:
          1. @Aspect  
          2. public class SecurityHandler {  
          3.     // 在執行指定方法前執行  
          4.     @Before("execution(* add*(..))")  
          5.     private void checkSecurity() {  
          6.         System.out.println("添加前檢查通過");  
          7.     }  
          8.   
          9.     // 在執行指定方法后執行  
          10.     @After("execution(* add*(..))")  
          11.     private void checkResult() {  
          12.         System.out.println("添加后檢查通過");  
          13.     }  
          14. }  

          這個示例測試操作add方法,可能對其他攔截器產生影響了,把add改成其他“ff”之類,即攔截其他方法這樣黃頁問題就沒有了。當然你也可以在工程中去掉自定義AOP。



          轉自 http://blog.csdn.net/cuihaiyang/article/details/6227409

          posted on 2013-06-19 08:49 void 閱讀(1037) 評論(1)  編輯  收藏

          Feedback

          # re: Struts2下使用FreeMarker 2016-02-29 09:30 延伸

          什么嘛  回復  更多評論   


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 拉孜县| 广宁县| 永德县| 井冈山市| 绥江县| 白城市| 融水| 荣成市| 道孚县| 敦煌市| 都江堰市| 昔阳县| 藁城市| 贵阳市| 五指山市| 天长市| 南充市| 济阳县| 澎湖县| 邳州市| 五指山市| 娱乐| 普格县| 三原县| 辛集市| 乌拉特后旗| 普安县| 思茅市| 疏勒县| 平定县| 阿拉善右旗| 聊城市| 会昌县| 泗洪县| 宣城市| 河间市| 清原| 潜江市| 商水县| 凤城市| 白朗县|