Struts1 和 Struts2

article/2025/11/5 19:23:54

关于Struts2的出现缘由和好处就不多说啦,看了几篇总结的不错的文章,整理下贴出来,共同学习了。

Action的区别

对于有着丰富的Struts1.x开发经验的朋友来说,都十分的清楚Action是整个Struts框架的核心内容,当然Struts2也不例外。不过,Struts1.xStruts2Action模型很大的区别。

Struts2Struts1.x的差别,最明显的就是Struts2是一个pull-MVC架构。这是什么意思呢?从开发者角度看,就是说需要显示给用户的数据可以直接从Action中获取,而不像Struts1.x那样,必须把相应的Bean存到PageRequest或者Session中才能获取。Struts1.x必须继承org.apache.struts.action.Action或者其子类,表单数据封装在FormBean中。Struts2无须继承任何类型或实现任何接口,表单数据包含在Action中,通过GetterSetter获取(如下面的ActionForStruts2的代码示例)。

虽然,在理论上Struts2Action无须实现任何接口或者是继承任何的类,但是,在实际编程过程中,为了更加方便的实现Action,大多数情况下都会继承com.opensymphony.xwork2.ActionSupport类,并且重载(Override)此类里的Stringexecute()方法。如下所示:

package ActionDiffer;import java.text.DateFormat;import java.util.Date;import com.opensymphony.xwork2.ActionSupport;public class ActionForStruts2 extends ActionSupport {private String message;public String getMessage() {return message;}@Overridepublic String execute() {message = " This is hello from strtuts2. Now is: " + DateFormat.getInstance().format( new Date());return SUCCESS;}
}

首先,从ActionForStruts2可以看出,返回的对象不是ActionForward,而是String。如果你不喜欢以字符串的形式出现在你的代码中,有个Helper接口Action可以以常量方式提供常见结果,如“success”、“none”、“error”、“input”和“login”。

另外,按照惯例,在Struts1.x中只有“execute”方法能调用Action, 但在Struts2中并非必要,任何声明为publicString methodName() 方法,都能通过配置来调用Action

最后,和Struts1.x最大的革命性的不同是,Struts2处理Action过程中调用的方法(“execute”方法)是不带参数的。那如何获取所需要的对象呢?答案是使用IoCSpring框架使得这个模式流行起来,然而Struts2的前身(WebWork)也同时应用上了这个模式。

关于Action补充文章:Struts 2.0Action讲解

IOC(不了解这个可以去看我前面的文章)

众所周知,Struts2是以Webwork2作为基础发展出来。而在Webwork2.2之前的Webwork版本,其自身有一套控制反转的实现,Webwork2.2Spring框架的如火如荼发展的背景下,决定放弃控制反转功能的开发,转由Spring实现。值得一提的是,Spring确实是一个值得学习的框架,因为有越来越多的开源组件(如iBATIS等)都放弃与Spring重叠的功能的开发。因此,Struts2推荐大家通过Spring实现控制反转。

为了更好地了解反转控制,下面来看一个例子,如何利用IoCAction处理过程中可以访问到当前请求HttpServerRequest对象。

在例子中,使用的依赖注入机制是接口注入。就如其名称一样,接口注入需要的是已经被实现了的接口。这个接口包含了相应属性的setter,为Action提供值。例子中使用了ServletRequestAware接口,如下:

public interface ServletRequestAware {public void setServletRequest(HttpServletRequest request);
}

当继承这个接口后,原本简单的Action看起来有点复杂了,但是这时可以获取HttpServerRequest对象来使用了。

public class IoCForStruts2 implements ServletRequestAware {private HttpServletRequest request;public void setServletRequest(HttpServletRequest request) {this.request = request;}public String execute() throws Exception {// 可以开始使用request对象进行工作了return Action.SUCCESS;}
}

看起来现在这些属性是类级别的,并不是线程安全的,会出现问题。其实在Struts2里并没有问题,因为每个请求过来的时候都会产生一个新的Action对象实例,它并没有和其他请求共享一个对象,所以不需要考虑线程安全问题。

关于IOC补充内容:Struts 2中实现IoC

拦截器

Interceptor(以下译为拦截器),在AOPAspect-OrientedProgramming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。

Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也提供了一种可以提取action中可重用的部分的方式。

Struts1.x的标准框架中不提供任何形式的拦截器,虽一个名为SAIF的附加项目则实现了这样的功能,但它的适用的范围还很有限。

拦截器是Struts2的一个强有力的工具,有许多功能(feature)都是构建于它之上,如国际化、转换器,校验等。谈到拦截器,还有一个流行的词——拦截器链(InterceptorChain,在Struts2中称为拦截器栈InterceptorStack)。拦截器链就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。

Struts2的拦截器实现相对比较简单。当请求到达Struts2ServletDispatcher时,Struts2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表(list),最后一一地调用列表中的拦截器,如图1所示:


Struts2已经提供丰富多样功能齐全的拦截器实现。读者可以到struts2-all-2.0.6.jarstruts2-core-2.0.6.jar包的struts-default.xml查看关于默认的拦截器与拦截器链的配置。

作为“框架(framework)”,可扩展性是不可缺少的,因为世上没有放之四海而皆准的东西。虽然,Struts2为我们提供如此丰富的拦截器实现,但是这并不意味我们失去创建自定义拦截器的能力,恰恰相反,在Struts2自定义拦截器是相当容易的一件事。

关于拦截器补充内容:Struts 2的基石——拦截器(Interceptor

Struts2Struts1.x的全面比较

为了对Struts2Strtus1.x进行全面的比较,让读者了解这两种框架各自的优缺点,以便于在自己的项目中,根据实际情况,选择合适的框架,对它们两者进行比较,总结了如下表分析比较。

特性

Struts1.x

Struts2

Action

Struts1.x要求Action类要扩展自一个抽象基类。Struts1.x的一个共有的问题是面向抽象类编程而不是面向接口编程。

Struts2Action类实现了一个Action接口,连同其他接口一起来实现可选择和自定义的服务。Struts2提供一个名叫ActionSupport的基类来实现一般使用的接口。当然,Action接口不是必须的。任何使用execute方法的POJO对象可以被当作Struts 2Action对象来使用。

线程模型

Struts1.x Action类是单例类,因为只有一个实例来控制所有的请求。单例类策略造成了一定的限制,并且给开发带来了额外的烦恼。Action资源必须是线程安全或者同步的。

Struts2 Action对象为每一个请求都实例化对象,所以没有线程安全的问题。(实践中,servlet容器给每一个请求产生许多丟弃的对象,并且不会导致性能和垃圾回收问题)。

Servlet依赖

Struts1.xAction类依赖于servlet API,当Action被调用时,以HttpServletRequestHttpServletResponse作为参数传给execute方法。

Struts2Action和容器无关。Servlet上下文被表现为简单的Maps,允许Action被独立的测试。Struts2Action可以访问最初的请求(如果需要的话)。但是,尽可能避免或排除其他元素直接访问HttpServletRequestHttpServletResponse

易测性

测试Struts1.x的主要问题是execute方法暴露了Servlet API这使得测试要依赖于容器)。第三方的扩展,如Struts TestCase,提供了一套Struts1的模拟对象(来进行测试)。

Struts2Action可以通过初始化、设置属性、调用方法来测试。依赖注入的支持也是测试变得更简单。

捕获输入

Struts1.x使用ActionForm对象来捕获输入。象Action一样,所有的ActionForm必须扩展基类。因为其他的JavaBean不能作为ActionForm使用,开发者经常创建多余的类来捕获输入。DynaBeans可以被用来作为替代ActionForm的类来创建。但是,开发者可能是在重新描述(创建)已经存在的JavaBean(仍然会导致有冗余的javabean)。

Struts2直接使用Action属性作为输入属性,消除了对第二个输入对象的需求。输入属性可能是有自己()属性的rich对象类型。Action属性能够通过web页面上的taglibs访问。Struts2也支持ActionForm模式。rich对象类型,包括业务对象,能够用作输入/输出对象。这种ModelDriven特性简化了taglibPOJO输入对象的引用。

表达式语言

Struts1.x整合JSTL,所以它使用JSTL的表达式语言。表达式语言有基本的图形对象移动,但是对集合和索引属性的支持很弱。

Struts2使用JSTL,但是也支持一个更强大和灵活的表达式语言--"Object Graph Notation Language" (OGNL)

将值绑定到页面

Struts1.x使用标准JSP机制来绑定对象到页面上下文。

Struts2使用“ValueStack”技术,使taglib能够访问值而不需要把你的页面(view)和对象绑定起来。ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面(view)。

类型转换

Struts1.xActionForm属性经常都是StringStruts 1.x使用Commons-Beanutils来进行类型转换。转换每一个类,而不是为每一个实例配置。

Struts2使用OGNL进行类型转换。提供基本和常用对象的转换器。

验证

Struts1.x支持在ActionFormvalidate方法中手动校验,或者通过Commons Validator的扩展来校验。同一个类可以有不同的校验内容,但不能校验子对象。

Struts2支持通过validate方法和XWork校验框架来进行校验。XWork校验框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性

Action执行控制

Struts1.x支持每一个模块有单独的Request Processors(生命周期),但是模块中的所有Action必须共享相同的生命周期。

Struts2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。

前面已经简要介绍了Struts2的起源,并详细对比了Struts2Struts1.x的差异,读者应该对Struts2的基础有所了解了——包括高层的框架概念和基础的请求流程,并理解Struts1.xStruts2两者之间在Action方面的差别,Struts2加强了对拦截器与IoC的支持,而在Struts1.x中,这些特性是很难想象的。

同时,读者应该明白:Struts2WebWork的升级,而不是Struts1.x的升级。虽然Struts2提供了与Struts1.x的兼容,但已经不是Struts1.x的升级。对于已有Struts1.x开发经验的开发者而言,Struts1.x的开发经验对于Struts2并没有太大的帮助;相反,对于已经有WebWork开发经验的开发者而言,WebWork的开发经验对Struts2的开发将有很好的借鉴意义。

via:http://www.blogjava.net/sterning/archive/2007/07/17/130892.htmld  


http://chatgpt.dhexx.cn/article/ns2im1CG.shtml

相关文章

Struts1的工作流程

Struts1的工作流程图如下所示: 其工作流程如下: 当Web服务器启动的时候,根据web.xml文件加载并初始化ActionServlet,根据配置ActionServlet的config参数信息,确定struts-config.xml配置文件存放的位置,并根…

struts2讲解

Struts2部分 1. JavaEE软件三层结构和MVC的区别? JavaEE软件三层机构是由sun公司提供JavaEE开发规范的:Web层(表现层)、业务逻辑层、数据持久层。【其中WEB层会使用前端控制器模式】 MVC是一种思想,是一种模式,将软件分为 Model…

Struts1和Struts2对比

最近学习了Struts1和Struts2.很多人、很多资料都提到。Struts2不是从Struts1发展而来的。Struts2的前身是WebWork。那它俩到底有多大的不同呢,看了一些资料,下边就来比较比较。 一、架构分析 Struts1的架构图: 执行流程: 1.…

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在线游戏等等)。对于那些了解计算机的朋友,可能会使用一些“魔法”来加速访问,但在境内使用未经登记的“魔…