基于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

本例只为了说明如何实现,简便起见,所以用了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自定义指令(标签)实现的更多相关文章
- freemarker自定义指令
最近项目中使用了spring boot搭建项目,使用spring security管理项目中的权限,使用freemarker作为视图层.为了将权限控制到按钮上,因此考虑直接使用spring secur ...
- 基于Struts2框架实现登录案例 之 程序国际化
国际化牵涉的知识非常多,这里只能简单的介绍,程序国际化的一般做法是:在jsp页面时, 不是直接输出信息,而是输出一个key值,该key值在不同语言环境下找到对应资源文件下的 对应信息,因此首先要创建满 ...
- AngularJs学习笔记(4)——自定义指令
对指令的第一印象:它是一个自定义标签! 先来看一个简单的指令: <!doctype html> <html ng-app="myApp"> <head ...
- freemarker自定义标签(三)-nested指令
freemarker自定义标签 1.nested指令 是可选的,可以在<#macro>和</#macro>之间使用在任何位置和任意次数 2.示例说明 <#macro ta ...
- vue_简介_渐进式 js 框架_内置指令_自定义指令_自定义插件
vue 尤雨溪 华裔 Google 工程师 遵循 MVVM 模式 编码简洁,体积小,运行效率高,适合 移动 / PC 端 开发 动态构建用户界面: 异步获取后台数据,展现到页面 渐进式 js 框架 渐 ...
- freemarker自定义标签(一)
freemarker自定义标签 1.自定义标签说明 宏变量存储模板片段可以被用作自定义指令macro 2.示例说明 <html> <head> <meta http-eq ...
- freemarker自定义标签报错(七)
1.错误描述 六月 09, 2014 11:11:09 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严重: Template proc ...
- freemarker自定义标签(二十一)
一,讲解一 1.自定义标签说明 宏变量存储模板片段可以被用作自定义指令macro 2.示例说明 <html> <head> <meta http-equiv=" ...
- freemarker实现自定义指令和自定义函数
自定义指令: 1.指令在前台实现 <#macro name param1,param2,param3...paramN> </#macro> 2.指令在后台实现 1.实现Tem ...
随机推荐
- (转)为什么在 2013 十月番中出现了很多以 3D 渲染代替传统 2D 绘画来表现人物的镜头?
一直都有的,特别是三次元这家公司一直致力于3d的风格化渲染既大家说的3d转2d.目前最厉害的商业化软件是pencil+,占领大部分的作品.而mentalray,早期用于disney的部分风格化渲染:i ...
- 数据分析处理库Pandas——概述
导入Pandas库 创建DataFrame结构 读取.csv文件 titanic_train.csv文件:https://files.cnblogs.com/files/gloria-zhang/ti ...
- Postgres安装详解
PG安装 一.基础包的安装(yum源的配置,可以采用光盘挂载,及ftp yum源,针对外网环境忽略此步): yum -y install wget tcpdump glibc libgcc gcc g ...
- UVA - 753 A Plug for UNIX(网络流)
题意 给定一些插头设备和插座,有一些方法可以把其中一些插头变成另一种插头.求无法匹配插座的插头设备个数. 题解 用\(map\)给每个字符串标号为\(a_i\)和\(b_i\). 读入每种改变插头的方 ...
- HDU 4857
HDU 4857 (反向拓扑排序 + 优先队列) 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须 ...
- 图学java基础篇之集合工具
两个工具类 java.utils下又两个集合相关_(准确来说其中一个是数组的)_的工具类:Arrays和Collections,其中提供了很多针对集合的操作,其中涵盖了一下几个方面: 拷贝.填充.反转 ...
- Android 自定义 radiobutton
<RadioButton android:id="@+id/radiobutton_pay_method" android:layout_width="30dp&q ...
- Redis实现之整数集合
整数集合 整数集合(insert)是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现.举个栗子,如果我们创建一个只包含五个 ...
- python-day4-内置函数2
摘要:python中有好多可用性特别强的内置函数,熟练掌握对于以后的编程过程中有很大的帮助~~~~ callable函数.chr函数与ord函数.random函数.compile函数.evec与eva ...
- 区分 Cookie, LocalStorage 与 SessionStorage
基本概念 Cookie Cookie 的大小限制为4KB左右,是网景公司的前雇员 Lou Montulli 在1993年3月的发明.它的主要用途有保存登录信息,比如你登录某个网站市场可以看到“记住密码 ...