`
tianhandigeng
  • 浏览: 374365 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(四)(转载)

阅读更多

这是本系列的最后一章,大象对示例进行适当的扩充并说明。
    其实到第四篇,对于示例的说明就已经全部讲完了,如果按照这样的例子,很难有什么值得学习的地方。大象本着写点有用东西的原则,在这章,对示例进行一下适当的扩充并说明。
    第五部分:扩展框架
    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 运行该示例,看看效果。

    本文为菠萝大象原创,转载自 http://bolo.blogjava.net/

分享到:
评论

相关推荐

    Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(含JAR包)

    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全注解实例详解(一)

    在这个全注解实例中,我们将深入理解如何利用Struts2.1.6、Spring2.5.6和Hibernate3.3.1构建应用程序,避免传统的XML配置文件,转而采用注解方式来提高开发效率。 **开发环境**: - JDK 1.6.0_18 - Eclipse 3.2.1 -...

    Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例

    在Struts2.1.6版本中,全注解的开发方式可以显著减少XML配置文件,提高开发效率。`struts2-core`、`xwork`、`ognl`、`freemarker`、`commons-logging`是其核心依赖,`struts2-convention-plugin`则支持注解配置,...

    java ssh三大框架整合

    Java SSH三大框架整合 Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解五

    SSH框架详细的深入解析,附图解

    这份资料中的"Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解"可能包含了如何在Struts2中使用注解进行配置,使代码更简洁易读。 接下来是Spring,它是应用上下文框架,提供依赖注入(Dependency Injection...

    java上传 hibernate jmeter

    "测试SOA_WebService工具(SOAPUI,JMeter等)介绍和使用.doc"介绍了如何使用JMeter对Web服务进行性能测试,而"Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(转自大象).doc"则展示了如何集成这三个框架构建一...

Global site tag (gtag.js) - Google Analytics