J2EE中间件技术论文

  • 格式:doc
  • 大小:278.00 KB
  • 文档页数:32

班级: 07级软件工程学号: 071164039 姓名: 郭东永SSH的理解及其应用实践目录对SSH框架整合的理解 (2)SSH框架整合的应用实践 (4)SSH框架整合的一些感悟 (32)完成日期:2010年6月8日1、对SSH框架整合的理解正如我们所知,Struts是一个单纯的web框架,因此对于其他方面的操作无能为力,例如对数据库的操作。

此外它也不能管理对象之间的依赖关系,因此需要和持久化框架和IoC框架结合,才能构建一个完整健壮的系统。

本节分析Struts+Spring+Hibernate结合的必要性。

1.1 三种框架结合的必要性对于从事web开发的人来说,使用Struts可以大大简化开发过程,对于直接使用Servlet+JSP来说,它提供了优秀的封装机制,使得用户可以严格按照MVC架构来开发应用。

想想我们没有使用web框架之前,是怎样的混乱状态,需要自己将数据从请求中取出来,然后组装起来,在数据很多的情况下,这简直是一个噩梦。

验证代码散落在各处,维护它们同样是一件累人的活。

为了处理不同的请求,可能需要写很多的Servlet,且不说容器的负担问题,单单是web.xml 文件就变得分外的臃肿,最后可能变成一个难以维护的庞然大物。

这是我在实际开发中遇到过的真实情况。

尽管使用Struts,在早期也会遇到配置文件(struts-config.xml)膨胀的问题,但后来的Struts通过模块化很好的解决了这个问题。

关于验证,需要多说一些,事实上,Struts的验证并不像后来的一些web框架而言,如Webwork、Spring MVC,是可插拔的,相反,它被包含在ActionForm 中,这是一种耦合性较强的设计。

form负担了的太多的责任,使得重用它变得困难,比如在业务层和持久层,另外,form是Struts框架的一部分,出于降低耦合性的考虑,也不能在业务层和持久层中出现。

它之后的一些框架都很好的解决了这个问题:使用一个普通的pojo,仅仅用于封装数据,不包含任何的逻辑。

但是,Struts是一个可扩展的框架,它的任何一部份都是可以替换的。

我们可以通过它提供的插件机制,来提供自己的功能,例如通常情况下,Spring和Struts的整合的一种方式,就是通过插件实现的。

通过插件,我们也可以提供可插拔的验证功能。

Struts是一个经历了无数项目考验的框架,有着为数最为庞大的社群,有着成熟的经验可供参考,所以在项目中使用Struts风险很小。

而且,Struts比较容易上手,因此学习成本也相对较小。

正如我们前面所说的,Struts是一个纯粹的web框架,不涉及业务层和持久层的处理,因此,对于其他层需要借助于其他的框架。

比如,在持久层使用Hibernate。

数据库操作是一个很复杂的问题,尽管在Java中,JDBC进行了很好的抽象,但是用户需要直接操作SQL。

这里也存在一个数据组装的问题,实际开发中直接从ResultSet中取出数据,然后放入一个model中,是很常见的方式。

冗长的set操作令人厌烦。

我们在实际开发中,都是将数据存放到model中,然后操作model,在这个意义上说,model和数据库之间有着某种内在的关系。

怎样映射这种关系,正是ORM所要做的。

ORM不仅仅要映射对象的属性和数据库表的字段间的关系,还要把表之间的关系映射为对象之间的关系,从而把对数据库表的操作,完全转为对对象的操作。

这种处理方式,更为程序员所熟悉,而且通过工具,我们也很容易保持表关系和对象关系的同步。

Hibernate正是这样一个强大的ORM工具,除了通常的O-R映射,还提供了其他的广受欢迎的功能,比如脏数据检查、延迟加载等。

这些,我们在前面的章节中,已经做过介绍。

Hibernate在实际开发中获得了广泛的应用,成为事实上的标准。

所以,我们在开发中,持久层实现,可以选择Hibernate。

Struts同样也缺少IoC和AOP功能,因此存在一定的耦合,例如,在Action 调用业务对象的时候,需要new一个实例,这是很常见的情况。

当然,我们可以使用工厂模式消除这种情况,但是又需要引入工厂类。

使用Spring可以有效地消除这种耦合。

我们在上一章中,介绍的Spring和Struts整合的方式中,可我们在Action中通过Spring的ApplicationContext获取对象,但是这样Action 中又嵌入了Spring的代码。

整合的第三种方式,通过Struts的plug-in机制,将Action交由Spring托管,这样,我们就可以在Action中使用依赖注入,完全消除了这种耦合。

除此之外,我们还可以使用Spring的AOP机制。

通过整合,我们可以充分利用各个框架的优势,从而达到构建完美的应用的目标。

1.2 模型特征我们分析了三种框架结合的必要性,现在我们分析一下使用三个框架的模型特性。

1.2.1 模型的构成特点在Spring+Hibernate+Struts模型中,Hibernate负责持久化操作,Struts 负责web操作,两者之间完全独立。

Spring在这个模型中的地位很特殊,它提供对对象的管理,而不管这个对象是处在哪一层,完成哪些任务。

Spring为用户设置对象间的依赖关系,并且通过AOP提供了统一的方式,处理横向的需求,这些需求通常很难使用OO实现,比如权限验证。

这样,Spring就涉及到广泛的领域,而不管它处在哪一层。

或者说,Spring是一个更为基础的框架,而不像Struts和Hibernate专注于各自的领域。

现在已经清楚了Spring、Hibernate、Struts的作用,现在从分层的角度,分析一下这个模型。

业务层,处理实际的逻辑操作,这一部分是由用户独立实现的,拥有最大的灵活性。

有些时候,持久层和业务层是混合在一起的,但是数据库一旦设计完成,就很少修改,所有拥有相当的稳定性,所以持久层也拥有相当的稳定性,因此可以将它们独立出来。

还有一个原因,持久化操作,很多时候很复杂,特别是涉及到事物的时候,因此,维护一个稳定的持久层,有利于分工,也减少了维护的成本。

Hibernate的出现,使得持久化操作不再像以前那么复杂繁琐,所以也有将这两层合并的做法。

我们下面给出的例子,会看到很多时候业务层仅仅是将请求委托给持久层,本身什么也不做。

但我认为,维护一个独立的业务层,还是有好处的,至少在将来切换持久化实现的时候,比如用JDBC替换Hibernate,业务层就不用作任何的改动,虽然这种情况很少发生。

持久层,我们可以直接使用Hibernate API,更好的方式是使用Spring的Hibernate封装。

Spring提供了对Hibernate的良好封装,这样我们在持久化操作中,可以使用Spring提供的封装,简化持久化的操作。

Hibernate的Session 是很昂贵的资源,因此,每个DAO(这里指持久层的类)方法,单独使用一个Session是一种浪费,使用Spring的封装,就可以使用统一的方式使用Session。

通过使用Spring托管的Session,我们实现了OpenSessionInView模式,即在每一个请求中使用一个Session。

当然我们可以提供自己的OpenSessionInView实现,最简单的就是实现一个Filter。

事实上Spring提供的其中一种实现就是通过这种方式实现的。

在Spring托管的环境下,我们就可以实现Hibernate的声明式管理。

使用Spring封装的一个好处就是对异常的处理,Spring可以给出很明确的异常信息,不像JDBC统一抛出SQLException,Hibernate抛出HibernateException。

Spring还提供了异常转换的功能,用户可以在配置文件中声明转换成什么样的异常。

web层,就是Struts的责任了,这里通常不会涉及到Hibernate和Spring,我们仅仅是由Spring管理依赖对象的注入。

但是,很多时候web请求需要一些横向的需求,比如上面提到的权限管理,一个更常见的情况是用户登录和注册。

当然我们可以使用Filter实现,也可以写一个顶层的Action,统一处理这些请求,需要处理这些请求的Action继承它即可。

但是这是一种硬编码的实现,不能通过配置改变,因此缺少灵活性。

用户是否登录的判断也是一个典型的横切应用,因此可以通过AOP来实现。

我们下面的例子,会给出一个使用拦截器判断用户是否登录的实现。

为了使用拦截器,我们这里给出了Spring和Struts整合的第四种方式,涉及到了SpringMVC的内容。

相对来说,SpringMVC在设计上更加倚重IoC和AOP,也提供了更为开放的方式,因此更为强大,但是却过于复杂。

但是相对于它提供的丰富特性,这些复杂性是可以克服的,因此在实际开发中,可以考虑用SpringMVC实现web层,即用它替换Struts。

1.2.2 实现模型的目的使用Spring+Hibernate+Struts模型的目的,实际上面已经涉及到了,这些框架的优点是使用它们的一个重要原因。

还有一些可能更重要的原因,总结如下:去耦合这是一个老生常谈的话题了。

去耦合是如此的重要,以至于人们要将这方面的经验总结成设计模式。

Spring通过IoC,实现了去耦合,这样用户可以随时替换现在的实现,而不用修改源码。

这正是软件开发中开-闭原则的要求。

Spring倡导面向接口编程,这是最为推崇的最佳实践之一,继承仅仅作为内部实现的一个手段。

面向接口编程,不仅仅是提供了更好的抽象,实际上也更有利于去耦合。

扩展的需要 Struts、Spring甚至Hibernate都提供了良好的扩展功能,Struts通过插件机制,可以很方便的添加功能。

Spring对Bean的管理也提供了扩展,例如用户可以提供自己的作用域。

Hibernate用户可以定制自己的持久化策略。

维护的需要这些框架都很容易维护,它们都很好的实现了开-闭原则,因此需要替换功能的时候,只需简单的修改配置文件。

它们提供的一些公用功能,也能通过配置的方式提供,比如Spring的声明式事务。

因此维护成本大大降低。

还有一个原因,由于它们都有庞大的社区支持,因此寻找技术支持很容易。

由于它们很流行,因此招一个开发人员也很容易。

2、SSH框架整合的应用实践2.1 Hibernate+Spring+Struts模型应用分析通过上面的学习,我们对三者结合的模型有了一个概念性的理解,现在我们通过一个具体的例子,演示怎样将它们整合在一起。

2.1.1 应用事例考虑一个购物车的例子,相信读者或多或少都接触过这方面的例子。

为了简单起见,不考虑库存的问题,商品的信息完全由用户填写,包括商品名称、商品介绍、商品价格、购买数量。