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

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

 

         Struts1官方已经中止更新,如今用的也比较少,这里主要讲一下struts2和struts1比较都有哪些不一样和进步。Struts2能够说不是彻底从struts1改进来的,由于struts2本来就是闻名中外的Webwork2,在经历几年的发展以后,struts和WebWork社区决定合二为一,也就是今天的struts2.java

 

         Struts2与struts1比较的新特性:web

Action 类:spring

• Struts1要求Action类继承一个抽象基类。Struts1的一个广泛问题是使用抽象类编程而不是接口。数据库

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

线程模式:缓存

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

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

Servlet 依赖:  restful

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

相关文章
相关标签/搜索