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

          評論:
          # re: 基于SSM3框架FreeMarker自定義指令(標簽)實現(xiàn) 2014-04-02 14:56 | 王凱文
          講的好阿 ,能把自己懂得東西分享給他人,才是大神.  回復(fù)  更多評論
            
          # re: 基于SSM3框架FreeMarker自定義指令(標簽)實現(xiàn) 2014-08-28 15:35 | 癸亥
          如果要從數(shù)據(jù)庫讀取數(shù)據(jù)字典要怎么實現(xiàn)呢?
          從后臺類不通過controller怎么使用MyBatisDao讀取數(shù)據(jù)庫啊?  回復(fù)  更多評論
            
          # re: 基于SSM3框架FreeMarker自定義指令(標簽)實現(xiàn) 2014-09-03 13:42 | 菠蘿大象
          @癸亥
          數(shù)據(jù)字典放在緩存中,難道你想每次用的時候都去數(shù)據(jù)庫取嗎?  回復(fù)  更多評論
            
          # re: 基于SSM3框架FreeMarker自定義指令(標簽)實現(xiàn) 2014-09-05 16:04 | 癸亥
          @菠蘿大象
          第一次初始化怎么讀數(shù)據(jù)啊。我就是想問第一次怎么連接數(shù)據(jù)庫。我在Java類里調(diào)用不了service啊。DAO也實例化不了。這些是被springMVC管理了。
            回復(fù)  更多評論
            
          # re: 基于SSM3框架FreeMarker自定義指令(標簽)實現(xiàn) 2014-09-15 09:31 | 菠蘿大象
          @癸亥
          service已經(jīng)由spring的IoC容器來管理了,你可以通過WebApplicationContext來拿到這些bean,至于你說的第一次怎么連接,這更不是問題了,有很多方法,比如通過擴展servlet的ServletContextListener或者擴展spring的SmartLifecycle都可以達到你想要的效果  回復(fù)  更多評論
            
          # re: 基于SSM3框架FreeMarker自定義指令(標簽)實現(xiàn) 2014-09-18 09:42 | 癸亥
          @菠蘿大象
          我用一個servlet在工程啟動時使用WebApplicationContext存了一個BeanFactory?,F(xiàn)在已經(jīng)能讀取了。
          缺點是不在spring的事務(wù)管理下,不過反正是個讀,也沒必要用到事務(wù)了。
          謝謝你的解答。  回復(fù)  更多評論
            
          主站蜘蛛池模板: 抚远县| 龙泉市| 义马市| 和静县| 新巴尔虎右旗| 华池县| 肥东县| 治多县| 新津县| 遂昌县| 文化| 简阳市| 特克斯县| 屯留县| 太仓市| 随州市| 平江县| 卢龙县| 绥芬河市| 偃师市| 蕲春县| 仁怀市| 蒙山县| 东源县| 昌乐县| 平和县| 金乡县| 肃宁县| 丰原市| 宝鸡市| 汨罗市| 德惠市| 景宁| 开平市| 石家庄市| 常州市| 错那县| 凤台县| 株洲县| 澳门| 玛沁县|