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

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

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

    隨筆-67  評論-522  文章-0  trackbacks-0
        通過之前的Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解實例詳解系列文章,我們已經成功的整合到了一起,這次大象將在此基礎上對框架中的FreeMarker模板做一個擴展,詳細說明如何實現自定義指令(標簽)功能。
        我們在開發的時候,往往對一些數據字典形式的數據,想將它封裝成通用的模塊以便于使用,如果使用JSP做展示層,可以創建自定義標簽來實現,現在換成FreeMarker視圖,我們一樣可以達到想要的目的。
        實現FreeMarker指令其實很簡單,只要實現TemplateDirectiveModel接口,覆蓋里面的方法即可。
        public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException
        大象以select下拉框及顯示數據字典文本兩個自定義指令為例來進行說明。
        在ssm3工程中按下圖創建freemarker package
        
        本例只為了說明如何實現,簡便起見,所以用了DictContext這個模擬數據字典類。
        
        我模擬了性別和學歷的數據,實際開發中,這些都是從數據庫取得,原理都差不多,這里主要是為了演示。xb01xl01這個標識大家可以隨意定義只要保證唯一性就可以了,該類中還有兩個取數據的方法,請直接看源碼,這里就不再說明了。
        接下來我們就可以來創建DictSelectDirective這個類。
        
        上面這些參數,都是從模板頁的自定義指令中獲取的,根據我們想創建的這個select FreeMarker指令,可以定義任何我們想要的東西。因為最終生成的就是一段select html代碼。
        通過params.get()獲得的參數有類型要求,不同的值需要對其轉型到相應類型。所以你不能將selectname類型轉為SimpleNumber。另外還有一點要注意,FreeMarker對值的類型很敏感,什么意思呢?比如params.get("value");這是獲得數據庫中對應的字典值,對于這個值請一定要統一定義數據類型,比如都為整型或是字符串型,否則就會轉換失敗。所以大象在這里為了演示用到了TemplateModel接口,它是所有模板數據類型的超類。雖然這樣做可以避免類型轉換的錯誤,但同時會增加類型解析的代碼量,所以完全沒有必要,因為只要前期規劃設計好,這類問題完全可以避免。
        DictSelectDirective里面其它代碼就是拼裝select,這個請直接看源碼,另外代碼中用到了一個第三方開源工具commons-lang,所以pom中需要加入這個依賴。
           
        注意紅色框部分的代碼,我在之前就說過,如果類型不確定,使用TemplateModel,就需要做類型解析的分析。而DictContext.getInstance().getDict(type.getAsString())是獲得對應類型的數據字典,for循環將數據拼裝到option中,如果是編輯表單,value有值,則會將對應的option選中。
        DictDisplayDirective實現更簡單,方法DictSelectDirective一樣,這里就不再贅述。
        想讓FreeMarker的指令發揮作用,我們還有一些工作要做。下面這些源碼中都有,可以直接查看代碼。
        1servlet-context.xml里面加入紅色方框中的內容
        
        2、在數據庫的role表中,增加sexedu兩個字段
        3、在Role.java中添加sexedu屬性及gettersetter方法
        4、修改RoleMapper.xmlinsertupdate語句,增加sexedu的保存與更新。<sql id="base_column">也要增加sexedu字段。
        5、修改role_edit.html,增加性別與學歷的FreeMarker指令。
        
        6、修改role_list.html,增加性別與學歷顯示。
        
        7role_view.html也作相應修改,略。
        整個FreeMarker自定義指令(標簽)的實現就這些,非常簡單,大家還可以自行擴展,比如根據自身的業務需要,創建checkboxradio等指令,或者是多個value值的文本顯示,這些原理都是一樣的。
        源碼下載:ssm3_freemarker   
        本文為菠蘿大象原創,如要轉載請注明出處。http://www.tkk7.com/bolo
    posted on 2013-09-29 11:46 菠蘿大象 閱讀(7587) 評論(6)  編輯  收藏 所屬分類: Spring3

    評論:
    # re: 基于SSM3框架FreeMarker自定義指令(標簽)實現 2014-04-02 14:56 | 王凱文
    講的好阿 ,能把自己懂得東西分享給他人,才是大神.  回復  更多評論
      
    # re: 基于SSM3框架FreeMarker自定義指令(標簽)實現 2014-08-28 15:35 | 癸亥
    如果要從數據庫讀取數據字典要怎么實現呢?
    從后臺類不通過controller怎么使用MyBatisDao讀取數據庫啊?  回復  更多評論
      
    # re: 基于SSM3框架FreeMarker自定義指令(標簽)實現 2014-09-03 13:42 | 菠蘿大象
    @癸亥
    數據字典放在緩存中,難道你想每次用的時候都去數據庫取嗎?  回復  更多評論
      
    # re: 基于SSM3框架FreeMarker自定義指令(標簽)實現 2014-09-05 16:04 | 癸亥
    @菠蘿大象
    第一次初始化怎么讀數據啊。我就是想問第一次怎么連接數據庫。我在Java類里調用不了service啊。DAO也實例化不了。這些是被springMVC管理了。
      回復  更多評論
      
    # re: 基于SSM3框架FreeMarker自定義指令(標簽)實現 2014-09-15 09:31 | 菠蘿大象
    @癸亥
    service已經由spring的IoC容器來管理了,你可以通過WebApplicationContext來拿到這些bean,至于你說的第一次怎么連接,這更不是問題了,有很多方法,比如通過擴展servlet的ServletContextListener或者擴展spring的SmartLifecycle都可以達到你想要的效果  回復  更多評論
      
    # re: 基于SSM3框架FreeMarker自定義指令(標簽)實現 2014-09-18 09:42 | 癸亥
    @菠蘿大象
    我用一個servlet在工程啟動時使用WebApplicationContext存了一個BeanFactory。現在已經能讀取了。
    缺點是不在spring的事務管理下,不過反正是個讀,也沒必要用到事務了。
    謝謝你的解答。  回復  更多評論
      
    主站蜘蛛池模板: 中文字幕在亚洲第一在线| 亚洲欧洲国产成人综合在线观看 | 69堂人成无码免费视频果冻传媒| 日本免费v片一二三区| 国产AV旡码专区亚洲AV苍井空| 91免费播放人人爽人人快乐| 亚洲人和日本人jizz| 97在线观免费视频观看| 亚洲欧洲日本在线观看| 性色av免费观看| 欧洲亚洲综合一区二区三区| 亚洲日韩涩涩成人午夜私人影院| 成年大片免费高清在线看黄| 中文字幕不卡亚洲 | 啦啦啦完整版免费视频在线观看 | 国产亚洲精aa成人网站| 东北美女野外bbwbbw免费| 亚洲AV无码不卡在线播放| 30岁的女人韩剧免费观看| 亚洲免费视频观看| 日韩免费视频在线观看| eeuss影院免费92242部| 久久亚洲国产精品五月天| 欧美男同gv免费网站观看| 国产精品亚洲一区二区在线观看| 亚洲国产成人久久精品99| 在线观看免费无码专区| 亚洲一卡2卡3卡4卡国产网站| 日韩成人免费aa在线看| 一级一级一片免费高清| 91亚洲导航深夜福利| 精品久久免费视频| 怡红院免费的全部视频| 亚洲午夜国产精品| 免费播放特黄特色毛片| 久久这里只精品99re免费| 国产成人精品日本亚洲网址| 国产日产亚洲系列| 欧美大尺寸SUV免费| 中文字幕日本人妻久久久免费| jlzzjlzz亚洲jzjzjz|