J2EE Struts 和Spring 的区别
小组成员名单: 0361136 陈文蓉 0361115 李君 0361125 郑喆颖 0361113 谭小群 0361134 王国英 0361136 陈文蓉 0361115 李君 0361125 郑喆颖 0361113 谭小群 0361134 王国英 0361122 龚绿 0361132 黄海南
绪论 Struts、Webwork Spring MVC、Tapestry、JSF等 Dinamica、VRaptor等 基于Web的MVC framework在J2EE的世界内已是空前繁荣。目前比较好的MVC框架,都提供了较好的层次分隔能力。在实现良好的MVC 分隔的基础上,通过提供一些现成的辅助类库,同时 也促进了生产效率的提高。 如何选择一个好的框架应用在一个项目中,对于这个项目的效率和可重用来说是至关重要的。我们组的presentation将对目 前最流行、最常用的两种framework进行介绍和比较。
Struts —— 不争的王者 Struts是Apache软件基金下Jakarta项目的一部分。Struts框架的主要架构设计和开发者是Craig R.McClanahan。经过长达五年的发展,Struts已经逐渐成长为一个稳定、成熟的框架,并且占有了MVC框架中最大的市场份额。但是Struts某些技术特性上已经落后于新兴的MVC框架。面对Spring MVC、Webwork2 这些设计更精密,扩展性更强的框架,Struts受到了前所未有的挑战。但站在产品开发的角度而言,Struts仍然是最稳妥的选择。
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等等这些表示层组件想结合。
Struts框架 Struts是一个比较好的MVC框架,提供了对开发MVC系统的底层支持,它采用的主要技术是Servlet,JSP和Custom tag library。其基本构成如图所示。 Jsp(view) ActionServlet (控制器) ActionForm (模型的数据) 实例化 调用 Action (业务逻辑) 使用 使用 调用 使用 taglib(view) ActionMapping JavaBean (模型)
Struts框架(续) 视图(View)就是一系列提交到客户浏览器进行显示的JSP文件,是用户看到并与之交互的界面。在这些界面中没有业务逻辑,也没有模型信息,只有标签。 模型(Model)表示应用程序的状态和业务逻辑,通常由JavaBean或EJB组件来实现。 控制器(Controller)的作用是从客户端接受请求,并且选择执行相应的业务逻辑,然后把响应结果送回到客户端。 在Struts中Controller由ActionServlet类和Action类来实现。ActionServlet主要负责接受HTTP请求信息,Action类负责调用模型的方法,更新模型的状态,并帮助控制应用程序的流程。
Struts的体系结构详述(一) struts framework是MVC 模式的体现,下面我们就从分别从模型、视图、控制来看struts的体系结构(Architecture)。 控制器 Servlet 业务逻辑 Action 请求 浏览器 配置文件 Struts-config.xml 取得数据 请求 视图 JSP 模型 Application
Struts的体系结构详述(二) 1. 从视图角度(View) 主要由JSP建立,struts自身包含了一组可扩展的自定义标签库(TagLib),可以简化创建用户界面的过程。目前包括:Bean Tags,HTML Tags,Logic Tags,Nested Tags,Template Tags 这几个Taglib。 2. 从模型角度(Model) 模型主要是表示一个系统的状态(有时候,改变系统状态的业务逻辑操作也划分到模型中)。在Struts中,系统的状态主要有ActiomForm Bean体现,一般情况下,这些状态是非持久性的。如果需要将这些状态转化为持久性数据存储,Struts本身也提供了Utitle包,可以方便的与数据库操作。
Struts的体系结构详述(三) 3. 从控制器角度(Controller) 在Struts framework中, Controller主要是ActionServlet,但是对于业务逻辑的操作则主要由Action、ActionMapping、ActionForward这几个组件协调完成(也许这几个组件,应该划分到模型中的业务逻辑一块)。其中,Action扮演了真正的业务逻辑的实现者,而ActionMapping和ActionForward则指定了不同业务逻辑或流程的运行方向。 对于Struts 如何控制、处理客户请求,让我们通过对struts的四个核心组件介绍来具体说明。这几个组件就是:ActionServlet。Action Classes,Action Mapping(此处包括ActionForward),ActionFrom Bean。
Struts的优点和缺点 Struts提供了一个非常好的MVC框架,在Web应用开发中把界面和业务逻辑分离,提高了代码的可重用性和灵活性。 优点: Struts跟Tomcat、Turbine等诸多Apache项目一样,是开源软件,这是它的一大优点。使开发者能更深入的了解其内部实现机制。 除此之外,Struts的优点主要集中体现在两个方面:Taglib和页面导航。Taglib是Struts的标记库,灵活动用,能大大提高开发效率。另外,就目前国内的JSP开发者而言,除了使用JSP自带的常用标记外,很少开发自己的标记,或许Struts是一个很好的起点。 关于页面导航,可能是今后的一个发展方向,事实上,这样做,使系统的脉络更加清晰。通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有着莫大的好处。尤其是当另一批开发者接手这个项目时,这种优势体现得更加明显。
Struts的优点和缺点 缺点: Taglib是Struts的一大优势,但对于初学者而言,却需要一个持续学习的过程,甚至还会打乱你网页编写的习惯,但是,当你习惯了它时,你会觉得它真的很棒。 Struts将MVC的Controller一分为三,在获得结构更加清晰的同时,也增加了系统的复杂度。 Struts从产生到现在还不到半年,但已逐步越来越多运用于商业软件。虽然它现在还有不少缺点,但它是一种非常优秀的J2EE MVC实现方式,如果你的系统准备采用J2EE MVC架构,那么,不妨考虑一下Struts。
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中受益。
Spring框架 Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式, Spring AOP Source-level Meta-data AOP infrastructure Spring ORM Hibernate support iBats support JDO support Spring Web WebApplicationContext Mutipart resolver Web utilities Spring Web MVC Web MVC Framework JSP/Veiocity PDF/Export Spring DAO Transaction infrastructure JOBC support DAO support Spring Context Application context UI support Validation JNDL EJB support &remodeling Mail Spring Core Supporting utilities Bean container
Spring框架 组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下: 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。 Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。
Spring框架(续) Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。 Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
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。
Spring的具体描述 简单来说,Spring是一个轻量的控制反转和面向切面的容器框架。当然,这个描述有点过于简单。但它的确概括出了Spring是做什么的。为了更好地理解Spring,让我们分析一下这个描述: 1、轻量,从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于轻量从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。
2、控制反转:Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,对象被动地传递它们的依赖而不是自己创建或者查找依赖对象。你可以认为IoC与JNDI相反不是对象从容器中查找依赖,而是容器在对象初始化时不等被请求就将依赖传递给它。 3、面向切面:Spring包含对面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统服务(例如审计与事物管理)进行内聚性的开发。应用对象只做它们应该做的完成业务逻辑仅此而已。它们并不负责(甚至是意识)其它的系统关注点,例如日志或事物支持。 4、容器:Spring包含和管理应用对象的配置和生命周期,在这个意义上它是一种容器。你可以配置你的每个bean如何被创建基于一个配置原形为你的bean创建一个单独的实例或者每次需要时都生成一个新的实例以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量的EJB容器,它们经常是庞大与笨重的,难以使用。
5、框架:Spring使由简单的组件配置和组合复杂的应用成为可能。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久性框架集成等等),将应用逻辑的开发留给了你。 所有Spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为Spring中的各种子框架提供了基础。 Spring 框架的功能可以用在任何 J2EE 服务器中,大多数功能也适用于不受管理的环境。Spring 的核心要点是:支持不绑定到特定 J2EE 服务的可重用业务和数据访问对象。毫无疑问,这样的对象可以在不同 J2EE 环境 (Web 或 EJB)、独立应用程序、测试环境之间重用。
Spring的优点和缺点 Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。 Spring比起其他的framework更有优势,因为除了AOP以外,它提供了更多别的功能。作为一个轻型framework,它在J2EE不同的部分都可以发挥作用。因此,即使不想使用Spring AOP,你可能还是想使用Spring。 另一个优点,Spring并不要求开发团队所有的人员都会用它。学习Spring应该从Spring reference的第一页开始。 Spring唯一的缺点是缺乏更多的文档,但它的mailing list是个很好的补充,而且会不断地出现更多的文档。
struts和spring的不同应用 Struts :主要关注于 Controller 流程,基于 JSP与 Taglib 实现的 View 。 Spring :这是一个服务于所有层面的 Application Framework ,提供了 bean 的配置基础, AOP 的支持, JDBC 的提取框架,抽象事务支持等。 它有一个非常显著的特点:在某个层面上如果你不需要 Spring 的支持,你就可以不使用 String 的 class ,只使用它的某一部分的功能。
Struts和Spring—强强联手 与 Struts 相似,Spring 可以作为一个 MVC 实现。 这两种框架都具有自己的优点和缺点。 大部分人同意 Struts 在 MVC 方面仍然是最好的。很多开发团队已经学会在时间紧迫的时候利用 Struts 作为构造高品质软件的基础。 Struts 具有如此大的推动力,以至于开发团队宁愿整合 Spring 框架的特性,而不愿意转换成 Spring MVC。 而Spring 架构允许您将 Struts 作为 Web 框架连接到基于 Spring 的业务和持久层。最后的结果就是现在一切条件都具备了。
Struts和Spring的整合(一) 方法一: 使用 Spring 的 ActionSupport 手动创建一个 Spring 环境是一种整合 Struts 和 Spring 的最直观的方式。 Spring 提供了帮助,为了方便获得 Spring 环境,org.springframework.web.struts.ActionSupport 类提供了一个 getWebApplicationContext() 方法。 我们所做的只是从 Spring 的 ActionSupport 而不是 Struts Action 类扩展我们的动作。
Struts和Spring的整合(一) 这种技术很简单并且易于理解。 但不幸的是,它将 Struts 动作与 Spring 框架耦合在一起。想替换掉 Spring,那么必须重写代码。 并且,由于 Struts 动作不在 Spring 的控制之下,所以它不能获得 Spring AOP 的优势。 当使用多重独立的 Spring 环境时,这种技术可能有用,但是在大多数情况下,这种方法并不十分合适。
Struts和Spring的整合(二) 方法二:覆盖 RequestProcessor 将 Spring 从 Struts 动作中分离是一个更巧妙的设计选择。 分离的一种方法是使用org.spingframework.web.struts.DelegatingRequestProcessor 类 来覆盖 Struts 的RequestProcessor 处理程序。
Struts和Spring的整合(二) DelegatingRequestProcessor 方法的确比第一种方法好,但是仍然存在一些问题。 如果使用一个不同RequestProcessor,则需要手动整合 Spring 的DelegatingRequestProcessor。添加的代码会造成维护的麻烦并且将来会降低您的应用程序的灵活性。 此外,还有过一些使用一系列命令来代替 Struts RequestProcessor 的传闻。 这种改变将会对这种解决方法的使用寿命造成负面的影响。
Struts和Spring的整合(三) 方法三:将动作管理委托给 Spring 这里的一个更好的解决方法是将 Strut 动作管理委托给Spring。 在此可以通过在 struts-config 动作映射中注册一个代理来实现。 代理负责在 Spring 环境中查找 Struts 动作。由于动作在 Spring 的控制之下,所以它可以填充动作的 JavaBean 属性,并为应用诸如 Spring 的 AOP 拦截器之类的特性带来了可能。
Struts和Spring的整合(三) 动作委托解决方法是这三种方法中最好的。 主要有以下几点原因: Struts 动作不了解 Spring,不对代码作任何改变就可用于非 Spring 应用程序中。RequestProcessor 的改变不会影响它,并且它可以利用 Spring AOP 特性的优点。 一旦让 Spring 控制您的 Struts 动作,您就可以使用 Spring 给动作补充更强的活力。
Struts和Spring的整合(三) 例如,没有 Spring 的话,所有的 Struts 动作都必须是线程安全的。如果设置 <bean> 标记的 singleton 属性为“false”,那不管用何种方法,应用程序都将在每一个请求上有一个新生成的动作对象。 也可以利用 Spring 的生命周期方法。例如,当实例化 Struts 动作时,<bean> 标记的 init-method 属性被用于运行一个方法。类似地,在从容器中删除 bean 之前,destroy-method 属性执行一个方法。这些方法是管理昂贵对象的好办法,它们以一种与 Servlet 生命周期相同的方式进行管理。
一种优雅的流行架构 Struts+Spring+Hibernate是一种现在很流行的架构模式 也是一种比较好的方式,结合了各种技术的优点。 Struts:用来作VC部分,即控制和显示作用 Spring:用来作数据库操作的事务处理,在配置文件里配置好 就OK了 Hibernate:用来作DAO处理,在此用了Spring的getHibernateTemplate()方法来操作hsql进行数据增删改等操作
Domain Model Business Objects UI Layer Struts-MVC Struts Action ActionForm,JSP, Struts-config.xml, etc Business Layer Spring Transactions Hibernate Session Management Business Service Classes Persistence Layer Hibernate Query Language Support and other Hibernate services DataSource/ Connection Pool Service Locator DAO Classes Domain Model Business Objects 表现层是struts和spring的结合 业务逻辑类可以用spring的beans进行配置,并由spring管理与表现层的控制器及更下层的DAO对象的关系。另外,还可以进行配置性的事务处理,一个interceptor配置,免去了你的所有烦恼。 dao层 用spring 封装后的hibernate API,让Hibernate继续瘦身,并且通过spring建立与上层的关系。 这三者结合后的构架如图以上
结语 需要说明的是,不管是struts还是spring,仅仅为我们提供了一种设计和实现框架的方式。因此,项目的成功与否,是与我们的构架设计紧密相关的,在有了好的设计思想以后,善用各种技术,会让我们的成功来的更容易。