




已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第1章 Struts框架技术第1章 Struts框架技术基于Struts 1.X版架构的Struts框架技术可以说是目前Java开源社区中最经典的一个Web MVC框架。尽管目前厂家已经推出了许多其他的Web MVC框架技术如Spring、WebWork和JSF等,再加上Apache开源社区于2007年推出了基于WebWork技术体系架构的Struts 2.0框架技术,但是基于Struts 1.X版架构的Struts框架技术由于以其独有的流程控制和稳定而广大的用户群优势,在今后的一段时间内仍然会屹立于Java开源社区领域。本章将系统地介绍基于Struts 1.X版架构的Struts框架技术,主要内容涉及Apache Struts框架技术、Struts框架的体系架构、Struts框架系统中的各种核心组件、与Struts框架系统有关的各种XML配置组件和资源配置文件等方面的内容。最后,再通过一个具体的应用示例来说明基于Struts框架技术项目开发的基本流程和程序实现的基本步骤。1.1 Apache Struts框架技术1.1.1 基于应用框架技术的软件系统开发struts + spring + hibernate1应用框架(Framework)技术1)什么是框架技术 Spring框架的设计者Rod Johnson对框架技术的描述是:框架是可重用的、半成品的应用程序模块,它可以用来产生专门的定制程序。比如Sun 公司的J2EE技术规范和标准其实也就是一个框架体系、Microsoft公司的VS.Net技术平台其实也是一个框架体系。人们对相同类型问题的解决方法进行抽象,从而抽取出能够解决某一应用问题的模板程序并提供给其他的开发者来实现重用,而所抽取出的模板程序也就逐步地发展成为某种框架系统;因此,应用框架其实也就是解决某种特定应用领域问题的半成品程序,或者是一组功能组件(业务功能组件和应用服务组件,而其中的应用服务组件是可被重用的),同时也是成熟的、系统不断升级、功能不断完善和扩展的软件组件。因此,一个应用框架是一个可复用的软件设计的产物,它定义了某个具体的应用体系结构,并清晰地描述了构成该体系中的各个组成组件之间的依赖关系、职责分配和控制流程。当然,软件系统的开发者基于某种应用框架技术来开发自己的应用系统时,强调的是能够达到在软件系统设计方面的可重用性和软件系统的功能可扩充性的目标,从而缩短大型应用软件系统的开发周期和降低开发中的成本,并提高软件系统的开发质量和软件系统的整体性能。2)为什么会出现应用框架技术如果从更高层次的抽象来看某个应用系统,主要是由业务功能组件和应用服务组件所构成的,而其中的应用服务组件(比如事务、安全、缓存、数据库连接等)是可被重用的,请参见如图1.1所示的软件系统的组件图。这样如果能够把在不同应用系统中有共性的一些技术实现抽取出来,并做成一个半成品程序这样的半成品程序也就是所谓的程序 框架。图1.1 应用系统是由业务功能组件和应用服务组件所构成的2应用框架所体现出的主要特性1)框架是针对特定的问题领域的一种解决方案框架很难成为通用的解决方案,而且也没有必要达到如此的功能要求。一般都是针对某个特定的问题领域的一种解决方案。例如,Struts框架技术是一个针对J2EE Web开发的表示层框架,而Spring框架属于应用层的框架,它提供的是一种“对象管理”的技术(包括生命周期和依赖关系、缓存等);当然,Hibernate框架是一个实现对象关系映射的持久层框架。应用系统的开发者在应用某种框架技术进行系统开发时的主要目标是希望通过该框架能够达到应用系统在设计方面的可重用性和应用系统在功能方面的可扩充性,以缩短大型应用系统的开发周期,同时也提高所开发的软件产品的质量和降低开发的成本。所有这些特性都得益于应用框架所具有的领域相关性,而且更注重于面向某个特定应用领域中的应用系统的重用。2)框架包括一组来源于特定问题领域的抽象概念例如Apache Struts框架是基于MVC设计模式进行设计的,所以它必须要对应用系统中的“模型(M)”、“视图(V)”和“控制器(C)”等建立出抽象;而Hibernate框架由于定位于解决应用系统中的持久层有关的技术问题,因此它是一个持久层方面的框架,当然也应该对与数据库访问相关的各个概念进行抽象。3)框架使得抽象概念能够相互协作,并提供扩展的接口以实现重用框架在抽象概念上进行工作,定义抽象概念之间的协作方式;同时也为框架自身提供了扩展的接口,使得自身能够满足特定的应用场合时的应用需求应用框架、普通的程序或某个系统平台的API类库的主要区别就在于开发人员可以通过对框架进行扩展,来重用和完善该框架系统本身;而对这些扩展点的设计是框架系统本身的设计核心当然,可以采用继承或者是接口实现等多种不同的技术实现形式。例如,在Struts框架系统中,采用的是类继承的扩展方式,如对Action类和ActionForm等组件进行扩展时都是通过继承的方法来实现的。因此从系统耦合的角度来看,采用实现框架的接口能够使得应用系统本身具有一定的实现灵活性,而采用继承则会造成紧密耦合关联。从这样的角度来看,Struts本身的设计是不完美的,是“侵入式”的框架;而Spring MVC框架则改进了Struts框架的系统设计,采用普通的JavaBean组件类(POJO)的实现技术。3为什么目前在企业应用项目中要采用框架来开发应用系统1)面向对象编程和面向组件编程技术面向对象编程技术促进了软件系统中的各个组成元素的可重用性、特别是类代码的重用。但是,它也只是实现了“程序类”这样的组成元素的可重用性。因此,从软件系统开发中的可重用的“粒度”来看是比较小的!导致的最后结果是软件系统中的可重用度太小,在提高开发效率方面所体现出的效果不太明显。而面向组件编程技术则进一步地完善了面向对象编程技术,并使得应用系统的软件能够以组件这样的更大“粒度”的程序模块来被重用。但问题是,面向组件编程技术也仅仅是提高了程序代码的可重用度,但在软件系统的分析、设计和架构思想等方面并不能加以重用或者重用率并不太高。因此,在软件开发中提出了许多能够更好地实现重用或者提高软件系统重用度的各种方法,如系统体系结构、应用框架、设计模式等方面的思想和应用技术。2)为什么目前在企业应用项目中要采用框架技术来开发应用系统在Web应用系统的设计和开发实现中,随着应用系统所要解决的业务逻辑功能实现的要求越来越复杂化,而如何设计并实现一个高性能、可复用性、可扩展性和可维护性的应用系统,最终能够降低应用系统开发和维护的成本,一直是目前IT软件界普遍关注的焦点问题。因为软件系统发展到今天已经是很复杂了,特别是基于B/S系统架构的Web服务器端应用系统的开发和实现,所涉及的知识、技术和所要解决的业务功能中的问题实在是太多了。如果在应用系统的设计和开发实现之中,在系统的功能实现方面、组件设计等方面,如果能够使用第三方开发人员所提供的成熟的应用框架,就相当于让“第三方”的开发人员帮助本软件系统的开发者完成了一些基础性的设计和编程开发实现工作。4采用“应用框架”方式的系统开发的主要优点1)能够实现在系统分析、设计、组件类代码等多层次的重用如果应用框架技术来开发应用系统,就能够在多个不同的层次上实现重用这不仅体现在系统的功能代码的实现方面,也体现在系统中的体系结构及组件类的设计方面。比如在系统的分析抽象层上,重用的元素主要有子系统、类等,此时的系统设计人员只需要专注于对业务领域的了解,使需求分析能够更充分;而在应用系统的设计层面上,可重用的元素有系统体系结构、子系统体系结构、设计模式、框架、容器、组件、类库、模板、组件类等,这不仅可以实现在代码方面的重用,还包括在设计思想和方法等层次的重用。当然,软件系统开发的效率和整体质量也就能够得到明显提高。 如果开发人员仅仅是利用标准的J2EE Web组件技术中的JSP/Servlet组件来构建Web应用系统,当应用系统的业务逻辑功能实现越来越复杂的时候,系统设计和开发实现所带来的复杂度和所耗费的成本也将进一步提升;并且由于系统的结构设计不清晰(此时完全依赖于应用系统设计者的技术水平的高低)所带来的系统可读性也进一步降低,后期的系统维护和功能扩展的难度也就会进一步增加。2)应用框架技术开发应用系统能够简化和优化应用系统的设计和实现Rickard Berg(WebWork的创造者和JBoss创始人之一)曾经说过:“框架的强大之处不是源自它能让你做什么,而是它不能让你做什么”。Rickard的话不仅为开发人员解释了什么是框架:框架能够使原本很混乱的东西变得结构化;而且也清晰地告诉开发人员,在应用某种框架时不应该再进行什么行为因为应用框架能够将应用系统的设计和实现工作标准化,从而也就达到了简化和优化系统的设计和实现的目的。3)使软件开发与工业化中的大工业生产保持相同模式利用组件和框架来生产软件产品,并可以应用系统集成技术来快速地组装应用系统,从而使软件开发与工业化中的大工业生产保持一样的模式。这样的大工业化的软件生产方式将大大缩短开发周期采用框架形式的开发,要比一切从头并且自己独立地开发实现要快速、高效得多。因为在应用框架技术时,可以充分利用继承和重用等机制,从而最大限度地加快一个特定应用系统的开发实现的速度。4)同时也能够允许客户化地定制应用系统中的特性由于基于框架的系统有很多功能是通过配置而不是编程实现来完成的,这样也给开发人员带来了一定的便利。在系统的需求发生变化时,只需要修改相应的系统配置文件中的项目内容;建立更加开放的应用系统,因为对大粒度组件的重用(包括设计思想和实现代码)使得应用系统的开发成本大大地降低,并且框架技术提供的参数化配置使得应用系统本身的适应性、灵活性也进一步得到增强。5应用框架系统的一般组成为了使应用框架自身具有良好的可扩展性,在具体设计时一般都采用多层框架结构设计的策略。主要可以将应用框架分离为接口层、抽象层和实现层3个不同的组成部分。1)应用框架中的接口层对这一层的设计和实现要尽量使用接口(Interface)技术,主要的目标是要考虑到现在的、将来的可能扩展支持的功能,但不需要去具体实现它,而只需要定义出相应的各个接口就可以了;从而能够实现对本框架进行功能方面的扩展,例如Struts框架在设计时也体现了这个设计思想的具体应用,其中的插件接口PlugIn就属于这样的设计结果。2)抽象层(应用模板方法模式)在这一抽象层中要针对当前的应用需求做定制的功能实现,对需求中的通用逻辑 做完整的实现,并允许应用框架的使用者对它进行功能实现的扩展,如Struts框架中的ActionServlet、Action和ActionForm等组件类的设计实现,则是采用这样的设计策略。3)实现层为框架的使用者提供对通用问题的集中实现,以避免重复解决类似的技术问题,从而提高应用系统的开发效率和减少重复开发实现工作量。如Struts框架系统中后台所实现的各种系统功能服务和所提供的丰富标签库技术也是这样的设计产物。6主流的应用框架中所包含的解决方案正是由于企业应用框架提供了对下面所罗列出的各种问题的解决方法,同时本身又具有很强的普适性和实用性。从而使得软件系统的开发者在应用框架技术来开发企业应用系统时,大大提高系统开发的效率。1)持久性(Persistence)功能实现方面的支持主要是实现应用系统中的各种持久性数据的存储、处理,对象与关系之间的映射(O/R Mapping),数据的缓存控制等有关方面的技术实现。比如Hibernate框架中就提供对这些技术的支持和功能实现等。2)事务(Transaction)管理的提供通过事务技术能够确保一组关联的数据访问操作的行为正常、完整地执行,从而使系统中的业务数据保持一致性和完整性。比如Spring框架中所提供的编程式和说明式事务管理技术的支持等。3)安全性(Security)认证和数据保护许多应用框架能够为应用系统提供如下3个层面的安全性认证和数据保护的支持:身份验证(Authentication)、授权(Authorization)和安全传输。确保所开发出的应用系统具有一定的安全性,并简化开发人员对安全实现技术的复杂度。4)日志(Logging)记录记录系统正确运行情况中的各种状态和异常状态下的变化情况,记录用户的操作行为和结果,从而有助于对应用系统中的各种错误的跟踪和定位。7在“面向框架的应用开发”开发过程中应该注意的问题1)软件系统的开发形式从应用系统开发转变为对应用系统的集成由于在建立一个应用系统时需要重用基础框架系统中很多已有的组件模块,而这些组件模块可能是在不同的时间、由不同的开发人员所开发的,并有各种不同的用途和应用的环境。在这种情况下,应用系统的开发过程就变成了对组件接口、组件上下文以及框架环境一致性的集成过程。2)以接口为中心面向行为的设计和编程实现面向框架的应用开发侧重把应用业务本身的定义和实现相互分离,并提供访问的标准接口。因此,它是以接口为中心的、面向行为的设计和编程实现。只要接口相同,框架以及基于框架的应用系统本身中的各个组件就可以被同一接口的另一个实现类所替换。应用这样的设计策略开发实现各个功能组件类才有可能降低组件之间的耦合度。3)开发团队构建和人员构成问题传统软件系统开发中的人员组织一般是由系统分析人员、设计人员、程序员和测试人员所组成。对一个小型的应用系统来说,一个熟练的开发人员,可以兼顾以上多个不同的角色。但对面向框架的应用系统的开发来说,应用系统的整个开发过程一般应该是由6个不同角色的人员来完成和协作的,分别是: 组件开发者。也是组件供货商,大多数是中间件组件提供者。 应用组件集成者。针对某应用领域将已有组件组合成更大的组件模块或容器,作为系统部署的基本单元。 应用系统部署者。将系统部署的基本单元放入选定的平台环境或基本框架中,完成软件定制的要求。 开发平台服务器供应商。提供服务器、操作系统和数据库等基本软件。 应用系统开发工具供应商。提供组件公共设施服务。 系统管理员。配置硬件、网络和操作系统,监督和维护应用系统者。 这6个角色的工作性质和内容的专业性都很强,要兼顾成为多面手很不容易。因此,如何组织好开发队伍、使团队成员各尽所能和团结协作等问题,在企业级的软件项目特别是大型系统的开发中尤为重要并需要特别关注。8反思“面向框架的应用开发”给系统开发所带来的问题尽管应用框架技术来开发应用系统能够给开发者带来许多方便和高效等方面的益处,但在具体应用时也会给系统开发带来一定的负面作用。因此,合理和有效地应用各种框架是软件系统的设计和开发人员所应该把握的基本要求。有必要明确“面向框架的应用开发”给系统开发所带来的问题。1)应用系统出现冗余框架为了能够达到一般性和普适性,会提供很“丰富”的功能实现和相应的解决方案。这样的设计结果将导致采用框架来开发的某一个特定的应用系统会出现一定的冗余。当然,设计良好的应用框架可以进行定制并“瘦身”,这样将能够减少对应用系统所造成的冗余量。2)框架对应用系统技术实现的限制因为框架系统本身在设计和实现时,为了能够达到其特定的设计目标,一般会制定出某些规则而要求应用系统的开发者在应用时严格遵守,从而使得在对应用系统进行设计和实现时有一定的技术实现方面的限制。应用系统的设计者必须要在“鱼和熊掌”之间进行合理地取舍,并尽可能突破框架所带来的限制!3)对系统运行的效率等性能方面可能会带来负面影响对于基于框架技术所开发出的具体应用系统,由于许多功能模块的关联经常是通过配置(如XML文件)的方式来实现组装的。与采用直接硬编码的方式相比较,这虽然在开发方面能提供很大的灵活性,但也往往牺牲了应用系统在运行时的效率;同时也对错误的定位和修正带来一定的不便。4)对技术平台的锁定和依赖一个采用特定框架技术实现的应用系统几乎会被锁定在这个框架厂商所提供的软件产品上,这样当系统需要进行平台或者运行环境等形式的移植时,将要求对系统的设计和功能实现代码进行全部或者部分的改写。这对软件系统的开发者来说,也是一个比较痛苦的事情!为此,应用系统本身在设计和编程实现时,开发人员一定要采用一定的技术实现手段达到与框架相互隔离的实现目标。5)人为地增加了学习的任务和负担由于目前的企业级的应用框架提供了针对多种不同的应用场景下的问题的解决方法,其中所包含的设计思想、技术和应用技巧很多;对框架的应用开发者来说,要精通特定框架的开发和使用,便要熟悉其中的所有的各种组件的用法、解决问题的思路和优点、缺点的区分等。因此,对于应用系统的开发者而言,人为地增加了许多学习的任务和负担。因此,需要根据自己的时间和精力合理地对框架技术的应用知识进行掌握,并采用“学为所用”的学习方法。1.1.2 Struts基于MVC的Web应用经典框架1Struts是目前应用最广的Java Web开发框架2000年5月,Struts框架由Craig McClanahan 开发完成,现在作为 Apache 软件基金会的一个开源项目。Struts框架的推出,不仅极大地简化了当时的J2EE Web服务器端开发技术中的 JSP和Servlet编程实现,而且也保证了应用系统是基于MVC架构而开发实现的;它不仅简化了J2EE Web编程模型并提供了一种快速高效的构建Web应用程序的方法,同时它还产生了一个庞大的开源技术社区Struts框架自从诞生之日起,就获得了Apache Jakarta开源社区的普遍关注。那么Struts Web应用框架到底是什么呢? 它是开源框架:Struts 是 Apache 软件基金会资助的一个为开发基于MVC模式的Web应用而设计的一个开源框架。 Struts框架中的各种组件都是标准的J2EE Web组件:它利用Servlet、JavaBean和JSP、定制标签库等Web组件以及XML等方面的技术来实现构建Web应用系统。 它同时也是基于MVC模式的Web应用最经典的框架:作为一个日渐成熟的优秀框架技术(目前已经为Struts 2.0版),Struts框架在构建基于MVC模式的J2EE Web应用系统有许多技术方面的优势。因此,Struts框架是目前J2EE技术平台中最成熟、应用最广泛的开源MVC Web框架,它为Java Web应用系统的开发者提供了一个结构清晰、功能丰富的开发平台;同时Apache Jakarta开源社区中有关Struts的技术资料文档非常丰富,这将方便读者的学习和应用;另外,由于熟悉Struts框架技术的开发者非常多,在项目开发过程中不会因开发人员的流动问题而造成开发人才的短缺。注意:Struts框架的名称Struts是英文Strut的复数形式,而Strut单词为“支柱”和“支撑”的意思。Struts框架之所以叫Struts,是因为设计者希望Struts框架能够成为J2EE Web应用系统的“支撑”。2Struts MVC框架产生的技术背景利用JSP Model One模式构架Web站点1)构架模式的实现原理该构架模式的实现方式是利用“JSP + JavaBeans(或者JSP+Servlet)”等标准的J2EE Web组件构建出Web应用系统,其核心的基本思想是将完成业务功能处理的JavaBean组件类代码从表示层的JSP页面中分离出来。如图1.2所示为JSP Model One 模式系统构架的工作原理图,用户在浏览器端的请求页面中发出请求,该请求一般是向应用服务器端的某个JSP页面发出;JSP页面再调用具体完成业务功能的JavaBean组件类中的业务功能方法,由该业务功能方法实现最终的业务功能操作(如访问数据库表中的数据和业务逻辑的处理实现等);然后业务功能组件再将处理后的结果数据返回到某个显示处理结果的JSP页面中,响应请求的JSP页面将处理后的结果发送到显示结果的另一个JSP页面以实现结果的显示输出。图1.2 JSP Model One模式系统构架的工作原理2)该构架模式的具体应用场合该构架模式一般适用于中型Web站点的开发环境,此时的JSP页面组件同时承担视图表示(View)与控制调度(Control)的作用,因此JSP页面组件承担了多重职责!另外,该方式也还会导致在JSP页面中出现大量的Java脚本代码,因为在JSP页面中需要对业务功能组件中的业务方法进行调用,这可以参考如图1.3所示的利用JSP Model One 模式构架的Web站点中的某个功能页面的实现示例,以了解这样的特性。图1.3 利用JSP Model One模式构架的Web站点中某个功能页面示例3Struts MVC框架产生的技术背景利用JSP Model Two模式构架Web站点1)构架模式的实现原理该构架模式其实是MVC构架模式在J2EE Web组件技术上的具体应用,在该构架模式中,主要是利用MVC构架模式中的模型(M)、视图(V)、控制器(C)3种不同形式的组件来构建具体的Web应用系统的。其中的模型组件(Model)由JavaBean组件承担,并完成业务功能和数据处理等方面的功能,而视图(View)组件由JSP页面承担、并实现人机交互的前台界面,最后的控制器(Control)组件部分则由J2EE Web组件技术中的标准Servlet组件承担,主要实现调度JSP页面和JavaBean组件等方面的功能。如图1.4所示为JSP Model Two模式的系统构架的工作原理图,用户在浏览器端的请求页面中发出请求,该请求向应用服务器端的某个控制器Servlet组件发出;该Servlet组件将根据请求的类型相应调用具体完成业务功能的JavaBean组件中的业务功能方法,由该业务功能方法实现最终的业务功能操作(如访问数据库表中的数据或者进行业务功能处理等);然后业务功能组件再将处理后的结果数据返回到该控制器Servlet组件中,控制器Servlet组件将处理后的结果转发到显示结果的另一个JSP页面以实现结果的显示输出。图1.4 JSP Model Two模式系统构架的工作原理注意:在很多场合下交互使用JSP Model Two 和 MVC 这两个词已经很平常了,一般将没有应用观察者设计模式中“通知”的MVC称为Web MVC。JSP Model Two模式其实是Web MVC。2)标准MVC模式的实现原理Smalltalk MVC方案使用观察者通知模式实现,其中的每个视图组件注册为一个模型数据组件的观察者。然后模型组件可以通过发送消息给所有注册的各个观察者视图组件,通知它们相关的改变。MVC模式是软件设计中的典型系统架构设计模式,依据MVC的设计思想可以将一个复杂的应用系统分解为模型、视图和控制器3部分,分别对应于应用系统中的业务逻辑处理和业务数据、用户操作界面、用户请求的处理和数据访问的控制、管理和调度操作。MVC模式是用来帮助软件系统的开发者控制“变化”(应用系统中的功能、环境、性能等方面经常是会发生改变的,应该要做到在系统发生最大的变化时,系统开发者所要做的改动最小。)的一种设计模式。MVC的设计理念认为:在一个具体的应用系统中,用户界面发生变动的可能性是最大的,而控制部分的变动次之,当然业务逻辑功能的实现一般是最稳定的。如图1.5所示为Smalltalk MVC(也称为标准的MVC)工作的机制和工作原理图,它是通知/订阅 者(Notify/Subscribe)协议和观察者 (Observer)设计模式的具体应用。图1.5 MVC工作的机制和工作原理图在Smalltalk MVC设计模式中的模型组件代表应用系统程序的主体部分,模型组件表示业务数据或者业务逻辑功能实现,而MVC设计模式中的视图组件是应用程序中用户界面相关的部分,是用户能够看到并与之交互的操作界面(在Web应用系统中也就是浏览器页面);当然,MVC设计模式中的控制器组件主要是根据用户的输入,控制用户界面数据显示和更新模型组件对象的状态。3)Web MVC架构不同于标准MVC模式的实现图1.6表示了一种基于MVC架构的Web应用系统中的各个层中组件之间的交互情况,由于在此架构中没有应用观察者设计模式中的“通知”组件来通知各个视图组件,因此是属于Web MVC架构。Web MVC架构区别于Smalltalk MVC的一个主要原因是,观察者/通知模式不能应用在基于HTTP协议的Web环境中。因为HTTP 是一个“拉”的协议:只有客户发送请求后,服务器才输出响应;没有客户的请求也就没有服务器端的响应输出。而观察者模式需要的是一种“推”协议来进行通知,以便服务器能在模型改变时将信息推送到客户端。图1.6 基于Web MVC架构的Web应用系统中的各个层中组件之间的交互情况由于在Web MVC架构中倡导应用系统的“表示”和应用系统中的“模型”功能实现彻底分离,而两者通过控制器组件进行相互关联。因此为业务逻辑功能编写的实现代码不应该和反映用户界面的实现代码相互混杂在一起,而应该是彼此尽可能地独立和分离,并由控制器来担当两者交互的中介。Web MVC模式和标准的Smalltalk MVC模式之间的每个组件的主要职责并没有改变,但控制流程有轻微的改变,即查询状态和改变通知都必须通过控制器组件实现;另一个改变是,当视图或者表现层需要渲染动态页面时,它使用从控制器传递的数据而不是直接来自于模型层。这种改变能够分离“表示”和“模型”之间的耦合,允许控制器选择数据和实现显示这些数据的视图组件。4)有必要对常规Web MVC的实现方式进行简化和标准化Web MVC模式是为同样的数据需要提供多个不同的视图的应用而设计的,它很好地实现了数据层与表示层的分离。但软件系统的开发者在应用常规Web MVC模式来具体构建J2EE Web应用系统时,各层组件的分配和职责的定义完全是取决于系统开发者的技术水平和设计经验,并且其中的控制层结构不清晰,在职责的分配方面易与业务层组件相互混淆。如图1.7所示为常规Web MVC的实现方式中的控制层和表示层以及业务层之间的关系,从该图中可以明显地看出,控制层与业务层之间的关系不仅为“多对多”的关系,而且控制层与表示层之间的关系也为“多对多”的关系。图1.7 常规Web MVC的实现方式中的控制层结构不清晰并且易与业务层混淆因此,基于这样的系统架构设计,从系统的总体全局的角度来看时,整个系统中的表示层、控制层和业务处理层3者之间的关系将是非常复杂的!那么能否对常规Web MVC的实现方式进行简化和标准化?4Struts MVC框架产生的技术背景Struts MVC2框架产生及提出的目的由于应用系统的开发者在进行J2EE Web应用的系统开发中,随着系统中的业务功能的要求越来越复杂,将使得开发者在设计和系统实现时代码的可重用性、代码的可移植性以及代码的可扩展性等方面提出了更高的要求。否则将导致许多重复性的开发工作,并且系统的维护也比较困难。Struts MVC2框架的提出和产生,主要是为了能够使开发者在构建基于标准的J2EE Web技术的Web应用系统时更加简单和高效,并隐藏烦琐的Web MVC各个部分的具体实现的细节;从整体上减轻构建J2EE Web应用项目的设计和开发的负担,并为Web应用系统提供、异常处理和数据库连接池等共性的技术服务的支持,从而为应用系统提供基础功能服务。Struts MVC2框架还为应用系统的开发者提供了一个统一的标准Web应用框架,这样可以让应用系统的开发者能够更专注于应用系统的业务逻辑功能的具体实现。5Struts框架一个可重用的 MVC 2 设计实现1)Struts 框架是对Web MVC模式的具体实现Struts框架作为一个可重用的 MVC 2 的设计实现,不仅将常规的Web MVC设计模式中所倡导的分离应用系统中“显示逻辑和业务逻辑”的设计思想加以具体地应用和实现,而且Struts框架中的MVC 2与JSP Model Two模式中的Web MVC也是有不同的技术实 现主要表现在原有视图层(HTML/JSP页面)和控制层(Servlet组件)之间添加了一个前端控制器组件ActionServlet作为控制层中的一个前端控制器,系统中的所有有效的业务功能请求都要经过该前端控制器ActionServlet组件来分发和导航。此时的应用系统将通过该总控ActionServlet组件来管理所有的请求行为,并由它来决定哪个具体的后端业务调度控制器Action组件被真正调用并处理表示层中的具体业务功能的请求;另外,在系统设计实现方面将标准的Servlet组件改成了Action组件以统一处理浏览器端所产生的Get和Post方式的请求;同时Action组件可以通过XML的配置文件来进行管理,这在一定程度上增加了应用系统的整体结构的灵活性和可扩展性。如图1.8所示为Struts框架的系统架构中的各个层组件的分布示图。图1.8 Struts框架的系统架构示意图其中的ActionServlet组件为中央调度控制器,这样的系统架构设计方案将使得应用系统中的架构层次更加清晰,而各个后端业务控制器Action 类为各个具体的业务调度控制器;整个系统中的前端和后端控制器组件在功能实现和职责之间相互分离、职责清晰。2)Struts框架的主要技术优点利用Struts框架进行Web应用系统开发时,不仅从整体上能够减轻构建J2EE Web应用系统项目的设计和开发实现的负担,也为Web应用系统提供国际化、异常处理和数据库连接池等方面的技术支持。开发者使用Struts 之类的框架是为了隐藏诸如对HTTP、CGI以及JSP之类技术应用的烦琐技术实现细节。(1)“填空”式地开发实现应用系统。Struts 框架本身实现了MVC模式,也发展了MVC模式;应用系统的开发者可以采用“填空”式的方式来进行开发,因为Struts 框架将一个标准的MVC的具体实现中的各个组件部分已经划分清晰和组件分离了。另外Struts框架还把标准的Servlet、JSP、自定义标签(TagLib)和信息资源(Message Resources)等整合到一个统一的应用框架中,开发人员利用该应用框架进行应用系统的开发时,不用再自己设计和编码实现MVC模式中的各个层的核心组件和应用系统的体系架构的正确性,因此能够节省开发时间和降低实现的风险。(2)降低应用系统中的各个层组件之间的耦合度。采用Struts框架技术,可以加快应用系统的开发速度、增强应用系统的灵活性、降低应用系统中的各个层组件之间的耦合度。因为它将应用系统中的表示层和控制层彼此松散地耦合在一起,这主要得益于采用struts-config.xml配置文件进行各个组件的配置管理;这样的设计方案也易于对系统的维护和功能扩展。(3)各个开发人员之间的分工明确。由于基于Struts框架技术实现的Web应用系统中的控制层、业务层与表示层3者之间各自相互分离,所以这样的设计方案能够使应用系统中的表示层的开发者(网页设计人员)与后台业务功能具体实现的Java程序员各司其职和分工明确,并且可以并行开发,提高开发效率。(4)简化表示层页面的设计和实现。在Struts框架中,应用系统的开发者可以在表示层的页面中大量地使用Struts框架中所提供的定制标签库技术,以实现在页面中把业务逻辑处理的功能实现代码分离开。从而简化系统中表示层的设计和开发实现,进而避免在页面中出现大量的Java脚本代码。1.2 Apache Struts框架的系统组件1.2.1 Struts框架的系统体系构成1下载Struts框架的系统包文件可以登录Apache的官方网站,进入Struts框架的下载页面后就能够看到如图1.9所示的系统包文件的下载页面信息。可以根据自己的应用需要选择某个版本,如Struts 1.3.8的下载链接而下载对应版本的Struts框架系统包文件。2Struts框架的体系构成1)Struts框架主要由两个相对独立的组成部分构成Struts框架包含有两个相对独立的组成部分,其中第一个部分是Struts 框架API利用这些API中的各个相关的类和接口,开发者可以编写基于Struts框架技术的Web应用组件;另一部分是Struts框架表示层中的各种标签库主要是由Html、Bean、Logic和Tiles等标签库所组成,利用这些标签库可以进一步改善表示层中的JSP页面组件的开发实现,并避免在页面组件中包含过多的Java脚本代码。2)各个部分的主要文件资源如图1.10所示为在Eclipse开发工具中所创建的某个Struts项目的文件结构,在左面的图中可以了解到Struts 框架API所对应的各个*.jar包文件,而通过右面的图可以了解到Struts框架表示层中的各种标签库的描述文件(*.tld)。图1.9 Struts框架的下载页面信息图1.10 在Eclipse中所创建的某个Struts项目的文件结构这些标签库的描述文件主要是struts-html.tld(HTML标签库)、struts-logic.tld(逻辑标签库)、struts-bean.tld(Beans标签库)、struts-tiles.tld(动态模板标签库)和struts-nested.tld(在页面表单中应用聚合关系的JavaBean成员属性对象)。当然,也可以将Struts 框架的系统JAR文件设置为共享方式,以便使多个不同的Web应用能够共用以减少重复添加,Struts 框架的系统的JAR文件可以被Web容器中的所有应用所共享。只需要简单地将Struts框架的系统JAR文件放在Web容器的共享的lib 文件夹中对Tomcat服务器来说,共享库文件夹位于$TOMCAT/common/lib目录中,然后在各个基于Struts框架的Web应用的/WEB-INF/lib目录中将不再需要重复添加它们。1.2.2 Struts框架系统核心组件Struts的体系结构实现了MVC设计模式的概念,因此分别在模型(M)、视图(V)和控制器(C)3个方面提供了对应的技术支持组件,从而构成了Struts框架系统中的核心功能组件。1Struts框架中与MVC设计模式相关的各个层组件1)Struts框架中各个层的组件如图1.11所示为Struts框架所对应的MVC各个层中组件类之间的关系图,是对Web MVC系统架构模式的标准实现描述。图1.11 Struts框架中与MVC相关的各个层组件的类关系图从图1.11中可以了解到,Struts框架中的表示层中主要有下面的各个组件类JSP页面(包含表单)、表单数据的包装ActionForm组件和响应结果的JSP页面组件类;而在控制层中有前端控制器ActionServlet组件、ActionMapping组件、ActionForward组件和业务调度Action组件等;在模型层中没有提供基础性的功能组件,完全由开发者自己开发 实现。2)Struts框架的系统工作原理Struts框架的工作流程充分体现了MVC系统的表示层和业务处理相互分离的特点,如图1.12所示为完成某个特定的请求处理的顺序图。各逻辑层中的各个功能组件各司其职,但互相配合,并通过struts-config.xml文件中的各个配置项目来降低系统中的各个逻辑层之间的耦合性。某个操作者用户在Web页面中假如发出/showInfo.do的Http表单请求,该请求将被前端控制器ActionServlet组件所接收;而ActionServlet组件将表单中的各个请求参数首先包装到ActionForm组件中,然后再根据在struts-config.xml文件中的标签中所定义的Action 类的配置获得目标Action组件,并对该目标Action组件中的execute方法进行调用。图1.12 完成某个特定的请求处理的顺序图目标Action组件再从ActionForm组件中获得请求的参数、检查数据的合法性,并对具体业务功能组件中的业务方法进行调用,由业务功能方法完成特定的业务功能;业务方法返回执行后的结果,目标Action组件根据业务方法返回的结果再创建出包装目标页面的ActionForward组件,并将该ActionForward组件返回给前端控制器ActionServlet组件。最后,根据ActionForward组件中所包装的目标页面文件名称,由ActionServlet组件加载该目标页面并在客户端显示输出其结果,操作者最后将能够看到本次请求的处理结果。2Struts框架MVC中的模型层(Model)组件基于MVC架构的应用系统中的模型层(Model)组件从概念上可以分为两类概念模型(实体组件)和设计模型(业务处理组件)。其中的实体组件是对物理实体的抽象并封装了应用系统的内部状态信息,主要代表业务实体的数据,并可以由普通的值对象(VO对象,Value Object JavaBean)表示;而业务处理组件主要是对业务逻辑处理功能的具体实现,也由普通的JavaBean组件类表示。在Struts框架中为什么没有提供业务功能的基础性组件呢?这是因为业务功能组件中所包含的“业务逻辑和规则”是与应用的问题领域紧密相关的,很难实现重用!因此,在Struts框架中没有提供相应的业务功能的基础组件因为Struts框架是模型中立的,并没有对后端的模型做任何的假定和实现。因此,一个具体的应用系统可以按其最有效率的方式来实现其特定的模型层功能组件而对这部分的功能实现,则主要是由开发者自己完成具体功能的实现。另外,在应用系统模型层的具体技术实现时,Struts框架也可以很容易地与现有的各种数据访问技术相互结合,如标准的Java JDBC技术、分布式的企业JavaBean组件(Enterprise JavaBean,EJB)以及其他第三方的开源框架如 Hibernate/iBATIS等。3Struts框架MVC中的表示层(View)组件Struts框架MVC中的表示层主要是通过常规的JSP页面技术实现(当然,也支持其他形式的表示层技术实现,如XML、Velocity模板等),但为了简化页面开发和减少页面中的Java脚本的数量,提供了丰富的标签库组件;另外,为了能够对表单中的数据进行包装,还提供了ActionForm组件。Struts提供的ActionForm组件对象可以通过定义出成员属性来描述和映射客户端表示层页面表单中的数据,并且可以从请求中自动组装ActionForm组件对象(具体是利用Java语言中所提供的反射技术加以实现的)。ActionForm为标准的JavaBean组件类,用户表单所对应的ActionForm组件类继承于org.apache.struts.ActionForm类。这个组件类主要是捕获通过请求所提交的表单参数,并对它们进行包装。开发者也可以从ActionForm组件类进行继承并派生出相应的子类,利用它和Struts框架中所提供的自定义标签库技术相互结合,可以实现对客户端页面中的表单数据的良好封装和支持。因为Struts框架的设计者倡导应用系统的开发者使用值对象(Value Object,VO)来包装表单中的各个成员域数据,从而达到以面向对象的方式进行表单数据的访问操作的目的。注意:对于ActionForm组件对象也可以将其归纳为模型层组件,因为它封装有用户请求的参数。但它更应归属于表示层(因为ActionForm组件是与页面表单相互绑定的);JavaBean是一种可重用的组件,在JavaBean组件类中必须提供无参数的构造方法,并且为其内的成员属性提供get/set方法,其他的Java类可以通过JavaBean自省机制发现和操作JavaBean组件中的成员属性。4Struts框架MVC中的控制层(Controller)组件1)Struts框架控制层中的前端控制器ActionServlet组件Web MVC模式中的控制器组件主要是承担获得客户端页面所产生的Get/Post请求,并根据请求的具体类型而选择执行相应的业务功能逻辑组件类中的业务功能方法,然后把处理后的结果数据返送回到客户端浏览器页面中。在Struts框架MVC中的控制层主要是由ActionServlet、Action和ActionMapping、ActionForward等组件类所构成。其中的ActionServlet组件作为前端控制器(也作为整个系统的总控制调度器,在Struts框架中提供ActionServlet组件,其实是应用了J2EE核心设计模式中的前端控制器的设计模式)以接收客户端的Http请求提供ActionServlet组件可以为Web应用系统提供一个固定的访问入口点,并且所有的有效业务请求都将发送到Struts框架的前端控制器ActionServlet组件中。但ActionServlet组件包括一组基于配置的ActionMapping和ActionForward组件对象,每个ActionMapping对象实现了某个特定请求到一个具体的业务调度控制处理器Action类对象之间的映射。ActionServlet框架继承自标准的javax.servlet.http.HttpServlet类,并负责将HTTP的客户请求信息组装后,根据在struts-config.xml配置文件中的指定描述项目,转发到适当的后端业务调度处理器Action组件类(也就是它使用URI或者路径Path来决定哪个Action 组件将用来处理请求)。并按照Servlet组件技术的标准,所有的Servlet组件必须在应用系统的部署描述文件(web.xml)中定义和声明。因此,ActionServlet组件也必须在web.xml中进行描述,读者可以参考下面的【例1-6】中的配置内容的示例。注意:在表示层的JSP页面中一般是以*.do形式的URL地址进行请求,当然也并非所有的请求都必须要通过ActionServlet组件,它只对表示层中以*.do形式的URL请求进行响应。在具体开发时,应该将有效的业务功能请求设计为*.do形式。而将一般的页面跳转和系统中帮助信息的显示输出等有关的请求设计为非*.do的形式(如*.jsp)以提高对这些请求的响应速度。2)Struts框架控制层中的后端业务调度
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025昆明市第二人民医院融城老年病医院(5人)考前自测高频考点模拟试题及答案详解一套
- 2025贵州黔晨综合发展有限公司招聘录用人员模拟试卷完整参考答案详解
- 2025江苏连云港灌江农业发展集团有限公司招聘拟聘(第二批)考前自测高频考点模拟试题及答案详解(夺冠)
- 2025技术岗位劳动合同范本
- 2025贵州铜仁市江口县人民医院招聘青年就业见习岗位人员2人模拟试卷附答案详解(黄金题型)
- 2025大连市产品购销合同
- 2025湖北交投实业发展有限公司服务区管理员遴选人员模拟试卷及答案详解(新)
- 编导理论考试题库及答案
- 福建电力考试题库及答案
- 员工培训资料与认证管理工具
- 胸痛的鉴别诊断和诊断流程课件
- 混料错料预防措施培训课件
- 白鹿原名著导读读书分享
- 医疗设备采购 投标技术方案 (技术方案)
- 国开《建设监理》形成性作业1-4答案
- 合同法教案(第十版)教案全套
- 定密理论与实务3定密的依据课件
- 工伤预防知识培训PPT
- 同济大学信纸
- 室早的危险分层及治疗选择
- 交通运输工程施工安全监管台帐(参考)用表样表分享
评论
0/150
提交评论