这是本系列的最后一章,大象对示例进行适当的扩充并说明。
其实到第四篇,对于示例的说明就已经全部讲完了,如果按照这样的例子,很难有什么值得学习的地方。大象本着写点有用东西的原则,在这章,对示例进行一下适当的扩充并说明。
第五部分:扩展框架
paramsPrepareParamsStack拦截器栈
paramsPrepareParamsStack
这个拦截器栈是在
struts2-default.xml
中定义的,
里面包含了很多个拦截器,最重要的是这三个:
params
、
prepare
、
modelDriven
。我们只要记住这样几点。
params
:它负责将请求参数值设置到
Action
中与之同名的属性中。
prepare
:当
Action
实现了
Preparable
接口时,这个拦截器就会调用
prepare()
方法。如果你有想在
execute()
方法之前执行的逻辑处理,它就可以帮你完成这个功能。
modelDriven
:如果
Action
实现了
ModelDriven
接口,这个拦截器就会把
getModel()
方法中的返回结果压入值栈。这就意味着,可以在结果页面上直接使用
model
对象的属性。
它的执行顺序是这样的
首先,
params
拦截器会给
action
中的相关参数赋值,如
id
,
username
,
password
等等。
然后,
prepare
拦截器执行
prepare()
方法,
prepare()
会根据参数,如
id
,去调用相关的方法,设置
model
对象。当然,实现的这个接口方法由你自己来定义,不局限只设置
model
之类的功能。
接着,
modelDriven
拦截器会将
model
对象压入
值栈
,因为它是把
getModel()
方法中的返回结果放到值栈中,而这个方法的返回类型是个泛型参数,在实现
ModelDriven
接口的时候,可以给它指定一个具体的对象类型,因此返回类型也将是这个指定的对象类型,如
ModelDriven<User>
最后,
params
拦截器会将参数再赋值给
model
对象。
思考修改与保存这两种动作。当点击人员修改时,请求为:
user!input.action?id=1
,
params
拦截器会将
id
参数值设置到
Action
中的
id
属性,请一定注意,
id
属性要有
set()
方法,然后
prepare
拦截器开始在
prepare()
方法中,根据这个
id
值取得
User
对象,接着
modelDriven
会调用
getModel()
方法,此时,方法中返回的是
user
对象,所以会把
user
加入到值栈中,最后再执行一次
params
拦截器,但这时没有其它的参数值需要赋值给
user
对象,所以程序会接着往下走,这里假定没有其它的业务逻辑,执行返回,字符串为
input
,根据前面讲的插件知识,结果页面为
user-input.jsp
,那么就跳转到修改页面了,而且页面中表单域将显示数据库中的值。如果理解了修改,那么保存也就清楚了。
prepare()
方法虽然不错,但是也有弊端,那就是它会对
Action
中的每个方法都进行拦截,不管你是执行
execute
还是
input
,还是其它的自定义方法,它都会对其拦截,这当然不是我们所希望的。那有没有更好的方式?答案是肯定的,请接着往下看。
prepareMethedName
使用
prepare
拦截器的另一种形式,在
prepare
名称后面加上需要拦截的方法名。比如,你要拦截
input
方法,可以写成
prepareInput
,需要拦截
save
方法,就写上
prepareSave
。采取这样的方式后,将会在执行这些方法之前时,才对它们进行拦截。
例如,请求
role!input.action
,会执行
RoleAction
中的
input
方法,如果我们设置了
prepareInput
方法,则会先进入此方法执行,执行完后再回到
input
方法往下执行。
请注意,在使用这种方式时,
Preparable
接口定义的
prepare()
方法体内不要含有任何代码,就是说给这个方法一个空实现。这样,它就什么都不做,所有的拦截处理就全部交由相应的
prepareMethedName
来完成。
它们在每个对应的方法之前执行。
prepareEntity
就是来初始化实体对象,然后由
modelDriven
拦截器将
getModel()
方法中的返回结果放入值栈,当返回页面时,就可以直接取值了。
StrutsAction
重新定义一个基类,里面封装大部分的通用操作,主要依靠泛型来实现,将
hibernateDao
注解进来,通过继承这个基类进行基本的
CRUD
操作。本文末尾提供示例源码下载,里面有详细的注释,这里我只贴出部分重要代码进行说明,为了行文需要,有些注释去掉了,但源码里面都有,请大家放心。
通过扩展
ActionSupport
,使用泛型参数,
构造函数根据反射得到
T
的具体类型。
这就是默认的执行方法,基本的操作,在这个超类里面都进行了定义,每个方法里面设置的以
do
开头的方法,是方便让子类进行覆盖,当基本的业务逻辑无法满足我们的需求时,就可以在子类重写这些方法。
方法有默认实现,主要是列表显示,保存和删除,新增和修改已经有
getModel()
方法取得实体,在页面上使用
s
标签就可以直接取值,除非有特殊的业务需求,否则不用覆盖
doInputEntity()
、
doViewEntity()
方法。请注意,当需要实现自己的逻辑时,只需要覆盖上面定义的这些方法,而不用重写
execute
、
input
之类。
我对
HibernateDao
又进行了适当的扩展与修改,提供了更多的基本封装方法,不过大家还可以继续添加。里面都有详细的注释,这里就不在赘述了。
功能扩展
我对例子做了两个功能,一个是角色表的增加、修改、删除、查看,另一个就是用户表的查询。可以从源码中看到,我在
RoleAction
中没有写一行关于增删改查的代码,因为它属于基本操作,超类中已经封装好了,所以这部分的代码都省了。对于用户表的查询,我覆盖了
doListEntity()
方法,在业务层进行条件封装,执行查询,返回结果。
这个
list
就是在超类中定义的,因为默认实现中也用到了
list
,另外
list
有一个
get
方法,用于在页面中显示。如果不想采取方式取得
list
集合,就重写
doListEntity()
方法。这里说明下,我是没有加分页功能的,大家可以按自己的方式添加分页查询。
在用户查询方法中,我使用的是
QBC
对象查询,因为这种方式很简洁,不过我在
HibernateDao
中也写了
HQL
和
SQL
方式的查询方法,并进行了封装,可以很方便的调用。
这个
queryResult
方法的定义,你可以改为传递用户名与角色
ID
的参数,大象在这里就是为了方便,直接使用
Request
请求。这里
userDao
调用的
query
方法是在
HibernateDao
里面封装的,因为继承了
HibernateDao
,就直接在
Service
层拿来用了。至于具体的,可以去看源码。
页面部分没有进行大的调整,主要是将
role-list.jsp
重命名为
role.jsp
,因为使用的是超类的默认实现。添加了
role-input.jsp
和
role-view.jsp
两个文件,并在
user.jsp
中,加入了查询条件。这些代码都很简单就不再贴了,而且前一篇也贴过一部分。
对于这个例子的完整讲解说明就到此结束了。大象还想补充说明一下,这个例子只适用于学习,不适合商用,想在实际项目中运用,还需要对框架做大量的改造工作。本系列只是基于
SSH2
入门学习之用,源码中不含
jar
包,下图是本例中所需的最少
jar
文件,大家只要下载了
spring
、
struts
、
hibernate
三个完整压缩包,那么这些
jar
基本上都包含了。
发布并启动
Tomcat
,然后输入访问地址:
http://localhost:8080/ssh2
运行该示例,看看效果。
相关推荐
Struts2.1.6、Spring2.5.6和Hibernate3.3.1是Java Web开发中的三个重要框架,合称为SSH(Struts2、Spring、Hibernate)。这个全注解实例详解旨在帮助开发者理解如何在不使用XML配置的情况下,通过注解实现这三大框架...
在这个全注解实例中,我们将深入理解如何利用Struts2.1.6、Spring2.5.6和Hibernate3.3.1构建应用程序,避免传统的XML配置文件,转而采用注解方式来提高开发效率。 **开发环境**: - JDK 1.6.0_18 - Eclipse 3.2.1 -...
在Struts2.1.6版本中,全注解的开发方式可以显著减少XML配置文件,提高开发效率。`struts2-core`、`xwork`、`ognl`、`freemarker`、`commons-logging`是其核心依赖,`struts2-convention-plugin`则支持注解配置,...
Java SSH三大框架整合 Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解五
这份资料中的"Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解"可能包含了如何在Struts2中使用注解进行配置,使代码更简洁易读。 接下来是Spring,它是应用上下文框架,提供依赖注入(Dependency Injection...
"测试SOA_WebService工具(SOAPUI,JMeter等)介绍和使用.doc"介绍了如何使用JMeter对Web服务进行性能测试,而"Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(转自大象).doc"则展示了如何集成这三个框架构建一...