先说结论:目前Spring MVC已经一统江山,Struts正在被抛弃

1、Spring MVC原理

Spring 体系:

Spring MVC工作流程图


SpringMVC的工作流程描述

1. 用户向服务器发送请求,请求被Spring前端控制Servelt DispatcherServlet捕获;2. DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;
  1. DispatcherServlet根据获得的Handler,选择一个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(…)方法)

    1. 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:

    HttpMessageConveter:将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息

    数据转换:对请求消息进行数据转换。如String转换成Integer、Double等

    数据根式化:对请求消息进行数据格式化。如将字符串转换成格式化数字或格式化日期等

    数据验证:验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中

    1. Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;

    2. 根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ;

    3. ViewResolver结合Model和View,来渲染视图

    8.将渲染结果返回给客户端。

2、Struts原理

Struts架构图


从图可以看出,一个请求在Struts2框架中的处理大概分为以下几个步骤:

1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求;

2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMeshPlugin);

3、接着StrutsPrepareAndExecuteFilter被调用,StrutsPrepareAndExecuteFilter询问ActionMapper来决定这个请求是否需要调用某个Action;

4、如果ActionMapper决定需要调用某个Action,StrutsPrepareAndExecuteFilter把请求的处理交给ActionProxy;

5、ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类;

6、ActionProxy创建一个ActionInvocation的实例。

7、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。

8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2框架中继承的标签。在这个过程中需要涉及到ActionMapper。

以上是从宏观上对比下二者的工作流程,下面针对细节对比二者的不同。

3、Struts2和Spring Mvc的区别

3.1、拦截机制的不同
  Struts2是类级别的拦截,每次请求就会创建一个Action,和Spring整合时Struts2的ActionBean注入作用域是原型模式prototype,然后通过setter,getter吧request数据注入到属性。
  Struts2中,一个Action对应一个request,response上下文,在接收参数时,可以通过属性接收,这说明属性参数是让多个方法共享的。Struts2中Action的一个方法可以对应一个url,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了,只能设计为多例。

SpringMVC是方法级别的拦截,一个方法对应一个Request上下文,所以方法直接基本上是独立的,独享request,response数据。而每个方法同时又何一个url对应,参数的传递是直接注入到方法中的,是方法所独有的。处理结果通过ModeMap返回给框架。在Spring整合时,SpringMVC的Controller Bean默认单例模式Singleton,所以默认对所有的请求,只会创建一个Controller,有应为没有共享的属性,所以是线程安全的,如果要改变默认的作用域,需要添加@Scope注解修改。

Struts2有自己的拦截Interceptor机制,SpringMVC这是用的是独立的Aop方式,这样导致Struts2的配置文件量还是比SpringMVC大。

3.2、底层框架的不同
  Struts2采用Filter(StrutsPrepareAndExecuteFilter)实现,SpringMVC(DispatcherServlet)则采用Servlet实现。Filter在容器启动之后即初始化;服务停止以后坠毁,晚于Servlet。Servlet在是在调用时初始化,先于Filter调用,服务停止后销毁。

3.3、性能方面
  Struts2是类级别的拦截,每次请求对应实例一个新的Action,需要加载所有的属性值注入,SpringMVC实现了零配置,由于SpringMVC基于方法的拦截,有加载一次单例模式bean注入。所以,SpringMVC开发效率和性能高于Struts2。

3.4、和Spring集成

spring MVC和Spring是无缝的。从这个项目的管理和安全上也比Struts2高(当然Struts2也可以通过不同的目录结构和相关配置做到SpringMVC一样的效果,但是需要xml配置的地方不少)。

3.5、验证机制

SpringMVC验证支持JSR303,处理起来相对更加灵活方便,而Struts2验证比较繁琐,感觉太烦乱。

3.6、设计思想

Struts2更加符合OOP的编程思想, SpringMVC就比较谨慎,在servlet上扩展。

3.7、集成方面

SpringMVC集成了Ajax,使用非常方便,只需一个注解@ResponseBody就可以实现,然后直接返回响应文本即可,而Struts2拦截器集成了Ajax,在Action中处理时一般必须安装插件或者自己写代码集成进去,使用起来也相对不方便。

拓展:
拦截器与过滤器的区别 :

  1. 拦截器是基于java的反射机制的,而过滤器是基于函数回调。
  2. 拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
  3. 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
  4. 拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
  5. 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
  • servlet:servlet是一种运行服务器端的Java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层。

  • filter:filter是一个可以复用的代码片段,可以用来转换HTTP请求、响应和头信息。Filter不像Servlet,它不能产生一个请求或者响应,它只是修改对某一资源的请求,或者修改从某一的响应。

  • listener:监听器,从字面上可以看出listener主要用来监听只用。通过listener可以监听web服务器中某一个执行动作,并根据其要求作出相应的响应。通俗的语言说就是在application,session,request三个对象创建消亡或者往其中添加修改删除属性时自动执行代码的功能组件。

  • interceptor:是在面向切面编程的,就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法,比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。

  • servlet、filter、listener是配置到web.xml中,interceptor不配置到web.xml中,struts的拦截器配置到struts.xml中。spring的拦截器配置到spring.xml中。

SpringMVC 、Struts的区别相关推荐

  1. SpringMVC与Struts2区别与比较总结

    SpringMVC与Struts2区别与比较总结 1.Struts2是类级别的拦截, 一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方 ...

  2. Spring Web框架与Struts的区别

    Spring Web框架与Struts的区别 Posted on 2007-12-25 02:23 Asktalk 阅读(1848) 评论(0) 编辑 收藏 所属分类: Jdbc/Hibernate3 ...

  3. 04 WebFlux和SpringMVC有什么区别

    04 WebFlux和SpringMVC有什么区别 在构建响应式 Web 服务上,Spring 5 中引入了全新的编程框架,那就是 Spring WebFlux.作为一款新型的 Web 服务开发框架, ...

  4. SpringMvc 与 Struts2 区别总结

    SpringMvc 与 Struts2 区别总结 今天来带大家看一下SpringMvc Struts2的区别 1.框架机制 Struts2采用的是Filter实现,过滤器是StrutsprepareA ...

  5. SpringMVC、Spring和Struts的区别

    一.Spring 首先,结合到自己对于Spring的使用,我明确的一点是,Spring严格上来说,并不是一种框架.它相当于一个粘合剂,黏合了别的框架或者组件.所以,spring是一个容器!为什么用Sp ...

  6. 【SSM 1】SpringMVC、Spring和Struts的区别

    导读:近期做到的项目中,用到的框架师SSM(SpringMVC+Spring+Mybatis),那么在这之前用过SSH,这里主要是区分一下SpringMVC和Struts,但是由于SpringMVC和 ...

  7. springmvc和struts的区别

    springmvc是通过方法的形参接收参数,在使用时可以以单例方式使用,建议使用单例. struts是通过成员变量接收参数,在使用时必须以多例方式使用. 注意:一般类中有成员变量,都是线程不安全的,不 ...

  8. SpringMVC与structs2区别

    Struts2和SpringMVC是比较流行的MVC框架,二者的工作流程大体相似,从下面两张图就可以看出., SpringMVC工作流程图 图二 SpringMVC的工作流程描述 用户向服务器发送请求 ...

  9. Struts2之初识篇(一)——与struts的区别和基本配置

    正在学习Struts2,该类博客作为笔记整理之用,错误的地方望指正,后期还会不断修改完善. Struts2资源: Struts官方地址:http://struts.apache.org/ 我这里下载了 ...

最新文章

  1. 脑电图伪迹去除方法汇总
  2. [视频教程] 使用composer安装使用thinkphp6.0框架
  3. 《迷人的8051单片机》---- 1.2小元器件有大智慧
  4. pandas 在jupyter notebook时候能用,但在vscode, pycharm不能用
  5. 使用Spring RestTemplate和Super类型令牌消费Spring-hateoas Rest服务
  6. bmf mysql_bmf 的动态 - SegmentFault 思否
  7. vs2008试用期到期解决办法
  8. 2012《Linux杂志》读者选择奖 (Readers' Choice Awards 2012- Linux Journal)
  9. Windows服务器:切断默认共享通道七招
  10. TYUT-A专题题解(一)
  11. python load
  12. word转HTML 基本版
  13. Redis分布式架构以及实战
  14. 市场上最受欢迎的十大服装进销存软件
  15. 一、用于数据分析的Excel技巧
  16. 系统集成项目管理工程师是哪个部门发证?
  17. 南邮 OJ 1408 火星探险
  18. 麒麟v10安装达梦数据库
  19. filebeat报错:Harvester could not be started on exist file
  20. 安卓UI图px标注适配攻略:批量转化px为dp

热门文章

  1. python组件介绍_python 中的爬虫· scrapy框架 重要的组件的介绍
  2. vnc oracle solaris,在Solaris下安装VNC 远程安装Oracle
  3. mysql如何快速插入一千万条数据_如何快速安全的插入千万条数据?
  4. 为什么越来越多的人消失在朋友圈?
  5. 通过发声可以把杯子震碎吗?
  6. 左手菲尔兹右手突破奖,这个中国女婿其实是英国贵族?拿到300万奖金后他这样说……...
  7. 这6部超经典的物理电影,居然还有人没有看过?
  8. 嫁给我好吗?| 今日最佳
  9. 图像还可以这样玩!如何用波的算法处理图像
  10. 一位像素艺术家用39张动图,将大自然的唯美尽收眼底…