您好,欢迎访问三七文档
目前,国内外信息化建设已经进入以Web应用为基础核心的阶段。Java语言应该算得上是开发Web应用的最佳语言。然而,就算用Java建造一个不是很烦琐的Web应用系统,也不是件轻松的事情。有很多东西需要仔细考虑,比如要考虑怎样建立用户接口?在哪里处理业务逻辑?怎样持久化数据?而这3层构架中,每一层都有各自要仔细考虑的内容,比如各个层该使用什么技术?怎样的设计既能松散耦合还能灵活改变?怎样替换某个层而不影响整体构架?应用程序如何做各个方面的处理(例如,事务处理)?幸运的是,构架一个Web应用需要解决的一些问题已经由曾遇到过这类问题的开发者建立起处理这类问题的框架(Framework)。一个好框架应具备以下几点:减轻开发者处理复杂问题的负担,具有良好的可扩展性,并且有一个支持它的强大的用户团体。好的框架一般有针对性地处理某一类问题,并且能将它做好(DoOneThingWell),好的框架还应该能指导代码如何分布。更重要的是,框架能把开发者从底层编码中解放出来,使他们能专心于应用程序的逻辑。本书将讨论怎样结合3种著名的框架Struts、Spring和Hibernate来使你的应用程序做到松散耦合。如何建立你的架构,并且怎样让你的各个应用层保持一致?如何整合框架,以便让每层以一种松散耦合的方式彼此作用而不用管底层的技术细节?这里讨论一个使用3种开源框架的策略:表示层用Struts,业务层用Spring,而持久层则用Hibernate,如图1-1所示。大部分的Web应用在职责上至少能被分成4层:表示层(PresentationLayer)、持久层(PersistenceLayer)、业务层(BusinessLayer)和域模块层(domainmodelLayer)。每个层在功能上都应该是十分明确的,而不应该与其他层混合。每个层要相互独立,通过一个通信接口而相互联系。下面将分别详细地介绍这4层,讨论一下这些层应该提供什么,不应该提供什么。1.1表示层一般来讲,一个典型的Web应用的前端应该是表示层,这里可以使用Struts框架。下面是Struts所负责的:管理用户的请求,做出相应的响应提供一个流程控制器,委派调用业务逻辑和其他上层处理处理异常为显示提供一个数据模型用户界面的验证以下内容,不该在Struts表示层的编码中经常出现,它们与表示层无关的。与数据库直接通信与应用程序相关联的业务逻辑及校验事务处理在表示层引入这些代码,则会带来高耦合和难以维护的后果。典型的Web应用的后端是持久层。开发者总是低估构建他们自己的持久层框架的挑战性。系统内部的持久层不但需要大量调试时间,而且还经常因为缺少功能使之变得难以控制,这是持久层的通病。幸运的是,有几个对象/关系映射(Object/RelationMapping,ORM)开源框架很好地解决了这类问题,尤其是Hibernate。Hibernate为Java提供了持久化机制和查询服务,它还给已经熟悉SQL和JDBCAPI的Java开发者创造了一个学习桥梁,使他们学习起来很方便。Hibernate的持久对象是基于POJO(PlainOldJavaObject)和Java集合(collections)的。此外,使用Hibernate并不妨碍你正在使用的IDE(IntegratedDevelopmentEnviroment)。下面是Hibernate所负责的内容。如何查询对象的相关信息。Hibernate是通过一个面向对象的查询语言(HQL)或正则表达的API来完成查询的。HQL非常类似于SQL,只是把SQL里的table和columns用Object和它的fields代替。HQL语言容易理解且文档做得很好。HQL是一种面向对象查询的自然语言,很容易就能学会它。如何存储、更新、删除数据库记录。Hibernate这类的高级ORM框架支持大部分主流数据库,并且支持父表/子表(Parent/child)关系、事务处理、继承和多态。一个典型Web应用的中间部分是业务层或服务层。从编码的视角来看,这层是最容易被忽视的。我们往往在用户界面层或持久层周围看到这些业务处理的代码,这其实是不正确的。因为它会造成程序代码的高耦合,这样一来,随着时间推移,这些代码将很难维护。幸好,针对这一问题有几种框架(Framework)存在,最受欢迎的两个框架是Spring和PicoContainer。这些也被称为轻量级容器(microcontainer),它们能让你很好地把对象搭配起来。这两个框架都着手于“依赖注射”(dependencyinjection),还有我们知道的“控制反转”(InversionofControl,IoC)这样的简单概念。这里,我们将关注于Spring的依赖注射和面向方面编程。另外,Spring把程序中所涉及到的包含业务逻辑和数据存取对象(DataAccessObject)的Objects——transactionmanagementhandler(事务管理控制)、ObjectFactories(对象工厂)、serviceobjects(服务组件)都通过XML配置联系起来。后面我们会通过项目和实例来揭示Spring是怎样运用这些概念的。下面是业务层所负责的。处理应用程序的业务逻辑和业务校验管理事务提供与其他层相互作用的接口管理业务层级别的对象的依赖在表示层和持久层之间增加了一个灵活的机制,使得他们不直接联系在一起通过揭示从表示层到业务层之间的上下文(Context)来得到业务逻辑(businessservices)管理程序的执行(从业务层到持久层)既然我们致力于一个Web的应用,我们就需要一个对象集合,让它在不同层之间移动。域模块层由实际需求中的业务对象组成,比如订单明细(OrderLineItem)、产品(Product)等。开发者在这层不用管那些数据传输对象(DataTransferObject),而仅关注域对象(domainobject)即可。例如,Hibernate允许你将数据库中的信息存入域对象(domainobjects),这样你可以在连接断开的情况下把这些数据显示到用户界面层,而那些对象也可以返回给持久层,从而在数据库里更新。而且,你不必把对象转化成DTO(这可能导致它在不同层之间的传输过程中丢失)。这个模型使得Java开发者能很自然运用面向对象编程(Object-OrientedProgramming),而不需要附加的编码。本书围绕上述架构,通过一个完整的项目onlinebookstore来具体展开Struts-Spring-Hibernate这3部分的讲解。项目开发并不是一个简单的过程,我们需要遵循一些开发流程。一个项目的开发会被分成很多步骤来实现,每一个步骤都有自己的起点和终点。也正如此,使得开发过程中的每个步骤起点和终点在不同的软件项目中出现不同难度的“坎”,使其难于达到该步骤开始或是终结的条件,开发过程也就不会一帆风顺。不同的开发模式其实就是将步骤的起点和终点重新定义,甚至重新组合排列,虽然任何一个开发模式最终目的都是完成软件项目的开发,但期间所经历的过程不一样,过程步骤之间的起点和终点的定义不同,所带来的“坎”也就不一样,项目周期自然各不相同。因此,根据软件项目的实际情况选择一个适合的开发模式能减少开发周期中“坎”的出现次数与难度,可以很大程度地缩短开发周期。我们首先了解一下传统瀑布式开发流程,如图2-1所示。图2-1瀑布式(Waterfall)开发流程瀑布模型是由W.W.Royce在1970年首先提出的软件开发模型,在瀑布模型中,开发被认为是按照需求分析、设计、实现、测试(确认)、集成和维护坚定而顺畅地进行的。线性模型太理想化,太单纯,以至很多人认为瀑布模型已不再适合现代的软件开发模式,几乎被业界抛弃。我们向大家推荐的是统一开发流程RUP(RationalUnifiedProcess),它是目前最流行的一套项目开发流程模式,其基本特征是通过多次迭代完成一个项目的开发,每次迭代都会带来项目整体的递增,如图2-2所示。从纵向来看,项目的生命周期或工作流包括项目需求分析、系统分析和设计、实现、测试和维护。从横向来看,项目开发可以分为4个阶段:起始(Inception)、细化(Elaboration)、建造(Construction)和移交(transition)。每个阶段都包括一次或者多次的迭代。在每次迭代中,根据不同的要求或工作流(如需求、分析和设计等)投入不同的工作量。也就是说,在不同阶段的每次迭代中,生命周期的每个步骤是同步进行的,但权重不同。这是与传统瀑布式开发流程区别最大的地方。2.1.1项目生命周期1.项目需求分析需求分析阶段的活动包括定义潜在的角色(角色指使用系统的人,以及与系统相互作用的软、硬件环境)、识别问题域中的对象和关系,以及基于需求规范说明和角色的需要发现用例(use-case)和详细描述用例。2.系统分析和设计系统分析阶段是基于问题和用户需求的描述,建立现实世界的计算机实现模型。系统设计是结合问题域的知识和目标系统的体系结构(求解域),将目标系统分解为子系统,之后基于分析模型添加细节,完成系统设计。3.实现实现又称编码或开发阶段,也就是将设计转换为特定的编程语言或硬件,同时保持先进性、灵活性和可扩展性。在这个阶段,设计阶段的类被转换为使用面向对象编程语言编制(不推荐使用过程语言)的实际代码。这一任务可能比较困难,也可能比较容易,主要取决于所使用的编程语言本身的能力。4.测试和维护测试用于检验系统是否满足用户功能需求,以便增加用户对系统的信心。系统经过测试后,整个开发流程告一段落,进入运行维护或新的功能扩展时期。2.1.2项目开发阶段1.起始阶段(TheInceptionPhase)对于新的开发项目来说,起始阶段是很重要的。在项目继续进行前,我们必须处理重要的业务与需求风险。对于那些增强现有系统的项目,起始阶段是比较短暂的,但是其目的仍是确定该项目的实施价值及可行性。起始阶段有4个重要活动。制定项目的范围计划并准备业务案例综合分析,得出备选构架准备项目环境2.细化阶段(TheElaborationPhase)细化阶段的目标是为系统构架设立基线(baseline),为在构建阶段开展的大量的设计与实施工作打下坚实的基础。构架是通过考虑最重要的需求与评估风险演进而来的,构架的稳定性是通过一个或多个构架原型(prototype)进行评估的。3.构建阶段(TheConstructionPhase)构建阶段的目标是完成系统开发。构建阶段从某种意义上来看是一个制造过程,其中,重点工作就是管理资源、控制操作,以优化成本、日程和质量。因此,在此阶段,管理理念应该进行一个转换,从起始阶段和细化阶段的知识产品开发转换到构建和交付阶段的部署产品的开发。构建阶段的每次迭代都具有3个关键活动。管理资源与控制过程开发与测试组件对迭代进行评估4.交付阶段(TheTransitionPhase)交付阶段的焦点就是确保软件对于最终用户是可用的。交付阶段包括为发布应用而进行的产品测试,在用户反馈的基础上做微小的调整等内容。在生命周期的这个时刻,用户反馈主要集中在精确调整产品、配置、安装,以及可用性等问题上。交付阶段的关键活动如下:确定最终用户支持资料在用户的环境中测试可交付的产品基于用户反馈精确调整产品向最终用户交付最终产品最后,作为补充,我们再简单介绍一种新的开发流程:敏捷开发和极限编程。2001年,为了解决许多公司的软件团队陷入不断增长的过程泥潭的问题,一批业界专家一起概括出了一些可以让软件开发团队具有快速工作、响应变化能力的价值观和原则,他们称自己为敏捷联盟。敏捷开发过程的方法很多,主要有SCRUM、Crystal、特征驱动软件开发(FeatureDrivenDevelopment,简称FDD)、自适应软件开发(AdaptiveSoftwareDevelopment,简称ASD),以及最重要的极限编程(eXtremeProgr
本文标题:项目实践精解:基于Struts-Spring-Hibernate的Java应用开发
链接地址:https://www.777doc.com/doc-807674 .html