最近学习了Struts1和Struts2.很多人、很多资料都提到。Struts2不是从Struts1发展而来的。Struts2的前身是WebWork。那它俩到底有多大的不同呢,看了一些资料,下边就来比较比较。

一、架构分析

Struts1的架构图:

执行流程:
1.用户在浏览器端发送请求,服务器(比如: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 客户端初始化一个指向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的。存在这种依赖,架构是不容易扩展的,这就是入侵式的设计。此外因为依赖HttpServletRequest、HttpServletResponse,那我们的Action类的测试,是必须依赖web容器,web服务器的。这样的话,单元测试很不容易进行。
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的。

Struts1和Struts2对比相关推荐

  1. Struts1与Struts2对比分析

    Struts2其实并不是一个陌生的Web框架,Struts2是以Webwork的设计思想为核心,吸收了Struts1的优点,因此,可以认为Struts2是Struts1和Webwork结合的产物. 简 ...

  2. Struts1和Struts2的区别和对比(完整版)

    struts2不是struts1的升级,而是继承的webwork的血统,它吸收了struts1和webwork的优势. 先看struts的Action官方注释(struts1.3.8源代码) /** ...

  3. struts1,struts2,springMVC对比

    struts1,struts2,springMVC对比 [参考原文:http://blog.csdn.net/xiaokui008/article/details/8980429] Struts1官方 ...

  4. Struts1和Struts2的区别和对比(完整版)(转)

    Struts1和Struts2的区别和对比(完整版)(转) Struts1和Struts2的区别和对比: Action 类:  • Struts1要求Action类继承一个抽象基类.Struts1的一 ...

  5. Struts1、Struts2及SpringMVC对比

    Struts2其实并不是一个陌生的Web框架,Struts2是以Webwork的设计思想为核心,吸收了Struts1的优点,因此,可以认为Struts2是Struts1和Webwork结合的产物. 简 ...

  6. Struts1、Struts2、Spring MVC 流程图,对比

    Struts1.Struts2.Spring MVC框架的区别 2011-01-23 15:12:32|  分类:Struts |  标签:struts1  struts2  spring  mvc框 ...

  7. Java MVC框架性能比较 jsp、struts1、struts2、springmvc3 (转帖)

    为什么80%的码农都做不了架构师?>>>    Java MVC框架性能比较 jsp.struts1.struts2.springmvc3 现在各种MVC框架很多,各框架的优缺点网络 ...

  8. Struts1和Struts2对照

    最近学习Struts1和Struts2.好多人.提到非常多的信息. Struts2不从Struts1进化. Struts2的前身WebWork. 呢,看了一些资料,下边就来比較比較. 一.架构分析 S ...

  9. Struts1和Struts2的区别和对比

    2019独角兽企业重金招聘Python工程师标准>>> 类: •Struts1要求Action类继承一个抽象基类.Struts1的一个普遍问题是使用抽象类编程而不是接口. • Str ...

  10. struts1和struts2的区别2

    1) 在Action实现类方面的对比:Struts 1要求Action类继承一个抽象基类:Struts 1的一个具体问题是使用抽象类编程而不是接口.Struts 2 Action类可以实现一个Acti ...

最新文章

  1. Elasticsearch 在各大互联网公司大量真实的应用案例!
  2. 解密:面部特征点检测的关键技术
  3. 通过java类的反射机制获取类的属性类型
  4. HTTP状态码:400\500 错误代码
  5. LeetCode 751. IP 到 CIDR(贪心)
  6. 6-Arco大讲堂(一)
  7. grep 多模式匹配
  8. 小米miui全机型代码对照与各机型发布时间表 了解小米机型发展历程
  9. html右下角的广告特效,用jQuery实现网页右下角弹出广告效果
  10. Python绘制多维度专题地图
  11. 波士顿房价预测python决策树_模型评价与验证-波士顿房价预测.ipynb
  12. 2021最新 阿里云部署 Flask + WSGI + Nginx 详解
  13. 全国企业信用信息 网站
  14. 赛效:wps下载手机版怎么操作的?
  15. ALS算法原理和在音乐推荐上的应用
  16. 使用https请求接口报:javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated”异常的问题处理
  17. EOS 安装本地环境,发币教程,本地节点
  18. python科学计算主要学什么_以下哪些是python常用的科学计算库?_学小易找答案
  19. 51nod3148 松鼠聚会
  20. php ssl tls_SSL/TLS多种证书类型的转换

热门文章

  1. 计算机快速启动BIOS,bios设置快速启动
  2. powerdesign新手入门详细教程
  3. 虚拟机运行闪讯 实现linux联网 (多图)
  4. 硬盘盒刷固件使其不休眠
  5. 经典问题之约瑟夫问题_C语言实现
  6. 计算机拒绝访问移动硬盘,移动硬盘拒绝访问怎么办
  7. c/c++语言实现登陆界面
  8. 无需任何软件,简单修改Win7开机登陆界面背景图片
  9. Mac下修改HD3000显存到1GB
  10. Linux 服务器网卡驱动安装及故障排除