Struts1和Struts2对照
最近学习Struts1和Struts2.好多人、提到非常多的信息。
Struts2不从Struts1进化。
Struts2的前身WebWork。
呢,看了一些资料,下边就来比較比較。
一、架构分析
Struts1的架构图:
运行流程:
1.用户在浏览器端发送请求。server(比方:Tomcat)创建HttpServletRequest和HttpServletResponse对象。并将用户的请求的表单信息放到HttpServletRequest对象中。
2.创建ActionServlet对象,在ActionServlet中有一个核心对象RequestProcessor,(1)截取用户请求的地址path,查询得到ActionMapping对象。相应于Struts-config.xml中的acion-mapping标签中的信息。(2)利用ActionMapping中的name。创建ActionForm对象。相应于Struts-config.xml中的form-bean标签中的信息。
3.ActionForm通过reset,获取用户提交的表单信息中全部为name的属性,相应的设置到ActionForm对象的属性中。
4.通过ActionMapping对象中action的完整路径,创建Action(假设有则返回,假设没有则创建,放到map。下次用就不用再创建了。所以,struts1的action是仅仅创建一个实例的)。通过指定的Action,ActionMapping对象、ActionForm对象、HttpServletRequest对象、HttpServletResponse对象作为參数调用调用execute方法。依据用户的请求,控制调用Model。操作数据库。返回操作数据库的结果信息。放到request中。并返回要跳转到的页面。
Struts2的架构图:
运行流程:
1 client初始化一个指向Servlet容器(比如Tomcat)的请求。
2 这个请求经过一系列的过滤器(Filter)。
3 接着FilterDispatcher(struts2.1.3之后。strutsPrepareAndExcuteFilter就取代了FilterDispatcher)被调用,FilterDispatcher询问ActionMapper来决定这个请是否须要调用某个Action。
4 假设ActionMapper决定须要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy。
5 ActionProxy通过Configuration Manager询问框架的配置文件,找到须要调用的Action类。
6 ActionProxy创建一个ActionInvocation的实例。
7 ActionInvocation实例使用命名模式来调用。在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
8 一旦Action运行完成,ActionInvocation负责依据struts.xml中的配置找到相应的返回结果。
Struts2的核心就是拦截器。Struts.xml中全部的package都要extends=”struts-default”。同理与全部的Java类都要extends自Object一样。struts-default.xml里面就是要做以上事情。
二、对照
对照struts1和struts2的运行流程,我没认为它俩有什么太大的区别。大致是同样的:用户发送请求。通过request到核心控制器上(struts1中是ActionServlet。Struts2中是StrutsPrepareAndExcuteFilter),控制器依据配置文件里的配置,决定调用哪个Action,通过Action的execute()方法,控制调用哪个Model。处理用户的请求。操作数据库,并返回操作结果,并返回跳转的页面。
那Struts2究竟是哪里的设计,让它大放异彩?
Struts1的缺点:
1.在struts1中。用户请求提交到request,全部的request都需经过核心控制器ActionServlet推断、处理。要调用哪个Action。创建Action后在调用Model进行业务处理。
假设仅仅是訪问一个jsp页面,也还是须要经过配置,通过ActionServlet管理的。
Struts2中。ActionInvocation在创建Action时,是经过ActionMapper推断,是否要调用某个Action。仅仅有须要调用的时候才创建。
2.Struts1的Action须要继承一个基类Action的。
这里用到了HttpServletRequest、HttpServletResponse作为參数,所以struts1依赖了Servlet API的。存在这种依赖。架构是不easy扩展的,这就是入侵式的设计。
此外由于依赖HttpServletRequest、HttpServletResponse,那我们的Action类的測试,是必须依赖web容器。webserver的。这种话。单元測试非常不easy进行。
Strut2的Action能够不依赖于不论什么类,仅仅是作为一个单独的,纯粹的类而存在,这样进行单元測试就简便了非常多。
3.struts1的Action创建,是单例的。假设创建了就不在创建,所以全部的请求都在使用这一个实例,这就须要保证线程安全。
Struts2的Action创建。是为每个请求创建一个实例。所以不用考虑线程安全问题。
4.struts1的view部分採用jsp实现。提供了JSTL标签库。标签库能够输出控制器的处理结果。 但struts1支持的表现层技术非常单一:既不支持FreeMarker、Velocity等模版技术,也不支持JasperReports等报表技术 。
比較之下,struts2支持很多其它的表现层技术。如velocity。freemarker和xslt等
struts1使用标准JSP机制把对象绑定到视图页面;struts2使用“ValueStack”技术,使标签库能訪问值,而不须要把对象和视图页面绑定到一起。
所以。通过以上对照,就会发现struts1的设计尽管较于Model2有了非常大的提升。可是随着时代、技术的发展,它的缺点会越来越放大。再看struts2,它和struts1的实现机制上有非常大的不同,它弥补了struts1的不足。所以struts2并非struts1的继承和发展,而是webwork的。
$(function () {
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('
- ').addClass('pre-numbering').hide();
$(this).addClass('has-numbering').parent().append($numbering);
for (i = 1; i ').text(i));
};
$numbering.fadeIn(1700);
});
});
版权声明:本文博主原创文章,博客,未经同意不得转载。
Struts1和Struts2对照的更多相关文章
- Struts1与Struts2的那些事
一.概述 Struts1以ActionServlet作为核心控制器,由ActionServlet负责拦截用户的全部请求.Struts1框架有3个重要组成部分:Action.ActionForm和Act ...
- jsp\struts1.2\struts2 中文件上传(转)
jsp\struts1.2\struts2 中文件上传 a.在jsp中简单利用Commons-fileupload组件实现 b.在struts1.2中实现c.在sturts2中实现现在把Code与大家 ...
- Struts1与Struts2的12点区别
Struts1与Struts2的12点区别 1) 在Action实现类方面的对比:Struts 1要求Action类继承一个抽象基类:Struts 1的一个具体问题是使用抽象类编程而不是接口.Str ...
- 浅析Struts1和Struts2的Action线程安全问题 转
浅析Struts1和Struts2的Action线程安全问题 转 http://blog.csdn.net/virgoboy2004/article/details/5876133 [问题描述]最近 ...
- Struts1和Struts2的区别和对比(完整版)
Struts2其实并不是一个陌生的Web框架,Struts2是以Webwork的设计思想为核心,吸收了Struts1的优点,因此,可以认为Struts2是Struts1和Webwork结合的产物. 简 ...
- Struts1、Struts2和SpringMVC剖析【转载】
前段框架用了不少,今天就来做个总结.网上关于Struts1.Struts2.SpringMVC的文章有很多,这里的内容就是基于它们,来做个比较. 这三个框架是按照上面的顺序,依次出现的,它们都是对MV ...
- Struts2五、Struts1与Struts2的区别
Struts1和Struts2的区别和对比: Action 类: • Struts1要求Action类继承一个抽象基类.Struts1的一个普遍问题是使用抽象类编程而不是接口,而struts2的Ac ...
- Struts1和Struts2的区别和对比
Struts1和Struts2的区别和对比: Action 类: • Struts1要求Action类继承一个抽象基类.Struts1的一个普遍问题是使用抽象类编程而不是接口. • Struts 2 ...
- struts1和struts2和springMVC的区别和介绍
MVC是web开发常用的模式,M即模型层(Model):主要由javabean来实现.V即视图层(View):主要由jsp.velocity.freemarker等.C即控制层(Controller) ...
随机推荐
- HDU 4435 charge-station (并查集)
先说下题目的意思: 在一个二维坐标系中有N个点,某人要来个走遍所有点的旅行,但是他的车每次加油后只能走M个单位距离:所以要在这个N点中选一些建立加油站:问题来了:i^th 点 建加油站的花费是 2 ...
- JDK源码学习系列01----String
JDK源码学习系列01----String 写在最前面: 这是我JDK源码学习系列的第一篇博文,我知道 ...
- ListView的cacheColorHint与listSelector物业和fragment里面onActivityResult问题没有响应
fragment里面onActivityResult 如何才华被称之为.在使用时发现没反应,没注意这个问题谁. 多方法都不是非常方便.最终实验除了一个最简单的方法. startActivityForR ...
- Cocos发展Visual Studio下一个libcurl图书馆开发环境的搭建
我们解释win32在Visual Studio下一个libcurl图书馆开发环境的搭建.Cocos2d-x发动机实际上与Win32在访问libcurl库.Cocos2d-x 3.x在libcurl库文 ...
- DapperLambda发布
DapperLambda发布 引言:因为接触过多个ORM,但使用的时候都遇到了各自的一些不够理想的地方,从最早开始开始公司自己分装的,到后面用EF,以及Dapper和DapperExtensions ...
- 返璞归真 asp.net mvc (5) - Action Filter, UpdateModel, ModelBinder, Ajax, Unit Test
原文:返璞归真 asp.net mvc (5) - Action Filter, UpdateModel, ModelBinder, Ajax, Unit Test [索引页] [源码下载] 返璞归真 ...
- Directx11学习笔记【十一】 画一个简单的三角形--effect框架的使用
这里不再介绍effect框架的具体使用,有关effect框架使用可参考http://www.cnblogs.com/zhangbaochong/p/5475961.html 实现的功能依然是画一个简单 ...
- Oracle 六闪回技术,flashback
Flashback 技术基于Undo segment基于内容的, 因此,限制UNDO_RETENTON参数. 要使用flashback 特征,您必须启用自己主动撤销管理表空间. 在Oracle 11g ...
- MySQL InnoDB数据库备份与还原
备份 进入cm黑窗口 输入下列命令 mysqldump -u 用户名 -p 数据库名称> c:\11.sql 回车执行 恢复 进入cm黑窗口 输入下列命令 mysql>use dbtest ...
- 2015最新iherb海淘攻略-图文入门教程
IHerb是美国最热门的海淘海购网站之中的一个,适合不爱担心,怕麻烦的朋友入门海淘,由于它有中文页面,可直邮中国,上千个母婴用品.化妆品.保健品品牌,最重要的是!首次下单,价值$40及以上的订单会马上 ...