2019独角兽企业重金招聘Python工程师标准>>>

最近做项目用到了struts2,之前一直是用struts1和springMVC。感觉到了struts2从很大程度上和这两个还是有很大区别的,所以今天搜集了些资料,给他们做一下对比。

Struts1官方已经停止更新,现在用的也比较少,这里主要讲一下struts2和struts1比较都有哪些不同和进步。Struts2可以说不是完全从struts1改进来的,因为struts2原本就是举世闻名的Webwork2,在经历几年的发展之后,struts和WebWork社区决定合二为一,也就是今天的struts2.

Struts2与struts1比较的新特性:

Action 类:

• Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口。

• Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去实现常用的接口。Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象。

线程模式:

• Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的。

• Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。(实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)

Servlet 依赖: 

• Struts1 Action 依赖于ServletAPI ,因为当一个Action被调用时HttpServletRequest 和 HttpServletResponse 被传递给execute方法。

• Struts 2 Action不依赖于容器,允许Action脱离容器单独被测试。如果需要,Struts2 Action仍然可以访问初始的request和response。但是,其他的元素减少或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性。

可测性:

• 测试Struts1Action的一个主要问题是execute方法暴露了servlet API(这使得测试要依赖于容器)。一个第三方扩展--Struts TestCase--提供了一套Struts1的模拟对象(来进行测试)。

• Struts 2 Action可以通过初始化、设置属性、调用方法来测试,“依赖注入”支持也使测试更容易。

捕获输入:

• Struts1 使用ActionForm对象捕获输入。所有的ActionForm必须继承一个基类。因为其他JavaBean不能用作ActionForm,开发者经常创建多余的类捕获输入。动态 Bean(DynaBeans)可以作为创建传统ActionForm的选择,但是,开发者可能是在重新描述(创建)已经存在的JavaBean(仍然会导致有冗余的javabean)。

• Struts 2直接使用Action属性作为输入属性,消除了对第二个输入对象的需求。输入属性可能是有自己(子)属性的rich对象类型。Action属性能够通过web页面上的taglibs访问。Struts2也支持ActionForm模式。rich对象类型,包括业务对象,能够用作输入/输出对象。这种ModelDriven 特性简化了taglib对POJO输入对象的引用。

表达式语言:

• Struts1 整合了JSTL,因此使用JSTL EL。这种EL有基本对象图遍历,但是对集合和索引属性的支持很弱。

• Struts2可以使用JSTL,但是也支持一个更强大和灵活的表达式语言--"Object Graph Notation Language" (OGNL).

绑定值到页面(view):

• Struts 1使用标准JSP机制把对象绑定到页面中来访问。

• Struts 2 使用 "ValueStack"技术,使taglib能够访问值而不需要把你的页面(view)和对象绑定起来。ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面(view)。

类型转换:

• Struts 1 ActionForm 属性通常都是String类型。Struts1使用Commons-Beanutils进行类型转换。每个类一个转换器,对每一个实例来说是不可配置的。

• Struts2 使用OGNL进行类型转换。提供基本和常用对象的转换器。

校验: 

• Struts 1支持在ActionForm的validate方法中手动校验,或者通过Commons Validator的扩展来校验。同一个类可以有不同的校验内容,但不能校验子对象。

• Struts2支持通过validate方法和XWork校验框架来进行校验。XWork校验框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性

Action执行的控制:

• Struts1支持每一个模块有单独的Request Processors(生命周期),但是模块中的所有Action必须共享相同的生命周期。

• Struts2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。

SpringMVC与Struts2的比较:

机制:

spring mvc的入口是servlet,而struts2是filter(这里要指出,filter和servlet是不同的。以前认为filter是servlet的一种特殊),这样就导致了二者的机制不同,这里就牵涉到servlet和filter的区别了。

性能:

spring会稍微比struts快。spring mvc是基于方法的设计,而sturts是基于类,每次发一次请求都会实例一个action,每个action都会被注入属性,而spring基于方法,粒度更细,但要小心把握像在servlet控制数据一样。spring3 mvc是方法级别的拦截,拦截到方法后根据参数上的注解,把request数据注入进去,在spring3 mvc中,一个方法对应一个request上下文。而struts2框架是类级别的拦截,每次来了请求就创建一个Action,然后调用setter getter方法把request中的数据注入;struts2实际上是通过setter getter方法与request打交道的;struts2中,一个Action对象对应一个request上下文。

参数传递:

struts是在接受参数的时候,可以用属性来接受参数,这就说明参数是让多个方法共享的。

设计思想上:

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

intercepter的实现机制:

有以自己的interceptor机制,spring mvc用的是独立的AOP方式。这样导致struts的配置文件量还是比spring mvc大,虽然struts的配置能继承,所以我觉得论使用上来讲,spring mvc使用更加简洁,开发效率Spring MVC确实比struts2高。spring mvc是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上spring3 mvc就容易实现restful url。struts2是类级别的拦截,一个类对应一个request上下文;实现restful url要费劲,因为struts2 action的一个方法可以对应一个url;而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了。spring3mvc的方法之间基本上独立的,独享request response数据,请求数据通过参数获取,处理结果通过ModelMap交回给框架方法之间不共享变量,而struts2搞的就比较乱,虽然方法之间也是独立的,但其所有Action变量是共享的,这不会影响程序运行,却给我们编码,读程序时带来麻烦。

总结:

Strut1目前已经很少再用,个人感觉springMVC在易用性上要优于struts2.struts2和springMVC在性能方面是不分伯仲,每个阵营都有自己的测试数据,很难说哪一个更优秀。以上资料部分摘自网络,尊重原作者版权,分享给更多的读者。

附:servlet与filter区别:

一、概念:
1、servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层。
2、filter:filter是一个可以复用的代码片段,可以用来转换HTTP请求、响应和头信息。Filter不像Servlet,它不能产生一个请求或者响应,它只是修改对某一资源的请求,或者修改从某一的响应。
二、生命周期:
1、servlet:servlet的生命周期始于它被装入web服务器的内存时,并在web服务器终止或重新装入servlet时结束。servlet一旦被装入web服务器,一般不会从web服务器内存中删除,直至web服务器关闭或重新结束。
(1)、装入:启动服务器时加载Servlet的实例;
(2)、初始化:web服务器启动时或web服务器接收到请求时,或者两者之间的某个时刻启动。初始化工作有init()方法负责执行完成;
(3)、调用:从第一次到以后的多次访问,都是只调用doGet()或doPost()方法;
(4)、销毁:停止服务器时调用destroy()方法,销毁实例。 
2、filter:(一定要实现javax.servlet包的Filter接口的三个方法init()、doFilter()、destroy(),空实现也行)
(1)、启动服务器时加载过滤器的实例,并调用init()方法来初始化实例;
(2)、每一次请求时都只调用方法doFilter()进行处理;
(3)、停止服务器时调用destroy()方法,销毁实例。
三、职责
1、servlet:
创建并返回一个包含基于客户请求性质的动态内容的完整的html页面;
创建可嵌入到现有的html页面中的一部分html页面(html片段);
读取客户端发来的隐藏数据;
读取客户端发来的显示数据;
与其他服务器资源(包括数据库和java的应用程序)进行通信;
通过状态代码和响应头向客户端发送隐藏数据。
2、filter:
filter能够在一个请求到达servlet之前预处理用户请求,也可以在离开servlet时处理http响应:
在执行servlet之前,首先执行filter程序,并为之做一些预处理工作;
根据程序需要修改请求和响应;
在servlet被调用之后截获servlet的执行
四、区别:
1,servlet 流程是短的,url传来之后,就对其进行处理,之后返回或转向到某一自己指定的页面。它主要用来在 业务处理之前进行控制.
2,filter 流程是线性的, url传来之后,检查之后,可保持原来的流程继续向下执行,被下一个filter, servlet接收等,而servlet 处理之后,不会继续向下传递。filter功能可用来保持流程继续按照原来的方式进行下去,或者主导流程,而servlet的功能主要用来主导流程。
filter可用来进行字符编码的过滤,检测用户是否登陆的过滤,禁止页面缓存等。

转载于:https://my.oschina.net/tantexian/blog/698540

struts1-2,springMVC原理基本对比(单例,多例)-servlet与filter区别相关推荐

  1. 绝对值编码器工作原理是什么?单圈/多圈绝对值编码器有何区别?

    在前两篇文章中,小编对增量式编码器以及绝对式编码器有所阐述.为增进大家对编码器的认识,本文将对绝对值编码器予以介绍.通过本文,你将了解到什么是绝对值编码器.绝对值编码器的工作原理以及单圈/多圈绝对值编 ...

  2. 计算机原理期中考试,计算机原理期中试卷(单招)

    <计算机原理期中试卷(单招)>由会员分享,可在线阅读,更多相关<计算机原理期中试卷(单招)(3页珍藏版)>请在人人文库网上搜索. 1.学校 班级 学生姓名 学号 计算机原理 科 ...

  3. Spring原理/SpringMVC原理/IOC/AOP原理

    Spring原理/SpringMVC原理/IOC/AOP原理 我的微型IOC框架实现 我的微型IOC框架实现 当你打开这本书的时候我要告诉你的第一句话就是认真把前言读完,因为前言概括的本书的大纲以及思 ...

  4. 报表工具对比选型系列用例——过程计算

    我们知道,报表呈现的数据常常并不是直接从数据库(源)取出来的数据,而还要进行一些运算,报表工具通常也会提供一定的运算能力(如过滤.分组等)以应对这种需求.但是,情况复杂时,报表数据集上的运算可能要多个 ...

  5. SpringMVC→拦截器、SpringMVC拦截器实现、多个拦截器工作原理、拦截器使用场景、拦截器Interceptor与过滤器Filter区别

    拦截器 拦截器实现 多个拦截器工作原理 拦截器使用场景 请求编码设置及请求登录Session校验 使用时间段设置 拦截器Interceptor与过滤器Filter区别

  6. 双路cpu比单路强多少_电源单路好还是双路好?电脑电源单路和双路12V详细区别对比...

    在一些比较大功率的电源中,经常可以看到分为单路12V和双路甚至是多路12V两种规格.那么,电源单路好还是双路好呢,很多网友搞不清这个问题.下面"脚本之家"以最通俗易懂的描述,带大家 ...

  7. Spring、SpringMVC、Spring Boot、Spring Cloud 概念、关系及区别

    注:此文章转载于其他大神 一.正面解读: Spring主要是基于IOC反转Beans管理Bean类,主要依存于SSH框架(Struts+Spring+Hibernate)这个MVC框架,所以定位很明确 ...

  8. 单页应用 多页应用的区别

    前言 最近看到一些人在问单页面和多页面应用的区别.所以也就输出这一篇短文希望可以给你一个整体的认识. 这里也会大体介绍单页应用实现的核心 -- 前端路由. 单页应用 VS 多页应用 对比图 单页应用( ...

  9. 单页面应用和多页面应用区别

    单页面应用和多页面应用区别 一.多页面应用 每一次页面跳转的时候,服务器都会给返回一个新的html文档,这种类型的网站也就是多页网站,也叫做多页应用. 多页面具有什么优点呢? 首屏时间快 首屏时间叫做 ...

最新文章

  1. Ext JS 4 笔记1
  2. 2022年科学突破奖,9人共获奖金1500万美元,mRNA 新冠疫苗2位奠基人获奖
  3. linux下g编译文件或目录,【转】在linux下使用gcc/g++编译多个.h文件
  4. java斗破苍穹游戏阵容,斗破苍穹手游竞技场阵容搭配解析 最强阵容你知道吗
  5. Yii2 获取URL的一些方法
  6. linux下q和q 的区别,linux命令中q、wq、q!的区别
  7. 互联网日报 | 苹果首款自研芯片M1亮相;酷派主动终止与小米专利侵权诉讼;橙心优选日订单破700万...
  8. bll调用mysql存储过程_SQL Server的存储过程或自定义函数调用Com组件
  9. Linux下配置完整安全的DHCP服务器详解
  10. Atitit 团队远景规划与目标总结 v4 目录 1. 使命和组织宗旨 1 1.1. 组织使命 1 1.2. 核心价值观 1 2. 行政目标体系 2 2.1. 打造体系齐全的复合体 2 2.2. 人
  11. 男人养肾按摩运动更可取
  12. web移动开发总结(一)
  13. 从CM刷机过程和原理分析Android系统结构
  14. Unity3d资源反编译. AssetBundle格式简析+简单应用+爬坑
  15. Mysql information_schema库
  16. Win8或Win8.1下输入法小技巧,个人习惯,可参考
  17. 编译问题解决:LINK : fatal error LNK1104: 无法打开文件“*.dll”
  18. 小娱路由php,跟风折腾小娱路由器XY-C5,做低功耗路由+下载器+轻量化NAS.
  19. HTML的meta标签详解
  20. 【渝粤题库】国家开放大学2021春2412基础写作题目

热门文章

  1. GitHub 中文文档正式发布
  2. 让Python代码简洁的实用技巧!
  3. 可解释机器学习发展和常见方法!
  4. 21张让你代码能力突飞猛进的速查表(神经网络、机器学习、可视化等)
  5. 未入选新一轮“双一流”!两所高校官宣
  6. 30个Python常用极简代码,拿走就用
  7. 为什么清北硕博扎推街道办毫不意外, 反会越来越多?
  8. 导师神总结:读博失败的10个作死大法
  9. 那些在一个公司死磕了5-10年的程序员,最后都怎么样了?
  10. 数据恢复工具,每秒钟扫描 1000万文件!