随笔-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.blogjava.net/bolo
posted on 2013-09-29 11:46 菠萝大象 阅读(7131) 评论(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的事务管理下,不过反正是个读,也没必要用到事务了。
谢谢你的解答。  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: