`
砚台观月
  • 浏览: 3668 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

(摘录)Spring MVC和Struts1,Struts2的比较(一)

 
阅读更多

     在web层的mvc框架中,比较流行的还有Spring Mvc,这篇文章就将Spring Mvc (3.0)与两个Struts进行横向的比较。同样挑重点总结了10条

       (1)、 机制 

        spring mvc的入口是servlet,而struts2是filter,这样就导致了二者的机制不同。

        (2)、Spring的整个MVC配置是基于IOC容器的

  与struts相比, Spring MVC的配置文件,最先看到的不是action或者form,而是一些有着特定名字的bean,Bean下面的配置是一些简单或有点复杂的属性。我们看到的是机器更容易的数据结构,而不是人更容易理解的元素。

  但是这恰恰是Spring的MVC强大的根源!因为它的配置就是Spring的核心IOC容器的配置,这意味着所有IOC容器的威力都可以在这里展现,我们可以为所欲为地对Spring MVC进行扩展和增强,我们可以完成在其它MVC framwork中很多难以想象的任务。想扩展新的URL映射方式吗?要换一个themeResolver或LocalReolver的实现吗?想在页面中显示新类型的View甚至想直接在Controller里定义AOP吗?这些对Spring的MVC来说都是可实现的。 
  Spring采用IOC配置的另一个原因是使Spring的MVC与Spring的IOC容器的整合变得非常的容易。Spring提供了与struts的整合,但是这样整合都需要在进行间接的包装,感觉总不是很自然 
采用IOC容器来实现的另一个原因是这会减少好多开发工作量。假如我们对Spring的IOC容器非常熟悉的话,会发现它非常的亲切,也非常的简单。  

  (3)、Spring提供了明确的Model, View概念和相应的数据结构

  在Spring里有一个有趣的数据类型叫做ModelAndView,它只是简单地把要显示的数据和显示的结果封装在一个类里。但是它却提供了明确的MVC概念,尤其是model概念的强化,使程序的逻辑变得更清晰了。
  在Struts里写程序里的时候,为了显示数据经常自己把东西放到HttpSession或HttpServletRequest里(或set到form里,虽然不太有用),这造成了model概念的模糊,而且也导致了struts与JSP页面的紧耦合。     

       (4)、 性能 

       spring会稍微比struts快。
       struts2框架是类级别的拦截。每次来了请求就创建一个Action,然后调用setter getter方法把request中的数据注入,他实际上是通过setter getter方法与request打交道的,struts2中,一个Action对象对应一个request上下文 
       spring3 mvc不同,spring3mvc是方法级别的拦截。拦截到方法后根据参数上的注解,把request数据注入进去,在spring3mvc中,一个方法对应一个request上下文。 
        另外,spring3 mvc的方法之间基本上独立的,独享request response数据,请求数据通过参数获取,处理结果通过ModelMap交回给框架,方法之间不共享变量,而struts2就比较乱,虽然方法之间也是独立的,但其所有Action变量是共享的,这不会影响程序运行,却给我们编码,读程序时带来麻烦。

       (5)、设计思想上

       struts更加符合oop的编程思想, spring就比较谨慎,在servlet上扩展。  

       (6)、Spring的Controller是Singleton的,或者是线程不安全的

       和Struts1一样,Spring的Controller是Singleton的,这意味着每个request过来,系统都会用原有的instance去处理,这样导致了两个结果:我们不用每次创建Controller,减少了对象创建和垃圾收集的时间;由于只有一个Controller的instance,当多个线程调用它的时候,它里面的instance变量不是线程安全的。
       而Struts2是线程安全的。   

  (7)、Spring没有像Struts2那样去隐藏Servlet相关的元素如HttpServletRequest或HttpServletResponse

  在Struts2里我们可以没有HttpServletRequest或者HttpServletResponse,只有getter, setter或ActionContext里数据,这样的结果导致一个干净的Action,一个与Web完全无关的Action,一个可以在任何环境下独立运行的bean。这样的action的好处在上篇文章里也说过,大概为:
   1、它使我们的Action可以非常容易地被测试。
   2、用户可以在Action里添加业务逻辑,并被其它类重用。  
        然而跟Spring比较一下,我们就会发现这两点功能所带来的好处其实并不象我们想象的那么显著。Spring的Controller类也可以非常轻松被测试,因为他的spring-mock下面的包里提供的MockHttpServletRequest, MockHttpServletResponse还有其它一些类让测试Controller变得异常轻松。再看一下Action里的业务逻辑吧,多数人都会业务逻辑delegate(委派)给另一个Service类或Manager类。因为我们很清楚,往Action里加业务逻辑会使整个体系的分层架构变得不清晰,不管怎样,Web层就是Web层,业务层就是业务层,两者的逻辑混在一起总会带来问题的。而且往Action里加业务逻辑会使用这个Action类变得庞大,所以业务问题在spring mvc是也不是问题。 

       (8)、 intercepter的实现机制

struts有以自己的interceptor机制,spring mvc用的是独立的AOP方式。这样导致struts的配置文件量还是比spring mvc大,虽然struts的配置能继承,所以我觉得论使用上来讲,spring mvc使用更加简洁,开发效率Spring MVC确实比struts2高。

  (9)、Spring提供了更多的选择方式

   Spring里提供的Controller,提供了好多不同的Controller类。要生成Wizard吗?要专门用于提交form的Controller吗?要执多个方法的类吗?Spring提供了丰富的子类来扩展这些选择。当然我们还可以很轻松地自己扩展这些功能。
        再看看Spring的ViewResolver吧, 它提供了无数不同类型的ViewResolver。更重要的是我们自定义我们的页面映射方式。而strtus1会存在页面与forward name的一层间接转换,我们必须在配置文件里配置好某个字符串(典型的是success)对应的是那个页面。但是Spring里我们有了更大的自由度,如将JSP文件名去掉扩展名的映射方法。 

  (10)、Spring的tag 

  尽管Spring的tag数量很少,但它却是精心设计的。它的目标很简单:让美工可以轻松地编辑页面。因为在Spring的页面里Text仍然是Text,checkbox仍然是CheckBox,而不象在struts中的Tag。它只是用Springbind对输入内容进行了一下包装。

 

       另外,spring3 mvc的验证也是一个亮点,支持JSR303,处理ajax的请求更是方便,只需一个注解@ResponseBody ,然后直接返回响应文本即可。

分享到:
评论

相关推荐

    Spring与Struts集成_第一种方案摘录

    Spring是一个全面的开源应用框架,提供了依赖注入(DI)和面向切面编程(AOP),而Struts则专注于MVC(Model-View-Controller)模式,帮助开发者构建可维护和可扩展的Web应用程序。本文将探讨如何将Spring与Struts...

    微信java开发,基于spring mvc

    基于spring Mvc 架构开发,实现微信公众号基础接口,网页授权。由于是从整个项目中摘录出来的,框架需要自己搭。

    Spring框架2016版黑马程序员第一天视频资料

    Spring框架是Java开发中广泛应用的开源框架,以其依赖注入(Dependency Injection, DI)和面向切面编程(Aspect-Oriented Programming, AOP)的核心特性,极大地简化了企业级应用的开发工作。2016版的Spring框架在...

    Spring in Practice (非扫描清晰英文版)

    3. 使用Spring Web MVC构建Web应用程序:Spring Web MVC是Spring提供的一个模型-视图-控制器(MVC)实现,它允许开发者使用MVC设计模式组织Web应用程序。这部分内容会教授如何构建高质量的Web界面。 4. 基础Web表单...

    Spring初学者入门教程 PDF带书签高清版

    1. **Spring概述**:讲解Spring框架的起源、发展以及其在现代Java应用中的地位,可能还会介绍Spring的主要模块,如Core Container(核心容器)、Data Access/Integration(数据访问/集成)、Web、AOP等。 2. **...

    Pro+Spring+5

    9. 内容介绍:虽然未提供具体内容的摘录,但书名和副标题表明,本书将覆盖Spring框架的广泛方面,包括其工具和库,比如Spring Boot、Spring MVC、Spring Data、Spring Security等。 10. 技术更新:第五版表明这本书...

    learning spring boot 2.0

    1. Spring Boot框架的基本概念、特性、约定优于配置的原则和如何快速开发Spring应用。 2. 基于Spring Boot 2.0开发微服务架构应用的能力,包括服务注册、发现、负载均衡和配置管理。 3. 响应式编程的实践,响应式...

    java 笔记(编程十年精华)

    Struts1主要依赖于ActionServlet和一系列的配置文件,而Struts2则引入了更多现代框架的特点,如拦截器(Interceptor)和OGNL(Object-Graph Navigation Language)表达式。 **Spring**:Spring框架是Java企业级应用...

    基于MVC模式的车身CAD_CAE信息集成系统研究.pdf

    部分内容摘录显示,研究是基于MVC模式,并且详细探讨了如何利用JSP、Servlet和JavaBean等技术来构建车身CAD/CAE信息集成系统。同时,分析了使用Struts框架的好处,尤其是在安全性和系统结构方面。 在实际应用中,...

    Spring与iBATIS的集成

    在此摘录中,两位作者将和你一起安装iBATIS并将其集成进你的Spring应用中。他们也阐明了怎样取得你已编写的SQL语句及把他们映射给iBATIS使用的Bean。最后,还讨论了iBATIS的优缺点,及为什么是这样的一种方式,即...

    tiny-spring:tiny-spring是简化版的spring框架,能帮助您快速熟悉spring原型和掌握spring的核心原理。摘录了spring的核心逻辑,代码极度简化,保留spring的核心功能,如IoC和AOP,资源加载器,事件监听器,类型转换,容器扩展点,bean生命周期和作用域,应用某些等核心功能

    摘录了spring的核心逻辑,代码极度简化,保留spring的核心功能,如IoC和AOP,资源加载器,事件监听器,类型转换,容器扩展点,bean生命周期和作用域,应用某些等核心功能。 如果本项目能帮助到你,请给个STAR,谢谢...

    Pro Asp.Net MVC5

    MVC模式是一种用于组织应用程序的方式,其中模型(Model)代表数据和业务逻辑,视图(View)负责展示数据(模型),而控制器(Controller)负责接收用户输入并调用模型和视图。MVC模式分离了应用程序的这三个核心...

    尚硅谷2020最新SpringCloud思维导图【第二季】(非官方版本,个人学习笔记)

    我是老程序员,所以是开1.5到2的倍速看下来的,但是为了整理笔记确实也耗费了不少时间和精力。 配套的源码:https://github.com/wenren0819/Spring-Cloud-2020 分享出来目的不是骗分儿,是希望能够帮助到大家,

    webservice摘录webservice摘录

    webservice摘录webservice摘录webservice摘录webservice摘录webservice摘录webservice摘录webservice摘录webservice摘录webservice摘录质

    Spring AOP+ehCache简单缓存系统解决方案

    在本篇【Spring AOP+ehCache简单缓存系统解决方案】中,我们将探讨如何利用Spring AOP(面向切面编程)和ehCache框架来构建一个高效、简单的缓存系统,以提升应用程序的性能。ehCache是一款流行的开源Java缓存库,它...

    Spring in Action 3rd(2011).pdf

    标题《Spring in Action 3rd (2011)》所蕴含的知识点主要围绕着Spring框架的学习和使用,旨在教授开发者如何利用Spring框架来简化Java EE应用的开发。Spring框架的创建目的正是为了使得开发过程更加便捷高效,本书的...

    桌面型ExtJS4.2.1MVC+SpringMVC3.0.5注解开发实例补充说明

    1. 需要使用Java Development Kit 6(jdk6),这是一个用于开发Java应用程序的集成开发环境。 2. 使用Spket插件1.6.23版本,这是一个为Eclipse IDE提供的JavaScript开发环境扩展。 3. 关于“No grammar constraints ...

Global site tag (gtag.js) - Google Analytics