众所周知,Web这个Intemet上最热门的应用架构是由Tim Bemers-Lee发明的。Web的前身是1980年Tim Bemers-Lee负责的Enquire(Enquire Within Upon Everything的简称)项目。1990年11月,第一个web服务器nxoc01.eem.ch开始运行,Tim Bemers-Lee在自己编写的图形化web浏览器Worldwideweb上看到了最早的Web页面。1991年,CERN(European Particle Physies Laboratory)正式发布了Web技术标准。目前,与web相关的各种技术标准都由著名的W3C组织(World Wide Web Consortium)管理和维护。
Web是一种典型的分布式应用架构。Web应用中的每一次信息交换都要涉及到客户端和服务端两个层面。因此,Web开发技术大体上也可以被分为客户端技术和服务端技术两大类。
Web客户端的主要任务是展现信息内容,而HTML语言则是信息展现的最有效载体之一。作为一种实用的超文本语言,HTML的历史最早可以追溯到上世纪四十年代。1945年,Vannevar Bush在一篇文章中阐述了文本和文本之间通过超级链接相互关联的思想,并在文中给出了一种能实现信息关联的计算机Mcmex的设计方案。Doug Engelbart等人则在1960年前后,对信息关联技术做了最早的实验。与此同时,Ted Nelson正式将这种信息关联技术命名为超文本(Hypertext)技术。1969年,IBM的Charles Goldfarb由发明了可用于描述超文本信息的GML(Generalized Markup Language)语言。1978到1986年间,在ANSI等组织的努力下,GML语言进一步发展成为著名的SGML语言标准。当Tim Bemers-Lee和他的同事们在1989年试图创建一个基于超文本的分布式应用系统时,Tim Bemers-Lee意识到,SGML是描述超文本信息的一个上佳方案,但美中不足的是,SGML过于复杂,不利于信息的传递和解析。于是,Tim Bemers-Lee对SGML语言做了大刀阔斧的简化和完善。1990年,第一个图形化的Web浏览器“World Wide Web”终于可以使用一种为Web量身定制的语言HTML来展现超文本信息了。
最初的HTML语言只能在浏览器中展现静态的文本或图像信息,这满足不了人们对信息丰富性和多样性的强烈需求,最终,由静态技术向动态技术的转变成为了Web客户端技术演进的永恒定律。
1995年Java语言的问世为Web客户端带来了巨大的变革。Java语言天生就具备的平台无关的特点,让人们一下子找到了在浏览器中开发动态应用的捷径。而后来CSS与DHTML技术的加入,让HTML页面真正做到了动感无限。
与客户端技术从静态向动态的演进过程类似,Web服务端的开发技术也是由静态向动态逐渐发展、完善起来的。最早的Web服务器简单地响应浏览器发来的HTTP请求,并将存储在服务器上的HTML文件返回给浏览器。一种名为SSI(Server Side Ineludes)的技术可以让Web服务器在返回HTML文件前,更新HTML文件的某些内容,但其功能非常有限。第一种真正使服务器能根据运行时的具体情况,动态生成HTML页面的是CGI(Common Gateway Interface)技术,它使客户端和服务端的动态信息交换成为了可能。随着CGI技术的普及,聊天室、论坛、电子商务、信息查询、全文检索等各式各样的Web应用蓬勃兴起,人们终于可以享受到信息检索、信息交换、信息处理等更为便捷的信息服务了。
1994年,Rasmus Lerdorf发明了专用于Web服务端编程的PHP(Personal Home Page Tools)语言。Web应用的开发者可以用一种更加简便、快捷的方式实现动态Web功能。1996年,Microsoft借鉴PHP的思想,在其Web服务器IIS3.0中引入了ASP技术。当然,以Sun公司为首的Java阵营也不会示弱。1997年,Servlet技术问世,1998年,JSP技术诞生。Servlet和JSP的组合(还可以加上JavaBean技术)让Java开发者同时拥有了类似CGI程序的集中处理功能和类似PHP的HTML嵌入功能,此外,Java的运行时编译技术也大大提高了Servlet和JSP的执行效率,这也正是Servlet和JsP被后来的J2EE平台吸纳为核心技术的原因之一。
Web服务端开发技术的完善使开发复杂的Web应用成为了可能。在此起彼伏的电子商务大潮中,为了适应企业级应用开发的各种复杂需求,为了给最终用户提供更可靠、更完善的信息服务,两个最重要的企业级开发平台J2EE和.NET在2000年前后分别诞生于Java和Windows阵营,它们随即就在企业级Web开发领域展开竞争。
J2EE是纯粹基于Java的解决方案。1998年,Sun发布了EJB1.0标准。EJB为企业级应用中必不可少的数据封装、事务处理、交易控制等功能提供了良好的技术基础。至此,J2EE平台的三大核心技术servlet、JSP和EJB都已先后问世。1999年,Sun正式发布了J2EE的第一个版本。紧接着,遵循J2EE标准,为企业级应用提供支撑平台的各类应用服务软件争先恐后地涌现了出来。IBM的websphere、BEA的WebLogic都是这一领域里最为成功的商业软件平台。随着开源运动的兴起,JBoSS、Tomcat等开源世界里的应用服务新秀也吸引了许多用户的注意力。到目前,Sun的J2EE 5已经发布,其中三个关键组件的版本也演进到了Servlet2.5、JSP2.1和EJB3.0。至此,J2EE体系及相关的软件产品已经成为了web服务端开发的一个强有力的支撑环境。
2000年以后,随着Web应用的日益复杂,人们逐渐意识到,单纯依靠某种技术多半无法达到快速开发、快速验证和快速部署的最佳境界。研究者开始尝试着将已有的Web开发技术综合起来,形成完整的开发框架或应用模型,并以此来满足各种复杂的应用需求。目前,在J2EE多层架构上己经开发出了很多框架,它们为应用开发提供了一个能够使用的架构模板和软件包,让开发者从编码中解脱出来,不必一切从头开始,自己来完成,只需将注意力集中在业务逻辑上,从而减轻了开发者处理复杂问题的负担,提高了工作效率。其次在应用和分析框架的基础上,可以对其进行改进和扩展,以适应实际的需求。
WebWork
Webwork是由Open Symphony组织开发的,致力于组件化和代码重用的拉出式MVC模式J2EE Web框架。现在的Webwork2.x前身是Rickard Oberg开发的Webwork,但现在Webwbrk已经被拆分成了Xwork1和Webwork2两个项目。XWork简洁、灵活功能强大,它是一个标准的Command模式实现,并且完全从web层脱离出来。
Struts
Struts是一个基于Sun J2EE平台的MVC框架,主要是采用Servlet和JSP技术来实现的。由于Struts能充分满足应用开发的需求,简单易用,敏捷迅速,在过去的一年中颇受关注。Struts把Servlet、JSP、自定义标签和信息资源(message resources)整合到一个统一的框架中,开发人员利用其进行开发时不用再自己编码实现全套MVC模式,有效的缩短了开发周期。
TaPestry
Tapestry是一个开源的基于servlet的应用程序框架,它使用组件对象模型来创建动态的,交互的Web应用。一个组件就是任意一个带有jwcid属性的html标记。其中jwc的意思是Java Web Component。TaPestry使得java代码与html完全分离,利用这个框架开发大型应用变得轻而易举。并且开发的应用容易维护和升级。
IBAIS
使用ihatis提供的ORM机制,对业务逻辑实现人员而言,面对的是纯粹的Java对象,这一层与通过Hibemate实现ORM而言基本一致,而对于具体的数据操作,Hibernate会自动生成SQL语句,而ibatis则要求开发者编写具体的SQL语句。
Hibemate
Hibemate是Java平台上的一种全功能的、开放源代码OR映射框架。Hibemate在许多方面类似于EJB(容器管理的持久性/容器管理的关系)和JDO(Java Data Objeets)。与JDO不同,Hibemate完全着眼于关系数据库的OR映射,并且包括比大多数商业产品更多的功能。Hibernate使用反射和运行时字节码生成,使它对于最终用户几乎是透明的。Hibenate已经成为轻量级J2EE项目中持久层框架的首选,使用Hibemate可以在轻量级J2EE架构中取代CMP,完成数据持久化的重任。
Spring
Spring是一个解决了许多在J2EE开发中常见的问题的强大框架。Spring提供了管理业务对象的一致方法并且鼓励了注入对接口编程而不是对类编程的良好习惯。Spring的架构基础是基于使用JavaBean属性的Inversion of Controf容器。然而,这仅仅是完整图景中的一部分:Spring在使用IOC容器作为构建所有架构层的完整解决方案方面是独一无二的。Spring提供了唯一的数据访问抽象,包括简单和有效率的JDBC框架,极大的改进了效率并且减少了可能的错误。Spring的数据访问架构还集成了Hibemate和其他O/R
mapping解决方案。Spring还提供了唯一的事务管理抽象,它能够在各种底层事务管理技术,例如JTA或者JDBC事务提供一个一致的编程模型。Spring提供了一个用标准Java语言编写的AOP框架,它给POJOs提供了声明式的事务管理和其他企业事务。Spring框架的使用,使得应用程序能够抛开EJB的复杂性,同时享受着和传统EJB相关的关键服务。Spring还提供了可以和IOC容器集成的强大而灵活的MVC Web框架。
2.1 ASSH框架的技术基础
2.1.1 J2EE架构
J2EE(Java2 Entenprise Edition)是sun公司主持推出的一项企业计算平台规范,它是一种利用Java2平台来简化企业解决方案的开发、部署和管理相关的复杂问题的体系结构。J2EE技术的基础就是核心Java平台或Java2平台的标准版,J2EE不仅巩固了标准版中的许多优点,例如“编写一次、随处运行”的特性、方便存取数据库的 JDBC API、CORBA技术以及能够在Internet应用中保护数据的安全模式等等,同时还提供了对EJB(Enierprise JavaBeans)、 Java Servlets API、 JSP(Java Server Pages)以及XML技术的全面支持。其最终目的就是成为一个能够使企业开发者大幅缩短投放市场时间的体系结构。
SUN设计J2EE的初衷正是为了解决C/S模式 (client/server)的弊端,在传统模式中,客户端担当了过多的角色而显得臃肿,在这种模式中,第一次部署的时候比较容易,但难于升级或改进,可伸展性也不理想。它使得重用业务逻辑和界面逻辑非常困难。J2EE使用多层的分布式应用模型,应用逻辑按功能划分为组件,各个应用组件根据他们所在的层分布在不同的机器上。这种模型将两层化模型中的不同层面切分成许多层。一个多层化应用能够为不同的每种服务提供一个独立的层。
J2EE的三层体系结构,即表现层、业务逻辑层和数据持久层。表现层主要指用户界面,它要求尽可能的简单,使最终用户不需要进行任何培训就能方便地访问信息;第二层是业务逻辑层,也就是常说的中间件,所有的应用系统、应用逻辑、控制都在这一层,系统的复杂性也主要体现在业务逻辑层;最后的数据持久层存储大量的数据信息和数据逻辑,所有与数据有关的安全、完整性控制、数据的一致性、并发操作等都是在第三层完成。
采用J2EE三层结构的特点:
1.能有效降低建设和维护成本,简化管理。
2.适应大规模和复杂的应用需求。
3.可适应不断的变化和新的业务需求。
4.访问异构数据库。
5.能有效提高系统并发处理能力。
6.能有效提高系统安全性。
2.1.2StrutS框架
1.StrutS体系结构
StrutS是Apache基金会Jakarta项目组的一个开源项目,它采用MVC模式,提供了对开发MVC系统的底层支持,能够很好地帮助java开发者利用J2EE开发Web应用。和其他的java架构一样,Struts也是面向对象设计,将MVC模式“分离显示逻辑和业务逻辑”的能力发挥得淋漓尽致。它采用的主要技术是Servlet,JSP和Custom tag library。其基本构成如图2一1所示:
由上图可以看出,在Struts框架中Controller功能由ActionServlet和ActionMapping对象构成,核心是一个Servlet类型的对象ActionServlet,它用来接受客户端的请求。ActionServlet包括一组基于配置的ActionMapping对象,每个ActionMapping对象实现了一个请求到一个具体的Model部分中Action处理器对象之间的映射。
Model部分由Action和Acti。nForm对象构成。所有的Action处理器对象都是开发者从Struts的Action类派生的子类。Action处理器对象封装了具体的处理逻辑,调用业务逻辑模块,并且把响应提交到合适的View组件以产生响应。Struts提供的ActionForm组件对象可以通过定义属性描述客户端表单数据。开发者可以从它派生子类对象,利用它和Struts提供的自定义标记库结合可以实现对客户端的表单数据的良好封装和支持,Action处理器对象可以直接对它进行读写,而不再需要和request、response对象进行数
据交互。通过ActionForm组件对象实现了对View和Model之间交互的支持。View部分是通过JSP技术实现的。Struts提供了自定义的标一记库,通过这些自定义标记可以非常好地和系统的Model部分交互,通过使用这些自定义标一记创建的JSP表单,可以实现和Model部分中的ActionForm的映射,完成对用户数据的封装。
Struts框架在应用中采用两个基于XML的配置文件来进行配置,分别是web.xml和struts-config.xml文件。web.xml文件是配置所有web应用的,而struts-config.xml文件是Struts框架的部署描述符,用来创建和配置各种Struts组件。
2.Struts工作流程
在Web启动时加载并初始化AetionServlet。AetionServlet从struts-config.xml文件中读取配置信息,把它们存放到各种配置对象中。初始化完成后,系统将通过URL匹配映射截获所有以.do结尾的URL请求。当ActionServlet接收到一个客户请求时:
(1)判断用户请求是否为Struts受理范围的请求,如果是则接受请求。
(2)检索和用户请求匹配的ActionMapping实例,如果不存在,就返回用户请求路径无效。
(3)如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交表单数据保存到ActionForm对象中。
(4)根据配置决定是否需要表单验证,如果需要验证,就调用ActionForm的validate()方法。
(5)如果AetionForm的validate()方法返回null或返回一个不包含ActionMessage的AetionError对象,就表示表单验证成功。
(6)ActionServlet根据AetionMapping实例包含的映射决定将请求转发给哪个Action。如果相应的Action实例不存在,就先创建这个实例,然后调用Aetion的execute()方法。
(7)Aetion的execute()方法返回一个AetionForward对象,ActionServlet再把客户请求转发给ActionForward对象指向的JSP组件。
(8)ActionForward对象指向的JSP组件生成动态网页,返回给客户。
对于以上流程(5)中,如果ActionForm的validate()方法返回一个包含一个或多个ActionMessage的ACtionErrors对象,就表示表单验证失败,此时ActionServlet将直接把请求转发给包含用户提交表单的JSP组件。在这种情况下,不会再创建Action对象并调用Action的execute()方法。
StrutS工作流程图如图2一2所示:
2.1.3 Spring框架
Spring是J2EE平台上的一个开源应用框架。Spring框架本身并没有强制实行任何特别的编程模式。在Java社区里,Spring作为EJB模型之外的另外一个选择甚至是替代品而广为流行。从设计上看,Spring给予了Java程序员许多的自由度,但同时对业界常见的问题也提供了良好的文档和易于使用的方法。
1.Spring框架的组成模块
Spring框架是一个分层架构,由7个定义良好的模块组成。Spring模块构建在核心容器之上,核心容器定义了创建、配置和管理bean的方式,如图2-3所示。
组成Spring框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能可见附录一。
附录一
核心容器:核心容器提供Spring框架的基本功能。核心容器的主要组件是BeanFactory,它是工厂模式的实现。BeanFactory使用控制反转(IOC)模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
Spring上下文:Spring上下文是一个配置文件,向Spring框架提供上下文信息。Spring上下文包括企业服务,例如JNDI、EJB、电子邮件、国际化、校验和调度功能。
SpringAOP:通过配置管理特性,SpringAOP模块直接将面向方面的编程功能集成到了Spring框架中。所以,可以很容易地使Spring框架管理的任何对象支持AOP。SpringAOP模块为基于Spring的应用程序中的对象提供了事务管理服务。
SpringDAO:JDBC DAO抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO的面向JDBC的异常遵从通用的DAO异常层次结构。
SpringORM:Spring框架插入了若干个ORM框架,从而提供了ORM的对象关系工具,其中包括JDO、Hibernate和iBatiSSQLMap。所有这些都遵从Spring的通用事务和DAO异常层次结构。
Spring Web模块:web上下文模块建立在应用程序上下文模块之上,为基于Web的应用程序提供了上下文。所以,Spring框架支持与Jakarta Struts的集成。Web模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
SpringMVC框架:MVC框架是一个全功能的构建Web应用程序的MVC实现。通过策略接口,MVC框架变成为高度可配置的,MVC容纳了大量视图技术,其中包括JSP、veloeity、Tiles、iText和POI。
2. Spring框架的相关技术
(1)控制反转(Ioc)与依赖注入(DI)
控制反转模式(Inversion of Control)简称IOC,其原理是基于好莱坞原则:别找我们,我们会找你。也就是说,所有的组件都是被动的,所有的组件初始化和调用都由容器负责。控制反转意味着在系统开发过程中,设计的类将交由容器去控制,而不是在类的内部去控制,类与类之间的关系将交由容器处理,这与传统的编程方式有了很大的不同。Martin Fowler在他的一篇文章中给IOC起了一个更为直观的名字:依赖注射DI(Dependency Injection),即组件之间的依赖关系由容器在运行期决定,形象地说,即由容器动态地将某种依赖关系注入到组件之中。
使用Spring框架管理J2EE应用各层的对象时,不管是控制层的Action对象,还是业务层的Service对象,还是持久层的DAO对象,都可在Spring的管理下有机地协调、运行。Spring将各层的对象以松耦合的方式组织在一起,Action对象无须关心Service对象的具体实现,Service对象无须关心持久层对象的具体实现,各层对象的调用完全面向接口。当系统需要重构时,代码的改写量将大大减少。而这一切都得益于Spring的核心机制IOC,它让Spring框架中Bean与Bean之间以配置文件组织在一起,而不是以硬编码的方式耦合在一起。
Spring框架中的三种注入方式,分别为:
①接口注入
②设值注入
③构造子注入
(2)面向方面编程(AOP)
Spring框架的另一优势是它的面向方面编程技术,相对于面向对象编程而言,面向方面编程提供从另一个角度来考虑程序结构以完善面向对象编程(OOP),为开发者提供了一种描述横切关注点的机制,并能够自动将横切关注点织入到面向对象的软件系统中,从而实现了横切关注点的模块化lll]。通过划分Aspect代码,横切关注点变得容易处理。开发者可以在编译时更改、插入或除去系统的Aspect,甚至重用系统的Aspect。
Spring AOP用纯Java实现。它不需要专门的编译过程。Spring AOP不需要控制类装载器层次,因此它适用于J2EE Web容器或应用服务器。
Spring实现AOP的方法跟其他的框架不同。Spring并不是要尝试提供最完整的AOP实现(尽管Spring AOP有这个能力),相反的,它其实侧重于提供一种AOP实现和Spring IOC容器的整合,用于帮助解决在企业级开发中的常见问题。
因此,Spring AOP通常都和Spring IOC容器一起使用。Aspect使用普通的bean定义语法(尽管Spring提供了强大的“自动代理(autoproxying)”功能):与其他AOP实现相比这是一个显著的区别。有些是使用Spring AOP无法轻松或者高效的完成的,如通知一个细粒度的对象,这种时候,使用Aspect是最好的选择。不过经验告诉我们:大多数在J2EE应用中遇到的问题,只要适合AOP来解决的,Spring AOP都没有问题,SpringAOP提供了一个非常好的解决方案。
2.1.4 Hibernate框架
Hibernate框架作为对象/关系映射(Object/Relational Mapping)的解决方案,就是将Java中的对象与对象关系映射至关系型数据库中的表格与表格之间的关系。Hibernate内部封装了通过JDBC访问数据库的操作,向上层应用提供了面向对象的数据访问API,使得Java程序员可以随心所欲的使用对象编程思想来操纵数据库。
Hibernate是一种非强迫性的解决方案。开发者在写业务逻辑与持续性类时,不会被要求遵循许多Hibernate特定的规则和设计模式。这样,Hibernate就可以与大多数新的和现有的应用平稳地集成,而不需要对应用的其余部分作破坏性的改动。更有意义的是Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
1.Hibernate框架的工作流程
Hibernate启动后,创建Configuration实例,利用此实例加载配置文件hibernate.cfg.xml到内存中,通过hibernate.cfg.xml配置文件中的mapping节点配置并加载*.hbm.xml文件至该实例中,并利用此实例创建一个SessionFaetory实例,在由SessionFaetory实例得到Session的事务操作接口,利用此接口来操纵对数据库的访问,访问结束后关闭Session连接。
具体的Hibernate工作流程如图2一4所示:
2. Hibernate框架的优点
Hibernate作为持久层框架,其自身的优势使得Hibernate在企业级系统的应用中越来越流行。Hibernate的优势主要体现在以下几点:
①对JDBC进行了轻量级的对象封装,使编程人员不必重复编写SQL代码,结构清晰,维护简单。
②Hibenate既适用于独立的Java程序,也可以用于J2EE Web应用,还可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
③以统一的方式支持多种数据库。
④由于是开源的框架,可以对其代码进行修改,增加或修改功能。
⑤不仅提供了Java类到数据表之间的映射,也提供了数据查询和回复机制,避免了对数据库的手工操作,大大减少了操作数据库的工作量。
⑥可以和多种Web服务器或者应用服务器良好集成,几乎支持所有流行的数据库服务器。
2.1.5Ajax技术
目前,Web应用程序正在以几何数量级的速度增长,其解决技术也正逐步成熟。Web应用程序不再是简单显示信息的网站,而逐步融合核心的业务
逻辑,成为了IT领域的业务处理平台。但是在web应用程序中,前端的用户界面与后台逻辑处理的同步交互过程越来越不是适应用户的需要,逐渐成为
Web应用发展的瓶颈。
Ajax全称为“Asynchronous JavaScript and XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术。Ajax技术的出现让业界重新审视Web应用程序的通信模式,对Web应用程序的数据传输速度和用户体验提出了更高的要求和期望,也让业界看到了成功的曙光。
传统的Web应用程序采用同步交互过程。在这种情况下,用户首先向Web服务器触发一个行为请求;反过来,服务器执行某些任务,再向发起请求的用户返回一个HTML/XHTML页面。这是一种不连贯的用户体验,服务器在处理请求的时候,用户多数时间处于等待的状态,屏幕内容也是一片空白。当负载较大时,用户就必须在浏览器前等待很久才能得到需要的页面,有时甚至出现打不开页面的情况。
与传统的web应用程序不同,Ajax采用异步交互过程,在用户与服务器之间引入一个中间媒体,从而消除了在传统Web应用的网络交互过程中处理—等待—处理—等待的缺点。
Ajax引擎允许用户与应用软件之间交互过程异步进行,独立于用户与网络服务器间的交流。通过JavaScrint调用Ajax引擎来代替产生一个Http请求的用户动作,内存中的数据编辑、页面导航、数据校验、部分数据加载显示这些都不需要重新载入整个页面的请求,可以交给Ajax来执行。异步的Ajax传输过程如图2-5所示:
Ajax技术的出现,改变了传统Web应用程序的交互模式,为开发人员、终端用户带来了便捷,在Web应用中越来越流行。Ajax技术的优点主要体现在以下几个方面:
①减轻服务器的负担。与传统Web系统的更新整个页面相比,Ajax可是对页面内容进行实时更新,即只更新需要更新的部分,其余部分则保持不变。这种
“按需 取数据”的原则可以在相当程度上减少冗余请求和响应对服务器造成的负担。
②无刷新更新页面,减少用户心理和实际的等待时间。特别地,当要读取大量数据地时候,不会像Reload那样出现“白屏”的情况。
③进一步促进页面呈现和数据的分离。
④可以把以前一些服务器担负的工作转嫁到客户端,利用客户端闲置的能力来处理,减轻了服务器和带宽的负担,节约空间和宽带租用成本。
⑤基于标准化的并被广泛支持的技术,无需下载插件或者小程序。
⑥跨浏览器和跨平台的兼容性,可以在不同的浏览器(如IE、Firefox等)上建立基于Ajax的web应用。
2.2ASSH框架的设计
ASSH框架是按照J2EE三层结构对Struts、Spring、Hibernate框架进行整合并加入Ajax技术而形成的。在Web应用系统开发过程中,不同的层次采用不同的框架,表现层采用Struts MVC模式,并结合Ajax技术来增加系统与用户交互的灵活性;业务逻辑层采用Spring框架,完成应用系统的业务逻辑与事务处理等功能;数据持久层采用对象/关系映射工具Hibernate框架,完成与数据库进行数据交互的功能。ASSH框架中的整合包括:
①Struts框架与Spring框架的整合。
②Spring框架与Hibernate框架的整合。
③Ajax技术在表现层的应用。
2.2.1Struts框架与Spring框架的整合
虽然Spring框架本身提供了一套极其优秀的MVC框架,但这套框架的设计过于追求完美,采用了大量的映射策略,如请求到控制器之间的控制器解析策略,逻辑视图和实际视图之间的视图解析策略等;还有过于细化的角色划分,使得MVC层的开发相当烦琐。这对于实际应用的开发往往弊大于利,而且Spring MVC的开发群体不够活跃,也存在风险。
而采用Struts框架将不存在这些风险,它拥有极其稳定的表现,经过长时间的检验,有大量成功的应用可以参考。
将StrutsMVC与SPring框架整合有三种方法:
(1)使用Spring的ActionSupport类整合Struts;
(2)使用Spring的DelegatingRequestProeessor覆盖Struts的RequestProeessor;
(3)将StrutSAction管理委托给Spring框架。
1.使用Spring的ActionSupport类整合Structs
手动创建一个Spring环境是一种整合Struts和Spring的最直观的方式。为了使它变得更简单,Spring提供了一些帮助。为了方便地获得Spring环境,org.sprinsframework.web.struts.ActionSupport类提供了一个getWebApplicationContextO方法。我们所做的只是从Spring的ActionSupport而不是StrutsAction类扩展我们所需要的动作,如下面代码所示:
在①处,通过从Spring的ActionSupport类而不是Struts的Action类进行扩展,创建了一个新的Action。在②处,使用getWebAppliationContext()方法获得一个ApplicationContext。为了获得业务服务,使用在②处获得的环境在③处查找一个Spring bean。
2.通过Spring的DelegatingRequestProeessor进行整合
将Spring从Struts动作中分离是一个更巧妙的设计选择。分离的一种方法是使用org.springframework.web.struts.DelegatingRequestProeessor类来覆盖Struts的RequestProcessor处理程序,在struts-config.xml文件中添加<controller>标记,用DelegatingRequestProcessor覆盖默认的StrutsRequestProeessor。具体代码如下:
<controller proeessorClass = "org.springframework.web.struts.DelegatingRequestPoeessor" />
同时在Spring的配置文件applieationContext.xml中注册一个bean,以匹配Struts-config中的动作映射名称。具体代码如下:
TestSubmit动作揭示了一个JavaBean属性,允许Spring在运行时利用DelegatingRequestProeessor自动地配置属性。这种设计使Struts动作并不知道它正被Spring管理,并且使能够利用Sping的动作管理框架的所有优点。由于Struts动作注意不到Spring的存在,所以不需要重写Struts代码就可以使用其他控制反转容器来替换掉Spring。
3.通过StrutsAction的管理委托进行整合
首先在struts-config.xml文件中注册Spring插件如下所示:
<plug-in className = "org.springframework.web.struts.ContextLoaderPlugIn" />
<set-property property = "contextConfigLoeation" value = "WEB-INF/applicationContext.xml" />
</plug-in>
其次将所有action标签中type属性设为org.springframework.web.struts.DelegatingActionProxy,也就是将action委托给了Spring。因而在Spring配置文件applicationContext.xml
中配置一个于action标签path属性对应的bean(也就是bean的name值等于action的path值),如:
struts-config.xml的代码片段
applicationContext.xml的代码片段
三种整合方法的对比:
使用Spring的ActionSupport来整合Struts简单而快捷。但是,它将Struts动作与Spring框架耦合在一起,如果想替换掉Spring的话,就必须重写代码。并且,由于Struts动作不在Spring的控制之下,所以它不能获得Spring AOP的优势。当使用多重独立的Spring环境时,这种技术可能有用,但是在大多数情况下,这种方法不如另外两种方法合适
第二种方法通过委托RequestProcessor巧妙地解开代码的耦合,弥补了第一种方法的不足,但是仍然存在一些问题,例如要使用一个不同的RequestProeessor,则需要手动整合Spring的DelegatingRequestProcessor。添加的代码会为后期维护带来麻烦并且会降低应用程序的灵活性。
通过StrutsAction的管理委托进行整合是这三种方法中最好的。将StrutsAction委托给Spring框架可以使代码解耦,从而使可以在Struts应用程序中利用Spring的特性。并且一旦让Spring控制StrutsAction,就可以使用Spring给Action补充更强的活力。例如,没有Spring的话,所有的StrutsAction都必须是线程安全的。如果设置<bean>标一记的Singleton属性为“false”,那么不管用何种方法,应用程序都将在每一个请求上有一个新生成的动作对象。在本文所设计的ASSH框架中Spring和Struts的整合
使用的是第三种方法。
2.2.2 Spring框架与Hibernate框架的整合
Spring作为一个开放的框架在数据库访问层上和主流的ORM软件集成就是其重要组成部分。Hibernate最重要的配置文件是hibernate.cfg.xml。在这个配置文件中,可以定义需要进行持久化的类以及相关的一些全局属性。而Spring通过LocalSessionFactoryBean这个类对Hibernate进行封装和接口转换,这样可以使用统一的方式来处理Spring和Hibernate,同时提供一个全局的SessionFactory。并且Spring还提供了很多IOC特性的支持,方便地处理大部分典型的Hibernate整合问题,如SessionFactory的注入、HibernateTemplate的简化操作及DAO支持等。
一旦Hibernate处于Spring的管理下,Hibernate所需要的基础资源,都由Spring提供注入。Hibernate创建SessionFactory必需的Datasource,执行持久化必需的Session及持久层访问必需的事务控制等,这些原本必须通过代码控制的逻辑,都将由Spring接管Datasource,SessionFactory,TransactionManager等,都将作为Spring容器中的bean。Spring通过
applicationContext.xml文件管理SessionFactory,无须采用单独Hibernate应用所必需的hibernate.cfg.xml文件。
Spring通过applicationContext.xml文件配置管理SessionFactory与数据库的连接。在实际的J2EE应用中,数据源采用依赖注入的方式,将SessionFactory传给Hibernate。具体applicationContext.xml的配置如下所示:
SessionFactory由applicationContext.xml管理,并随着应用程序启动时自动加载,可以被处于applicationContext.xml管理下的任意一个bean引用,比如DAO。Hibernate的数据库访问需要在Session管理下,而SessionFactory是Session的工厂。Spring采用依赖注入的方式为DAO对象注入SessionFactory的引用。
Spring还提供了HibernateTemplate用于持久层访问,该模板类无须显示打开Session及关闭Session。它只要获得SessionFactory的引用,就可以自动打开Session,并在持久化访问结束后关闭Session,程序开发只需完成持久层逻辑,通用的操作则由HibernateTemplate完成。例如,要把某条数据存入的数据库中只需写如下代码即可,而不必关心Session的打开和关闭:getHibernateTemplate().save(object)。
通过Spring整合Hibernate,使持久层的访问更加容易,使用Spring管理Hibernate持久层有如下优势:
①通用的资源管理:spring使用applicationContext.xml管理SessionFactory,使得配置值很容易被管理和修改,无须使用Hibernate的配置文件。
②有效的Session管理:Spring提供了有效、简单和安全的Hibernate Session处理。
③IOC容器提高了DAO组件与业务逻辑层之间的解耦。
④DAO模式的使用,降低了系统重构的代价。
⑤方便的事务管理:Hibernate的事务管理处理会限制Hibernate的表现,而Spring的声明式事务管理力度是方法级。
⑥异常包装:Spring能够包装Hibernate异常,把它们从cheeked exeeption变为runtimeException;开发者可选择在恰当的层处理数据中不可恢复的异常,从而避免
烦琐的Catch/throw及异常声明。
2.2.3 Ajax技术在表现层的应用
Ajax技术在框架中的应用使得整个系统与用户交互的灵活性增加,界面设计更加人性化,下面以“基础信息管理”模块中为大项目添加小项目为例来介绍Ajax技术在系统中的应用。
1.编写JavaScript事件处理的js文件
2.为页面的目标控件中添加事件触发属性
3.在页面中添加事件响应函数SendRequest()
4.编写后台业务逻辑处理程序
5.在页面中添加响应处理函数callBackRequest(xmlHttpRequest)
2.3ASSH框架与其他解决方案的比较
本文设计的ASSH框架是由Struts、Spring、Hibernate以及Ajax技术整合而成的。其中以Struts负责表现层,以Spring负责业务逻辑层,以Hibernate负责数据持久层,在表现层加入Ajax技术对页面进行优化。
在表现层,目前比较好的软件框架有Struts、webworks、Spring MVC、TaPestry、JSF等。相对于其他框架Struts的优势主要体现在以下几点:
①以HTTP为中心:Struts设计围绕标准HTTP请求一响应模式,为许多Web开发人员所熟悉。
②强大的标签库:利用Struts提供的taglib可以大大节约开发时间,简化构造和开发应用程序的过程。
③可扩展性:所有默认的设置都可以配置。核心Struts类可以被重写和子类化。开发人员可以定制关键类如ActionForm和Action。
④逻辑名称的特性能够将视图层与模型层隔离开,使得任何一方的改变不会影响到另一方,使系统祸合性降低。
⑤表单验证解决了请求数据的验证问题,增强了系统健壮性。
⑥页面导航使系统的业务流程脉络清晰,系统各部分之间的联系可以通过配置文件反映出来,从而简化了系统后期的维护工作。
⑦框架己经非常成熟,有着众多的开发群体,使产品有稳定的发展保障。
在传统的J2EE Web应用开发中,通常使用EJB技术实现系统的业务逻辑处理,而且业务逻辑处理常常与表现层混杂在一起,为系统的后期维护与扩展带来了难以估计的困难。本文按照J2EE三层结构将业务逻辑层独立出来,用Spring框架来实现,与EJB相比,Spring在提供服务时具有更大的灵活性,例如:对于不同的应用程序,你可能希望选择不同的企业级服务。譬如说,如果使用EJB,事务管理就必须使用JTA,哪怕你只使用一个数据库也是如此;而如果使用AOP,你在这种情况下就可以选择JDBC事务管理器,后者的性能开销比JTA要低得多。Spring框架允许以这种可接插的方式获得企业级服务,从而使你可以按需选择企业级服务。基于AOP的方案可以将企业级服务(以及所有的声明性服务)提供给POJO。这与轻量级容器提供的无侵入性是一致的,AOP方案的可测试性也高于EJB编程模型。
并且Spring框架还具有以下优势:
①促使我们面向接口编程,遵循好的OO习惯,这给我们带来了可接插能力和可测试性。
②让我们可以用统一的方式管理应用程序的全部配置信息。
③基于标准的JeanBean基础构架。应用对象通常以JeanBean的形式实现,通过JeanBean属性就可以配置简单参数和协作对象的依赖关系。
④消除难于测试的Singletion模式,并且不再需要在应用代码中进行资源查找(这通常涉及难于在测试环境下模拟的API,例如JNDI),从而改善可测试性。
⑤Spring提供了数据持久框架,可以采用JDBC,或者类似Hibernate的O/R mapping产品实现数据存取。
在数据持久层的主流解决方案除了Hibernate框架外,还有JDBC、EJB、JDO。
JDBC是低级别的数据库访问方式,JDBC并不支持面向对象的数据库表示。JDBC数据库表示完全围绕关系数据库模型。在大型应用程序的DAO中书写这样的代码,维护量是非常大的。
EJB定义了两种持久化的解决方案:一种是BMP,另一种是CMP。其中CMP不需要将SQL语句加入到代码中。目前,在采用J2EE的应用中,EJB CMP方式得到了广泛应用。但是,CMP的使用比较复杂,对很多开发人员来说比较难以掌握。而且,不是在所有的情况下都适合在系统中采用EJB,而且想要非常清楚的了解EJB规范也是非常费时的。在用EJB编码前,先要让专家理解API,然后需要了解每一个容器部署时所要关注的技术。
JDO是一个存储Java对象的规范,JDO规范1.0的提出可以使你将精力集中在设计Java对象模型,然后在企业应用软件架构的不同层面中存储传统的Java对象(Plain Old Java Objects,简称POJOs),采用JDOQL语言进行SQL操作。一些公司(包括Sun)企图根据JDO规范进行设计并实现JDO产品,然而他们都不能很好的进行实现,并且性能优化上比较差。
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了轻量级的对象封装,使Java程序员可以随心所欲的使用对象编程思维来操纵数据库。它不仅提供了从Java类到数据表之间的映射,也提供了数据查询和恢复机制。相对于使用JDBC和SQL来手工操作数据库,Hibernate可以大大减少操作数据库的工作量。另外Hibernate可以利用代理模式来简化载入类的过程,这将大大减少利用Hibernate QL从数据库提取数据的代码的编写量,从而节约开发时间和开发成本Hibernate可以和多种Web服务器或者应用服务器良好集成,如今已经支持几乎所有的流行的数据库服务器。
在传统Web应用系统中,存在用户为了调用某项功能而在大量的页面间跳转的问题。虽然说这并不是一个很大的问题,而且用户所需要的功能都已经实现,但是频繁的页面跳转,甚至有些是重复的跳转充斥在用户的操作过程中,容易使用户产生厌烦感,从而对软件的认可度降低。俗话说“细节决定成败”,也许正因为这样一个微不足道的细节成为用户放弃我们所开发的系统的原因。
Ajax技术的使用可以使Web系统在不刷新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地响应用户交互,并避免了在网络上发送那些没有改变的信息,提高了系统的可操作性。
本文出自 张宾
基于ASSH框架的J2EE WEB应用与实现
posted on 2009-05-07 17:48
特立独行 阅读(756)
评论(0) 编辑 收藏 所属分类:
J2EE核心技术