基于SSM3框架FreeMarker自定义指令(标签)实现

基于SSM3框架FreeMarker自定义指令(标签)实现
    通过之前的 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
     基于SSM3框架FreeMarker自定义指令(标签)实现_第1张图片
    本例只为了说明如何实现,简便起见,所以用了 DictContext 这个模拟数据字典类。
    
    我模拟了性别和学历的数据,实际开发中,这些都是从数据库取得,原理都差不多,这里主要是为了演示。 xb01 xl01 这个标识大家可以随意定义只要保证唯一性就可以了,该类中还有两个取数据的方法,请直接看源码,这里就不再说明了。
    接下来我们就可以来创建 DictSelectDirective 这个类。
    
    上面这些参数,都是从模板页的自定义指令中获取的,根据我们想创建的这个 select FreeMarker 指令,可以定义任何我们想要的东西。因为最终生成的就是一段 select html 代码。
    通过 params.get() 获得的参数有类型要求,不同的值需要对其转型到相应类型。所以你不能将 select name 类型转为 SimpleNumber 。另外还有一点要注意, FreeMarker 对值的类型很敏感,什么意思呢?比如 params.get( "value" ); 这是获得数据库中对应的字典值,对于这个值请一定要统一定义数据类型,比如都为整型或是字符串型,否则就会转换失败。所以大象在这里为了演示用到了 TemplateModel 接口,它是所有模板数据类型的超类。虽然这样做可以避免类型转换的错误,但同时会增加类型解析的代码量,所以完全没有必要,因为只要前期规划设计好,这类问题完全可以避免。
     DictSelectDirective 里面其它代码就是拼装 select ,这个请直接看源码,另外代码中用到了一个第三方开源工具 commons-lang ,所以 pom 中需要加入这个依赖。
        
     注意红色框部分的代码,我在之前就说过,如果类型不确定,使用 TemplateModel ,就需要做类型解析的分析。而 DictContext. getInstance().getDict(type.getAsString()) 是获得对应类型的数据字典, for 循环将数据拼装到 option 中,如果是编辑表单, value 有值,则会将对应的 option 选中。
     DictDisplayDirective 实现更简单,方法 DictSelectDirective 一样,这里就不再赘述。
     想让 FreeMarker 的指令发挥作用,我们还有一些工作要做。下面这些源码中都有,可以直接查看代码。
     1 servlet-context.xml 里面加入红色方框中的内容
     
     2 、在数据库的 role 表中,增加 sex edu 两个字段
     3 、在 Role.java 中添加 sex edu 属性及 getter setter 方法
     4 、修改 RoleMapper.xml insert update 语句,增加 sex edu 的保存与更新。 < sql id="base_column"> 也要增加 sex edu 字段。
     5 、修改 role_edit.html ,增加性别与学历的 FreeMarker 指令。
    
     6 、修改 role_list.html ,增加性别与学历显示。
    
     7 role_view.html 也作相应修改,略。
     整个 FreeMarker 自定义指令(标签)的实现就这些,非常简单,大家还可以自行扩展,比如根据自身的业务需要,创建 checkbox radio 等指令,或者是多个 value 值的文本显示,这些原理都是一样的。
     源码下载: ssm3_freemarker   
     本文为菠萝大象原创,如要转载请注明出处。http://www.blogjava.net/bolo

你可能感兴趣的:(基于SSM3框架FreeMarker自定义指令(标签)实现)