j2ee struts 和 spring 的区别

33
J2EE Struts J2EE Struts Spring Spring 和和 和和

Upload: bardia

Post on 09-Feb-2016

105 views

Category:

Documents


0 download

DESCRIPTION

J2EE Struts 和 Spring 的区别. 小组成员名单: 0361136 陈文蓉 0361115 李君 0361125 郑喆颖 0361113 谭小群 0361134 王国英 0361122 龚绿 0361132 黄海南. 绪论. Struts 、 Webwork Spring MVC 、 Tapestry 、 JSF 等 Dinamica 、 VRaptor 等 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: J2EE Struts  和 Spring  的区别

J2EE Struts J2EE Struts 和和 Spring Spring 的区的区别别

Page 2: J2EE Struts  和 Spring  的区别

小组成员名单:0361136 陈文蓉0361115 李君0361125 郑喆颖0361113 谭小群0361134 王国英0361122 龚绿0361132 黄海南

Page 3: J2EE Struts  和 Spring  的区别

绪论 Struts 、 Webwork Spring MVC 、 Tapestry 、 JSF 等 Dinamica 、 VRaptor 等

基于 Web 的 MVC framework 在 J2EE 的世界内已是空前繁荣。目前比较好的 MVC 框架,都提供了较好的层次分隔能力。在实现良好的 MVC  分隔的基础上,通过提供一些现成的辅助类库,同时也促进了生产效率的提高。  如何选择一个好的框架应用在一个项目中,对于这个项目的效率和可重用来说是至关重要的。我们组的 presentation 将对目 前最流行、最常用的两种 framework 进行介绍和比较。

Page 4: J2EE Struts  和 Spring  的区别

Struts —— 不争的王者 Struts 是 Apache 软件基金下 Jakarta 项目的一部分。 Struts 框

架的主要架构设计和开发者是 Craig R.McClanahan 。经过长达五年的发展, Struts 已经逐渐成长为一个稳定、成熟的框架,并且占有了 MVC 框架中最大的市场份额。但是 Struts 某些技术特性上已经落后于新兴的 MVC 框架。面对 Spring MVC 、 Webwork2 这些设计更精密,扩展性更强的框架, Struts 受到了前所未有的挑战。但站在产品开发的角度而言, Struts 仍然是最稳妥的选择。

Page 5: J2EE Struts  和 Spring  的区别

Struts 的组成Struts 有一组相互协作的类(组件)、 Serlvet 以及 jsp tag lib组成。基于 struts 构架的 web 应用程序基本上符合 JSP Model2的设计标准,可以说是 MVC 设计模式的一种变化类型。根据上面对 framework 的描述,我们很容易理解为什么说 Struts 是一个web framwork ,而不仅仅是一些标记库的组合。但 Struts 也包含了丰富的标记库和独立于该框架工作的实用程序类。 Struts有其自己的控制器( Controller ),同时整合了其他的一些技术去实现模型层( Model )和视图层( View )。在模型层, Struts 可以很容易的与数据访问技术相结合,包括 EJB, JDBC 和 Object Relation Bridge 。在视图层, Struts 能够与 JSP, Velocity Templates XSL等等这些表示层组件想结合。

Page 6: J2EE Struts  和 Spring  的区别

Struts 框架Struts 是一个比较好的 MVC 框架,提供了对开发 MVC系统的底层支持,它采用的主要技术是 Servlet , JSP 和 Custom tag library 。其基本构成如图所示。

Jsp(view)ActionServlet( 控制器 )

ActionForm( 模型的数据 )

taglib(view)

使用

JavaBean( 模型 )

ActionMapping

Action

( 业务逻辑 )使用

实例化调用

调用使用

Page 7: J2EE Struts  和 Spring  的区别

Struts 框架(续) 视图( View )就是一系列提交到客户浏览器进行显示的 JSP 文件,是用户看到并与之交互的界面。在这些界面中没有业务逻辑,也没有模型信息,只有标签。 模型( Model )表示应用程序的状态和业务逻辑,通常由 JavaBean或EJB组件来实现。 控制器( Controller )的作用是从客户端接受请求,并且选择执行相应的业务逻辑,然后把响应结果送回到客户端。 在 Struts 中 Controller由 ActionServlet 类和 Action 类来实现。 ActionServlet 主要负责接受 HTTP请求信息, Action 类负责调用模型的方法,更新模型的状态,并帮助控制应用程序的流程。

Page 8: J2EE Struts  和 Spring  的区别

Struts 的体系结构详述(一)struts framework 是 MVC 模式的体现,下面我们就从分别从模型、视图、控制来看 struts 的体系结构( Architecture )。

浏览器请求 控制器 Servlet 业务逻辑 Action

视图 JSP

配置文件Struts-config.xml

模型 Application请求 取得数据

Page 9: J2EE Struts  和 Spring  的区别

Struts 的体系结构详述(二)1. 从视图角度( View )主要由 JSP建立, struts自身包含了一组可扩展的自定义标签库( TagLib ),可以简化创建用户界面的过程。目前包括: Bean Tags , HTML Tags , Logic Tags , Nested Tags , Template Tags  这几个 Taglib 。2. 从模型角度( Model )模型主要是表示一个系统的状态(有时候,改变系统状态的业务逻辑操作也划分到模型中)。在 Struts 中,系统的状态主要有 ActiomForm Bean体现,一般情况下,这些状态是非持久性的。如果需要将这些状态转化为持久性数据存储, Struts 本身也提供了 Utitle包,可以方便的与数据库操作。

Page 10: J2EE Struts  和 Spring  的区别

Struts 的体系结构详述(三)3. 从控制器角度( Controller )  在 Struts framework 中, Controller 主要是 ActionServlet ,但是对于业务逻辑的操作则主要由 Action 、 ActionMapping 、 ActionForward 这几个组件协调完成(也许这几个组件,应该划分到模型中的业务逻辑一块)。其中, Action扮演了真正的业务逻辑的实现者,而 ActionMapping 和 ActionForward则指定了不同业务逻辑或流程的运行方向。对于 Struts 如何控制、处理客户请求,让我们通过对 struts 的四个核心组件介绍来具体说明。这几个组件就是: ActionServlet 。 Action Classes , Action Mapping (此处包括 ActionForward ), ActionFrom Bean 。

Page 11: J2EE Struts  和 Spring  的区别

Struts 的优点和缺点 Struts 提供了一个非常好的 MVC 框架,在 Web 应用开发中把界面和业务逻辑分离,提高了代码的可重用性和灵活性。优点: Struts跟 Tomcat 、 Turbine 等诸多 Apache 项目一样,是开源软件,这是它的一大优点。使开发者能更深入的了解其内部实现机制。 除此之外, Struts 的优点主要集中体现在两个方面: Taglib 和页面导航。 Tagli

b 是 Struts 的标记库,灵活动用,能大大提高开发效率。另外,就目前国内的 JSP 开发者而言,除了使用 JSP自带的常用标记外,很少开发自己的标记,或许 Struts 是一个很好的起点。

关于页面导航,可能是今后的一个发展方向,事实上,这样做,使系统的脉络更加清晰。通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有着莫大的好处。尤其是当另一批开发者接手这个项目时,这种优势体现得更加明显。

Page 12: J2EE Struts  和 Spring  的区别

Struts 的优点和缺点缺点: Taglib 是 Struts 的一大优势,但对于初学者而言,却需要一个持续学习的过程,甚至还会打乱你网页编写的习惯,但是,当你习惯了它时,你会觉得它真的很棒。 Struts 将 MVC 的 Controller 一分为三,在获得结构更加清晰的同时,也增加了系统的复杂度。 Struts从产生到现在还不到半年,但已逐步越来越多运用于商业软件。虽然它现在还有不少缺点,但它是一种非常优秀的 J2EE MVC 实现方式,如果你的系统准备采用 J2EE MVC 架构,那么,不妨考虑一下 Struts 。

Page 13: J2EE Struts  和 Spring  的区别

Spring Spring 实际上是 Expert One-on-One J2EE Design and Development 一书中所阐述的设计思想的具体实现。在 One-on-One 一书中, Rod Johnson 倡导 J2EE 实用主义的设计思想,并随书提供了一个初步的开发框架实现( interface21 开发包)。而 Spring 正是这一思想的更全面和具体的体现。Rod Johnson 在 interface21 开发包的基础之上,进行了进一步的改造和扩充,使其发展为一个更加开放、清晰、全面、高效的开发框架。   Spring 是一个开源框架,由 Rod Johnson创建并且在他的著作《 J2EE设计开发编程指南》里进行了描述。它是为了解决企业应用开发的复杂性而创建的。 Spring使使用基本的 JavaBeans 来完成以前只可能由 EJB完成的事情变得可能了。然而, Spring 的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何 Java 应用都可以从 Spring 中受益。

Page 14: J2EE Struts  和 Spring  的区别

Spring 框架 Spring 框架是一个分层架构,由 7 个定义良好的模块组成。 Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式,

Spring AOP

Source-levelMeta-data

AOP infrastructure

Spring WebMVC

Web MVCFramework

JSP/VeiocityPDF/Export

Spring ORMHibernate support

iBats supportJDO support

Spring WebWebApplicationContext

Mutipart resolverWeb utilities

Spring DAOTransaction infrastructure

JOBC supportDAO support

Spring ContextApplication context

UI supportValidation

JNDL EJB support &remodelingMail

Spring CoreSupporting utilities

Bean container

Page 15: J2EE Struts  和 Spring  的区别

Spring 框架 组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下: 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory ,它是工厂模式的实现。 BeanFactory 使用控制反转 ( IOC ) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。 Spring 上下文: Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。 Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。  

Page 16: J2EE Struts  和 Spring  的区别

Spring 框架(续) Spring AOP :通过配置管理特性, Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持 AOP 。 Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP ,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。 Spring DAO: JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。 Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。

Page 17: J2EE Struts  和 Spring  的区别

Spring 框架(续) Spring ORM : Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、 Hibernate 和 iBatis SQL Map 。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。 Spring Web 模块: Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以, Spring 框架支持与 Jakarta Struts 的集成。 Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。 Spring MVC 框架: MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口, MVC 框架变成为高度可配置的, MVC 容纳了大量视图技术,其中包括 JSP 、 Velocity 、 Tiles 、 iText 和 POI。

Page 18: J2EE Struts  和 Spring  的区别

Spring 的具体描述简单来说, Spring 是一个轻量的控制反转和面向切面的容器框架。当然,这个描述有点过于简单。但它的确概括出了Spring 是做什么的。为了更好地理解 Spring ,让我们分析一下这个描述:    1 、轻量,从大小与开销两方面而言 Spring 都是轻量的。完整的 Spring 框架可以在一个大小只有 1MB多的 JAR 文件里发布。并且 Spring 所需的处理开销也是微不足道的。此外, Spring 是非侵入式的:典型地, Spring 应用中的对象不依赖于轻量从大小与开销两方面而言 Spring 都是轻量的。完整的 Spring 框架可以在一个大小只有 1MB 多的 JAR 文件里发布。并且 Spring 所需的处理开销也是微不足道的。此外, Spring 是非侵入式的:典型地, Spring 应用中的对象不依赖于 Spring 的特定类。  

Page 19: J2EE Struts  和 Spring  的区别

2 、控制反转: Spring 通过一种称作控制反转( IoC )的技术促进了松耦合。当应用了 IoC ,对象被动地传递它们的依赖而不是自己创建或者查找依赖对象。你可以认为IoC 与 JNDI 相反不是对象从容器中查找依赖,而是容器在对象初始化时不等被请求就将依赖传递给它。           3 、面向切面: Spring 包含对面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统服务(例如审计与事物管理)进行内聚性的开发。应用对象只做它们应该做的完成业务逻辑仅此而已。它们并不负责(甚至是意识)其它的系统关注点,例如日志或事物支持。       4 、容器: Spring 包含和管理应用对象的配置和生命周期,在这个意义上它是一种容器。你可以配置你的每个 bean 如何被创建基于一个配置原形为你的 bean 创建一个单独的实例或者每次需要时都生成一个新的实例以及它们是如何相互关联的。然而, Spring 不应该被混同于传统的重量的 EJB 容器,它们经常是庞大与笨重的,难以使用。 

Page 20: J2EE Struts  和 Spring  的区别

5 、框架: Spring 使由简单的组件配置和组合复杂的应用成为可能。在 Spring 中,应用对象被声明式地组合,典型地是在一个 XML 文件里。 Spring也提供了很多基础功能(事务管理、持久性框架集成等等),将应用逻辑的开发留给了你。   所有 Spring 的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为 Spring 中的各种子框架提供了基础。

       Spring  框架的功能可以用在任何  J2EE  服务器中,大多数功能也适用于不受管理的环境。 Spring  的核心要点是:支持不绑定到特定  J2EE  服务的可重用业务和数据访问对象。毫无疑问,这样的对象可以在不同  J2EE 环境 ( Web  或  EJB )、独立应用程序、测试环境之间重用。 

Page 21: J2EE Struts  和 Spring  的区别

Spring 的优点和缺点 Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。 Spring 比起其他的 framework 更有优势,因为除了 AOP 以外,它提供了更多别的功能。作为一个轻型 framework ,它在 J2EE 不同的部分都可以发挥作用。因此,即使不想使用 Spring AOP ,你可能还是想使用 Spring 。 另一个优点, Spring 并不要求开发团队所有的人员都会用它。学习 Spring 应该从 Spring reference 的第一页开始。 Spring唯一的缺点是缺乏更多的文档,但它的 mailing list 是个很好的补充,而且会不断地出现更多的文档。

Page 22: J2EE Struts  和 Spring  的区别

struts 和 spring 的不同应用 Struts :主要关注于 Controller 流程,基于 JSP与 Taglib 实现的 View 。 Spring :这是一个服务于所有层面的 Application

Framework ,提供了 bean 的配置基础, AOP 的支持, JDBC 的提取框架,抽象事务支持等。

它有一个非常显著的特点:在某个层面上如果你不需要 Spring 的支持,你就可以不使用 String 的 class ,只使用它的某一部分的功能。

Page 23: J2EE Struts  和 Spring  的区别

Struts 和 Spring—强强联手 与 Struts 相似, Spring 可以作为一个 MVC 实现。 这两种框架都具有自己的优点和缺点。 大部分人同意 Struts 在 MVC 方面仍然是最好的。很多开发团队已经学会在时间紧迫的时候利用 Struts 作为构造高品质软件的基础。 Struts 具有如此大的推动力,以至于开发团队宁愿整合 Spring 框架的特性,而不愿意转换成 Spring MVC 。 而 Spring 架构允许您将 Struts 作为 Web 框架连接到基于 Spring 的业务和持久层。最后的结果就是现在一切条件都具备了。

Page 24: J2EE Struts  和 Spring  的区别

Struts 和 Spring 的整合(一) 方法一: 使用 Spring 的 ActionSupport

手动创建一个 Spring 环境是一种整合 Struts 和 Spring 的最直观的方式。Spring 提供了帮助,为了方便获得 Spring 环境, org.springframework.web.struts.ActionSupport 类提供了一个 getWebApplicationContext() 方法。

我们所做的只是从 Spring 的 ActionSupport 而不是 Struts Action 类扩展我们的动作。

Page 25: J2EE Struts  和 Spring  的区别

Struts 和 Spring 的整合(一) 这种技术很简单并且易于理解。 但不幸的是,它将 Struts 动作与 Spring 框架耦合在一起。想替换掉 Spring ,那么必须重写代码。 并且,由于 Struts 动作不在 Spring 的控制之下,所以它不能获得 Spring AOP 的优势。 当使用多重独立的 Spring 环境时,这种技术可能有用,但是在大多数情况下,这种方法并不十分合适。

Page 26: J2EE Struts  和 Spring  的区别

Struts 和 Spring 的整合(二) 方法二:覆盖 RequestProcessor

将 Spring 从 Struts 动作中分离是一个更巧妙的设计选择。 分离的一种方法是使用 org.spingframework.web.struts.Delegatin

gRequestProcessor 类 来覆盖 Struts 的 RequestProcessor 处理程序。

Page 27: J2EE Struts  和 Spring  的区别

Struts 和 Spring 的整合(二) DelegatingRequestProcessor 方法的确比第一种方法好,但是仍然存在一些问题。 如果使用一个不同 RequestProcessor ,则需要手动整合 Spring 的 DelegatingRequestProcessor 。添加的代码会造成维护的麻烦并且将来会降低您的应用程序的灵活性。 此外,还有过一些使用一系列命令来代替 Struts RequestProcessor 的传闻。 这种改变将会对这种解决方法的使用寿命造成负面的影响。

Page 28: J2EE Struts  和 Spring  的区别

Struts 和 Spring 的整合(三) 方法三:将动作管理委托给 Spring

这里的一个更好的解决方法是将 Strut 动作管理委托给 Spring 。在此可以通过在 struts-config 动作映射中注册一个代理来实现。代理负责在 Spring 环境中查找 Struts 动作。由于动作在 Spring 的控制之下,所以它可以填充动作的 JavaBean 属性,并为应用诸如 Spring 的 AOP 拦截器之类的特性带来了可能。

Page 29: J2EE Struts  和 Spring  的区别

Struts 和 Spring 的整合(三) 动作委托解决方法是这三种方法中最好的。 主要有以下几点原因: Struts 动作不了解 Spring ,不对代码作任何改变就可用于非 Spring 应用程序中。 RequestProcessor 的改变不会影响它,并且它可以利用 Spring AOP 特性的优点。 一旦让 Spring 控制您的 Struts 动作,您就可以使用 Spring 给动作补充更强的活力。

Page 30: J2EE Struts  和 Spring  的区别

Struts 和 Spring 的整合(三) 例如,没有 Spring 的话,所有的 Struts 动作都必须是线程安全的。如果设置 <bean> 标记的 singleton 属性为“ false”,那不管用何种方法,应用程序都将在每一个请求上有一个新生成的动作对象。 也可以利用 Spring 的生命周期方法。例如,当实例化 Struts 动作时,<bean> 标记的 init-method 属性被用于运行一个方法。类似地,在从容器中删除 bean 之前, destroy-method 属性执行一个方法。这些方法是管理昂贵对象的好办法,它们以一种与 Servlet 生命周期相同的方

式进行管理。

Page 31: J2EE Struts  和 Spring  的区别

一种优雅的流行架构 Struts+Spring+Hibernate 是一种现在很流行的架构模式 也是一种比较好的方式,结合了各种技术的优点。 Struts :用来作 VC 部分,即控制和显示作用 Spring :用来作数据库操作的事务处理,在配置文件里配置好 就OK了 Hibernate :用来作 DAO处理,在此用了 Spring 的 getHibernateTemplate()方法来操作 hsql 进行数据增删改等操作

Page 32: J2EE Struts  和 Spring  的区别

表现层是 struts 和 spring 的结合 业务逻辑类可以用 spring 的 beans 进行配置,并由 spring管理与表现层的控制器及更下层的 DAO对象的关系。另外,还可以进行配置性的事务处理,一个 interceptor配置,免去了你的所有烦恼。 dao 层 用 spring 封装后的 hibernate API,让Hibernate继续瘦身,并且通过 spring建立与上层的关系。 这三者结合后的构架如图以上

UI Layer

Struts-MVC

Struts ActionActionForm,JSP,Struts-config.xml,

etc

Service Locator

Business Layer

Spring

Transactions

Hibernate SessionManagement

Business ServiceClasses

Persistence Layer

Hibernate

Query LanguageSupport and otherHibernate services

DataSource/Connection Pool

DAO Classes

Domain Model Business Objects

Page 33: J2EE Struts  和 Spring  的区别

结语需要说明的是,不管是 struts还是 spring ,仅仅为我们提供了一种设计和实现框架的方式。因此,项目的成功与否,是与我们的构架设计紧密相关的,在有了好的设计思想以后,善用各种技术,会让我们的成功来的更容易。