Struts1和Struts2对比

article/2025/11/5 20:28:21

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

一、架构分析

Struts1的架构图:
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的架构图:
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的。


http://chatgpt.dhexx.cn/article/2JWt7lpL.shtml

相关文章

Struts1.x使用入门

Struts1框架是apache公司的开源子项目,是基于mvc逻辑分层的web层框架实现。是出现最早的web层框架,应用最广发。Struts1框架重点关注的是控制层,对于视图层只是提供了大量的标签;对于model层的影响微乎其微。 本文也是本人初学st…

Struts1的路径映射详解

首先介绍下struts1种xml配置的相关概念: • Action 的path: ActionServlet 根据该属性来转发用户的请求,即将用户请求转发与之同名的Action 。同名的意思是:将请求的.do 后缀去掉,匹配Action 的path属性值。 • Action 的name: 此处的name 属…

Struts1框架轻易入门,经典示例

Struts1框架轻易入门,经典示例 版权申明:此文为作者原创,未经允许,请勿转载! Struts工作原理及流程登录验证示例 Struts1 工作原理及流程 这是本人整理的一点材料,原理图为纯手工绘制,不喜勿喷&…

struts1框架基本(笔记)

在阿帕奇官网下载合适的struts1框架文件。 应用在显示层框架。 struts1与struts2虽然是一脉相承,但它们用法完全不一样。 struts2是在struts1与webwork基础上,发展的全新框架。 注:本文是在MyEclipse下进行的操作,不是之前的E…

Struts1介绍

struts:[strʌts]支柱; 撑杆; 支杆; 支撑; 趾高气扬的步态; 高视阔步的样子; 引入struts Model1结构如图1所示: Model1是一个以JSP文件为中心的模式,在这种模式中JSP页面不仅负责表现逻辑,也负责控制逻辑。专业书籍上称之为逻辑…

入门Struts1第一讲——Struts1入门就这么简单

现在终于进入框架的学习中了,后面还有好几个框架等待着我们呢!我们先来学习Struts1框架,然后再过渡到Struts2框架的学习中。下面我们开始学习Struts1框架之旅。 Struts1简介 Struts1是Apache开发的一个web层的框架,它主要用于简…

连接微软云的几种方式

1,通过管理portal连接微软云 需要使用liveId 2,通过visual web developer 直接更新 需要.cer(509)证书 3.通过远程登录管理 需要XXXXX-Staging-WebRole1_IN_0.rdp文件 PowerShell 需要管理证书

使用微软的OneDrive给别人分享大文件,非常方便

假设我想把这个40多MB的文件分享给一位同事: 在右键菜单里选share: 指定我要分享给谁? 假设我分享给这位姓丁的同事,OK了: 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

谷歌云盘文件快速下载方法

最近看的论文附带的数据集在谷歌云盘里,每个文件都有十个G左右的大小,而直接从谷歌云盘下载速度过慢而且有可能中断,而multcloud是一个非常好的多云盘管理软件。他可以通过国内网直接登录操作,我们可以通过multcloud将谷歌云盘的文…

Win10安装OneDrive(微软云盘)后无法打开

https://jingyan.baidu.com/article/ce4366496a3ae73773afd3f8.html 这里为Win10系统正常下载OneDrive安装包安装成功后,打开或闪退或没反应的情况 工具/原料 OneDrive(微软网盘) Win10系统 方法/步骤 按住键盘上的Win(就是左下…

开源网盘系统推荐 - 开源云盘 - 安装及开发教程

开源网盘系统推荐 - 开源云盘 - 安装及开发教程 云盘界面 介绍 本开源云盘致力于打造成一个优雅,好用,高效,克制的开源云盘。 在线体验 (账号demo/123456) 软件架构 本开源云盘采用前后端分离的模式开发。后端使用Golang语言,前…

onedrive php 上传文件,使用Aria2自动上传文件到onedrive教程

1、先在onedrive中建立一个upload文件夹来统一接收上传 2、然后开始建个环境 宝塔 或lnmp都可以,nginxphp(数据库用不到,装不装无所谓) 3、建立两个站点dl.example.com(下载用) pan.example.com(网盘用) 4、安装aria2,这里推荐逗比大佬的一键…

说说云盘背后的黑科技!

2019独角兽企业重金招聘Python工程师标准>>> ***当下,随着存储技术的飞速发展,各大公司都推出了云存储服务。但因为是免费面向大众的,无论微软的OneDrive还是百度的云网盘,好多人都难理解他们如何支撑起如此庞大的存储…

微软云 命令重启mysql_创建运行 MySQL 的经典 Azure VM - Azure Virtual Machines | Microsoft Docs...

在使用经典部署模型创建的运行 Windows Server 2016 的虚拟机上安装 MySQL 01/23/2017 本文内容 重要 经典 VM 将于 2023 年 3 月 1 日停用。 如果从 ASM 使用 IaaS 资源,请在 2023 年 3 月 1 日之前完成迁移。 我们建议你尽快进行切换,以利用 Azure 资源…

清除此计算机中wps云盘,教大家Win10系统删除WPS网盘的方法,爱纯净官网

Win10系统如何删除WPS网盘?现在使用Win10系统的朋友越来越多了,在Win10系统中如果安装了WPS办公软件,那么在电脑文件中就会看到一个名为WPS的网盘名称。有些用户想要将其卸载,那Win10怎么删除WPS网盘呢?所以接下来小编…

普通用户申请微软的OneDrive免费网盘,容量5T、5T、5T,重要事情说三遍!!!!!

注意:以下网站由于都懂得的原因打开速度较慢(此问题可以通过添加代理方式解决) 第一步 打开如下网址:https://t.odmail.cn/界面如下 该网址是一个临时邮箱接收地址(后面用来接收验证码)。 可以点击1处刷新系统自动生…

加速微软云服务在中国大陆的连接体验

由于种种原因,很多朋友在国内无法顺畅访问微软云服务(包括登录Outlook邮箱、OneNote笔记、OneDrive网盘、Xbox在线游戏等等)。对于那些了解计算机的朋友,可能会使用一些“魔法”来加速访问,但在境内使用未经登记的“魔…

微软云服务器登录不上去,云服务器登入不了怎么重启

云服务器登入不了怎么重启 内容精选 换一换 本节操作介绍Linux操作系统云服务器在单用户模式下重置密码的操作步骤。本文档适用于X86架构的弹性云服务器。进入单用户模式下重置root密码前请先做好数据备份。请根据操作系统类型选择操作步骤:CentOS 8系列CentOS 7/Eu…

微软OneDrive云盘5T大容量免费申请

博主分享一个亲测有效的OneDrive获取5T的方法, OneDrive云盘在国内的下载速度还是相当可以的,5T的大空间相信也能满足绝大部分人,教育版的子账号还是很稳的,欢迎上车,但是本人不提供任何技术支持,有需要还是…

最新免费申请微软OneDrive5TB云盘超详细教程!(已亲测!)

https://www.cnblogs.com/wangyunfei/p/9836580.html 18年10月份最新免费申请微软OneDrive5TB云盘超详细教程!(已亲测!) 本人已于今天10月23日亲测,成功获取微软OneDrive5T云盘! 第一步:.打开…