Struts1与Struts2的那些事
一、概述
Struts1以ActionServlet作为核心控制器,由ActionServlet负责拦截用户的全部请求。Struts1框架有3个重要组成部分:Action、ActionForm和ActionForward对象。
ActionForm必须实现ActionForm的基类,设计上并非真正的POJO
ActionForward就是一个逻辑视图,通过在配置文件里定义ActionFoward的映射,完毕逻辑视图名和实际视图资源之间的映射
Struts2核心控制器:FilterDispatcher。它事实上并非一个陌生的Web框架,Struts2是以Webwork的设计思想为核心。吸收了Struts1的长处,因此。能够觉得Struts2是Struts1和Webwork结合的产物。
由此可见Struts1和Struts2有着藕断丝连的关系,先从断说起,Struts2并非Struts1的升级。它在实现原理和编程应用上与Struts1都全然不同。能够说彻底抛弃了Struts1的框架。何为连?尽管WebWork在设计上确实要比struts1先进,但因为用户习惯问题。所以非常难被普及,仅仅有挂羊头卖狗肉才会被市场逐步接受,基于这些原因。WebWork开发团队与Struts1开发团队開始合作。借struts1之名。行WebWork之实,推出了Struts2。
通过以上对二者的简单了解,主要从下面10点来说明他们之间有什么差别:
二、对照
|
特征 |
Struts 1 |
Struts 2 |
|
Action类 |
Struts1的action须要去继承一个抽象基类。一个普遍问题就是Struts1是面向抽象类编程来取代接口编程 |
Struts2的action能够实现一个Action接口,也能够同一时候实现一些其它的接口来添置一些附加的,经常使用的服务。Struts2提供一个基类ActionSupport实现了一些经常使用的接口。尽管Action接口不是必须的。不论什么附带execute方法的POJO对象都能够作为Struts2的action对象。 |
|
线程模型 |
Struts1的action是单例的并且必须是线程安全的。由于该类会仅仅有唯一一个引用来为action处理全部的请求。单例策略会限制Struts1的action的功能以及须要扩展的额外的功能(The singleton strategy places restrictions on what can be done with Struts1的action必须是线程安全的而且是同步的。 |
Struts2的Action对象是针对每个请求的,所以自然也就不存在线程安全问题了。 (实践中。servlet容器给每个请求产生很多丟弃的对象,而且不会导致性能和垃圾回收问题) |
|
Servlet的依赖 |
Struts1的Action依赖于Servlet API,由于当Action被调用的时候HttpServletRequest和HttpServletResponse对象是通过execute方法进行处理的。 |
Struts2的Action和容器的连接并不紧密。通常servlet上下文被描绘成简单的Map映射。同意Action被单独測试。当然,假设须要的话Struts2的Action也能够通过訪问初始的request和response来完毕一些功能。 然而,其它的一些架构元素导致减少或者删除了直接訪问request和response的需求。 |
|
易測试性 |
測试Struts1的Action有一个大障碍就是execute方法是直接暴露于servlet API的。 |
Struts2的Action能够非常easy的通过设置属性调用方法来进行測试。 当然依赖注入的支持也使得測试变得简单。 |
|
输入处理 |
Struts1使用一个ActionForm对象来获取用户的输入。和action一样。全部的ActionForm都必须继承自一个基类。由于其它的javaBean不能被用作ActionForm,开发人员通常要写一些多余的类来获取用户输入。 DynaBean能够被用做生成ActionForm类的一个选择,可是开发人员须要对现有的javaBean进行重写。 |
Struts2使用Action属性作为输入属性,除掉了对于输入对象的需求。 输入属性能够是一个拥有他自己的属性的对象。 Action属性是通过标签和web页面交互。Struts2也支持ActionForm模型,就是POJO的Form对象和POJO的Action。 多数的对象类型。包含商业逻辑对象和领域对象都能够作为输入/输入对象。模式驱动特征简化了标签和POJO输入对象的关系。 |
|
表达式语言 |
Struts1和JSTL结合,所以他能够使用JSTL的EL。 |
Struts2也支持JSTL,可是这个框架也支持更加强大的表达式语言OGNL. |
|
表现层和类型值的绑定 |
Struts1使用标准的JSP机制将对象绑定到page context来进行訪问。 |
Struts2使用”ValueStack”技术,所以标签不用将视图和表现的对象结合就能够得到值.ValueStack策略同意通过一系列可能具有同样属性名字可是不同属性类型的的类型来完毕视图的重用, |
|
类型转换 |
Struts1的ActionForm通常都是String类型。Struts1通过Commons-Beanutils实现类型转换。 |
Struts2使用OGNL实现类型转换,框架包括了对基础和公共类型的转换器。 |
|
验证 |
Struts1支持通过ActionForm中的validate方法实现手工验证。也能够通过扩展通用的验证框架进行验证。对于同一个类能够有不同的验证。可是不能关联到子对象的验证。 |
Struts2也支持通过validate方法进行手工验证以及Xwork验证框架进行验证。Xwork验证框架支持将验证链接到子属性,子属性使用了为属性类型和验证上下文定义的验证。 |
|
Action运行的控制 |
Struts1支持为每个模块分配请求处理(生命周期)。可是一个模块中的全部Action必须分享同样的生命周期。 |
Struts2支持通过拦截器栈为每一个Action创建不同的生命周期。通常对于不同的Action依据须要都要有相应的栈被创建和使用。 |
三、总结
通过以上对Struts1和Struts2的对照。让我们更明白了它们各自的优缺点。非常显然Struts2是站在前辈的基础上设计出来。它会改善和完好Struts1中的一些缺陷,Struts1中的一些悬而未决问题在Struts2得到了解决。可是struts1是老牌框架,应用非常广泛。有非常好的群众基础,开发者比較好招。项目开发的风险小,成本更低。所以两者的选用视情况而定。
Struts1与Struts2的那些事的更多相关文章
- Struts1与Struts2的12点区别
Struts1与Struts2的12点区别 1) 在Action实现类方面的对比:Struts 1要求Action类继承一个抽象基类:Struts 1的一个具体问题是使用抽象类编程而不是接口.Str ...
- struts1 和 struts2中Action什么时候实例化
精帖1:http://blog.csdn.net/lfsf802/article/details/7277013 精帖1:http://blog.csdn.net/wmj2003/article/de ...
- struts1,struts2,springMVC终极对比
最近做项目用到了struts2,之前一直是用struts1和springMVC.感觉到了struts2从很大程度上和这两个还是有很大区别的,所以今天搜集了些资料,给他们做一下对比. Struts1官方 ...
- struts1与struts2的区别
Struts2其实并不是一个陌生的Web框架,Struts2是以Webwork的设计思想为核心,吸收了Struts1的优点,因此,可以认为Struts2是Struts1和Webwork结合的产物. 简 ...
- Struts1和Struts2的区别和对比(完整版)
Struts2其实并不是一个陌生的Web框架,Struts2是以Webwork的设计思想为核心,吸收了Struts1的优点,因此,可以认为Struts2是Struts1和Webwork结合的产物. 简 ...
- Struts2五、Struts1与Struts2的区别
Struts1和Struts2的区别和对比: Action 类: • Struts1要求Action类继承一个抽象基类.Struts1的一个普遍问题是使用抽象类编程而不是接口,而struts2的Ac ...
- Struts1和Struts2的区别和对比
Struts1和Struts2的区别和对比: Action 类: • Struts1要求Action类继承一个抽象基类.Struts1的一个普遍问题是使用抽象类编程而不是接口. • Struts 2 ...
- struts1和struts2之间的区别
从action类上分析:1.Struts1要求Action类继承一个抽象基类.Struts1的一个普遍问题是使用抽象类编程而不是接口. 2. Struts 2 Action类可以实现一个Action接 ...
- struts1与struts2的差别
Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架.其全新的Struts 2的体系结构与Struts 1的体系结 ...
随机推荐
- XlsToOra
ylbtech-Miscellaneos:XlsToOra 1. 返回顶部 在没有安装Oracle客户端而又需要将Excel数据导入Oracle表中时,XlsToOra可以方便快捷的达到你的目的. ...
- xenapp 6.5 客户端插件第一次安装总是跳到官网
部署完xenapp6.5后,在没有安装插件的客户端登录时,会出现“下载客户端插件”界面 其实网上已经有很多解决方案,大同小已,只是不知道为什么不适合我安装的版本而已.我安装时最新的版本xenapp 6 ...
- PHP入门(一)
一.概述 PHP(Hypertext Preprocessor缩写),全称超级文本预处理器,是一种在服务器端执行的脚本语言.因此既具备了脚本语言的优缺点 ,又具备了后台服务器语言的优异性能.可以说PH ...
- ODBC更新记录集提示”记录集为只读“
创建的ODBC应用程序默认的记录集不具有只读属性,但是再更新记录表时会提示”记录集为只读“,这是为什么呢? 今天看书找到了答案: 因为MFC中的数据库类不支持需要连接两个或者多个表的记录集更新,如果选 ...
- 双数组Trie树(DoubleArrayTrie)Java实现
http://www.hankcs.com/program/java/%E5%8F%8C%E6%95%B0%E7%BB%84trie%E6%A0%91doublearraytriejava%E5%AE ...
- (算法)Binary Tree Max Path Sum
题目: Given a binary tree, find the maximum path sum. For this problem, a path is defined as any seque ...
- DELL平板如何安装WIN10系统-磁盘分区问题
已经进入PE之后,在这一步的时候,可以把默认的系统分区都移除,但是在计算机管理可能右击没有这个菜单,要用专门的软件弄 不要用分区助手,会提示不能对动态磁盘进行操作,要用Disk Genius(他的 ...
- C# 动态解析表达式
需求 我们很难捉摸用户的思维,即使使用非常正式的文档规范某些数据的定义.结果的标准等,也不能抵挡住用户不断变化的需求,但他们有个万变不离的东西——你做这个东西要是万能的,即输入参数类型.个数等发生改变 ...
- Jenkins 集成Unity3D Xcode
如果Mac 上没有安装brew.先安装:ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)& ...
- Android studio 将 Module 打包成 Jar 包
整理记录 AndroidStudio 把一个 module 项目打包成 jar 包. 一.默认自动生成的 jar 包 众所周知 android studio 会在library所依赖的 app运行 或 ...