<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    void

    Struts2下使用FreeMarker

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

    FreeMarker采用${…}的語法形式在模塊中充當(dāng)占位符,運(yùn)行時(shí),由模板引擎解析模板,并用動(dòng)態(tài)數(shù)據(jù)替換${…}部分的內(nèi)容。FreeMarker不僅可以用作表現(xiàn)層的實(shí)現(xiàn)技術(shù),還可以生成XMLJspJava文件等。

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

    ◆普通文本

    ◆注釋 <#--注釋內(nèi)容-->

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

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

     

    一、使用FreeMarker作為Struts2表現(xiàn)層的示例

    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. <#--循環(huán)list里的內(nèi)容-->  
    10. <#list list as item>  
    11. ${item}  
    12. </#list>  
    13. </body>  
    14. </html>  

     

    生成的頁面如下:

     

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

     

    為了使用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對象

    4,調(diào)用Template實(shí)例的process方法完成合并

    1. private static void createAction() throws Exception {  
    2.     // 第一步:創(chuàng)建freemarker.template.Configuration實(shí)例  
    3.     Configuration cfg = new Configuration();  
    4.     File directory = new File("src/resources/template");  
    5.     // 指定.ftl模板路徑  
    6.     cfg.setDirectoryForTemplateLoading(directory);  
    7.   
    8.     // 第二步:使用Configuration實(shí)例來生成Template實(shí)例,同進(jìn)需要指定使用的模板文件  
    9.     String tempFile = "action.ftl";  
    10.     Template template = cfg.getTemplate(tempFile);  
    11.   
    12.     // 第三步:填充數(shù)據(jù)模型,數(shù)據(jù)模型就是一個(gè)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.     // 第四步:調(diào)用Template實(shí)例的process方法完成合并  
    20.     Writer writer = new FileWriter("./bin/createAction.java");  
    21.     template.process(map, writer);  
    22. }  

     

    action.ftl模板內(nèi)容如下:

    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. }  

     

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

    import com.opensymphony.xwork2.ActionSupport;

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

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

    PS:在上面的示例完成后又在工程下做了一些其他的示例,這兩天學(xué)習(xí)FreeMarker重新運(yùn)行第一個(gè)示例時(shí)FreeMarker卻報(bào)錯(cuò)了,提示無法獲取list變量,錯(cuò)誤信息如下:

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

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

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



    轉(zhuǎn)自 http://blog.csdn.net/cuihaiyang/article/details/6227409

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

    Feedback

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

    什么嘛  回復(fù)  更多評論   


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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 久久国产乱子伦精品免费午夜| 免费一级毛片在线播放放视频| 久久大香伊焦在人线免费| 亚洲va久久久噜噜噜久久男同| 美丽姑娘免费观看在线观看中文版 | 免费一级不卡毛片| 亚洲图片激情小说| 巨胸喷奶水视频www网免费| 久久亚洲AV成人无码国产最大| 日产国产精品亚洲系列| 亚洲免费无码在线| 亚洲熟妇av一区二区三区下载| 国产成人免费高清激情视频| 爱情岛论坛免费视频| 色拍自拍亚洲综合图区| 精品国产免费观看久久久| 国产福利免费视频 | 美女视频黄a视频全免费网站色| 亚洲w码欧洲s码免费| 亚洲不卡无码av中文字幕| 国产午夜精品免费一区二区三区 | 国产网站免费观看| 日韩精品免费在线视频| a级毛片免费观看在线| 免费毛片毛片网址| 精品免费AV一区二区三区| 亚洲国产精品自在在线观看 | 亚洲av无码专区在线电影| 亚洲a级在线观看| 亚洲视频国产精品| 亚洲精品无码久久久久AV麻豆| 在线观看免费av网站| 色哟哟国产精品免费观看| 亚洲六月丁香六月婷婷蜜芽 | 四虎国产精品成人免费久久| 午夜亚洲乱码伦小说区69堂| 在线亚洲v日韩v| 高潮毛片无遮挡高清免费| 一区二区三区免费在线视频 | 亚洲国产一级在线观看| 精品国产亚洲一区二区在线观看|