最近学习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的。

版权声明:本文博主原创文章,博客,未经同意不得转载。

Struts1和Struts2对照相关推荐

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

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

  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对比分析

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

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

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

  8. 聊聊Servlet、Struts1、Struts2以及SpringMvc中的线程安全

    前言 很多初学者,甚至是工作1-3年的小伙伴们都可能弄不明白?servlet Struts1 Struts2 springmvc 哪些是单例,哪些是多例,哪些是线程安全? 在谈这个话题之前,我们先了解 ...

  9. Struts1和Struts2的区别和对比

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

最新文章

  1. named 客户端无法解析_解析天联高级版客户端无法访问用友U8问题
  2. linux 内核编译详解
  3. 排序算法--冒泡排序的首尾改进
  4. C#中几种循环语法的比较
  5. C++:vs2017编写代码时的光标变成了黑块,选中字时替换掉了黑块选中的字【解决办法】
  6. JAVA使用MySQL数据库连接时区问题解决方法?
  7. python中datetime函数怎么获得当年年份_Python 日期和时间函数使用指南
  8. php for求合,怎么用PHP for循环求1到100的和
  9. .NET的RulesEngine(规则引擎)使用
  10. java xheditor,xhEditor不能支持本map片上传,请问
  11. sl4a库_sl4a之pythonapi中文参考
  12. WEBSHELL 提权方法总结
  13. 元宇宙地产演化史:从文本时代到区块链时代
  14. 海关179号出口清单报文CEB603Message描述规范
  15. oracle显示连接超时,Oracle 12179:tns:连接超时的问题
  16. QNX系列:一、进程和线程
  17. 典型的DOS攻击技术
  18. Prescan 8.5.0 许可证过期(Could not checkout a valid license)
  19. vivado里那些看不懂的原语
  20. 华为笔记本linux usb启动,华为MateBook D(2018) BIOS设置u盘启动教程

热门文章

  1. WebWork深度探索之号外
  2. shell中判断控制语句 if case
  3. Oracle 常用命令 及近期使用问题集合
  4. 计算机网络协议分层体系结构
  5. MySQL-5.5.28编译安装
  6. DOM对象和JQUERY对象
  7. 【阿里云产品公测】高大上的搜索服务OpenSearch, 你值得拥有!
  8. Bitmap的一个简单实现
  9. [转]总不能一辈子做助理
  10. Quartz.Net 1.30的一些设置说明