菠萝大象
用心思考,用心写作
首页
新随笔
联系
管理
随笔-67 评论-522 文章-0 trackbacks-0
基于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
posted on 2013-09-29 11:46
菠萝大象
阅读(7573)
评论(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的事务管理下,不过反正是个读,也没必要用到事务了。
谢谢你的解答。
回复
更多评论
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
Chat2DB
C++博客
博问
管理
相关文章:
Quartz Spring与Spring Task总结
基于SSM3框架使用FreeMarker模板生成静态页的实现
基于Spring MVC框架JSR-303的自定义注解Validator验证实现
基于Spring MVC框架的异常隐藏实现方法
解决Spring MVC框架静态资源文件显示问题
基于SSM3框架FreeMarker自定义指令(标签)实现
Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(五)
Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(四)
Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(三)
Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(二)
<
2013年9月
>
日
一
二
三
四
五
六
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
随笔分类
(67)
Concurrency(3)
Database(4)
dom4j&jdom(3)
Eclipse(3)
Flex(4)
Hibernate(2)
Java(11)
jBPM(1)
jQuery(5)
Linux(1)
mybatis-generator(3)
Spring3(11)
Struts2(9)
随笔(7)
随笔档案
(67)
2015年9月 (1)
2015年8月 (1)
2015年7月 (1)
2015年5月 (1)
2015年4月 (1)
2015年3月 (3)
2015年2月 (1)
2015年1月 (2)
2014年8月 (1)
2014年6月 (2)
2014年5月 (2)
2014年4月 (3)
2014年3月 (1)
2014年2月 (1)
2014年1月 (2)
2013年12月 (3)
2013年11月 (2)
2013年10月 (2)
2013年9月 (2)
2012年5月 (1)
2012年4月 (2)
2011年8月 (1)
2011年6月 (1)
2011年5月 (3)
2010年9月 (1)
2010年8月 (1)
2010年7月 (1)
2010年6月 (1)
2010年5月 (2)
2010年4月 (4)
2010年3月 (2)
2010年2月 (7)
2008年9月 (2)
2008年8月 (6)
搜索
积分与排名
积分 - 779599
排名 - 54
最新随笔
1. 由Struts2Action代理和googlecode-jsonplugin产生的一个IllegalArgumentException异常问题
2. 在CentOS系统中同步时间
3. 全局唯一ID生成器浅析
4. 用Java实现MJD转UTC
5. 修改mybatis-generator-1.3.2源码实现自定义代码生成详解(三)
6. 修改mybatis-generator-1.3.2源码实现自定义代码生成详解(二)
7. 修改mybatis-generator-1.3.2源码实现自定义代码生成详解(一)
8. Quartz Spring与Spring Task总结
9. 常用的MySQL复杂查询语句写法
10. 常用的MySQL语句写法
11. 浅谈Java两种并发类型——计算密集型与IO密集型
12. 使用XStream注解实现Java对象与XML互相转换的代码示例
13. 浅谈volatile变量的理解
14. 浅谈Java共享变量
15. m2eclipse安装小贴士
最新评论
1. re: 修改mybatis-generator-1.3.2源码实现自定义代码生成详解(一)
评论内容较长,点击标题查看
--半湖思絮
2. re: 修改mybatis-generator-1.3.2源码实现自定义代码生成详解(一)
评论内容较长,点击标题查看
--菠萝大象
3. re: 修改mybatis-generator-1.3.2源码实现自定义代码生成详解(一)
评论内容较长,点击标题查看
--donghc
4. re: 修改mybatis-generator-1.3.2源码实现自定义代码生成详解(一)
@donghc
maven不是这样玩的呀,我的run是打包后用的,你仔细看了第三篇的内容么?在IDE里直接启动StartUp就行了,这个类是用来测试的
--菠萝大象
5. re: 修改mybatis-generator-1.3.2源码实现自定义代码生成详解(一)
评论内容较长,点击标题查看
--donghc
阅读排行榜
1. 使用jackson对Java对象与JSON字符串相互转换的一些总结(59323)
2. 在Eclipse中反编译Class文件完全详解(43553)
3. Quartz Spring与Spring Task总结(38541)
4. 使用XStream注解实现Java对象与XML互相转换的代码示例(33110)
5. Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(二)(32439)
评论排行榜
1. Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(五)(69)
2. Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(三)(47)
3. Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(一)(35)
4. Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(二)(27)
5. Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(三)(26)