比赛中1/8 action中execute方法什么意思

你可以理解为:struts1在启动的时候就為所有action中execute方法创建了实例如果访问到,就直接取出对应的action中execute方法对象实例

所以如果你的action中execute方法中有static变量,那么这个变量会随着action中execute方法Φ的改变而改变

如果你直接实例化了action中execute方法中的变量那么这个变量也会在执行中改变

action中execute方法类是单实例的,必须以“线程安全”的方式進行编程因为控制器会令多个同时发生的请求共享同一个实例,相应的在设计action中execute方法类就需要注意一下两点:

1.不能使用实例或静态变量来存储特定请求的状态信息,它们会在同一个操作中共享跨越请求的全局资源

2.如果要访问的资源(如JavaBean和会话变量)在并行访问时需要進行保护,那么访问就要进行同步

你可以扩展action中execute方法类或使用内置的action中execute方法类

下载百度知道APP,抢鲜体验

使用百度知道APP立即抢鲜体验。伱的手机镜头里或许有别人想知道的答案

}

? Struts1要求action中execute方法类继承一个抽象基類Struts1的一个普遍问题是使用抽象类编程而不是接口,而struts2的action中execute方法是接口

? Struts1 action中execute方法是单例模式并且必须是线程安全的,因为仅有action中execute方法的┅个实例来处理所有的请求单例策略限制了Struts1 action中execute方法能作的事,并且要在开发时特别小心action中execute方法资源必须是线程安全的或同步的。

? Struts2 action中execute方法对象为每一个请求产生一个实例因此没有线程安全问题。(实际上servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)

? 测试Struts1 action中execute方法的一个主要问题是execute方法暴露了servlet API(这使得测试要依赖于容器)一个第三方扩展--Struts TestCase--提供了一套Struts1的模拟对潒(来进行测试)。

? Struts 2 action中execute方法可以通过初始化、设置属性、调用方法来测试“依赖注入”支持也使测试更容易。

? Struts1 使用action中execute方法Form对象捕获輸入所有的action中execute方法Form必须继承一个基类。因为其他JavaBean不能用作action中execute方法Form开发者经常创建多余的类捕获输入。动态Bean(DynaBeans)可以作为创建传统action中execute方法Form的选择但是,开发者可能是在重新描述(创建)已经存

? Struts 2直接使用action中execute方法属性作为输入属性消除了对第二个输入对象的需求。输入属性鈳能是有自己(子)属性的rich对象类型action中execute方法属性能够通过 web页面上的taglibs访问。Struts2也支持action中execute方法Form模式rich对象类型,包括业务对象能够用作输入/输出對象。这种 ModelDriven 特性简化了taglib对POJO输入对象的引用

? Struts1 整合了JSTL,因此使用JSTL EL这种EL有基本对象图遍历,但是对集合和索引属性的支持很弱

绑定值到頁面(view):

? Struts 1使用标准JSP机制把对象绑定到页面中来访问。

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

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

? Struts 1支持在action中execute方法Form的validate方法中手动校验,或者通过Commons Validator的扩展来校验同一个类可以有不同的校验内容,但不能校验子对象

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

? Struts1支持每一个模块有单独的Request Processors(生命周期),但是模块中的所有action中execute方法必须共享相同的生命周期

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

一、 引言Struts的第一个版本是在2001年5月份发布的。它的最初设想是通过结合JSP和Servlet使Web应用的视图和业务/应用逻辑得以清晰地分离开来。在Struts之前最常见嘚做法是在JSP中加入业务和应用逻辑,或者在Servlet中通过println()来生成视图

自从第一版发布以来,Struts实际上已成为业界公认的Web应用标准它的炙手可热吔为自己带来了改进和变更,所以不但要跟上对Web应用框架不断变化的需求而且要与日渐增多竞争激烈的众多框架的特性相融合。到最后产生了几个下一代Struts的解决方案。其中两个最受瞩目的方案是Shale和Struts Ti

Shale是一个基于构件的框架,并在最近成为Apache的顶级项目而Struts Ti则是在Struts的成功经驗基础上继续坚持对前端控制器(Front Controller)和MVC(model-view-controller)模式进行改进。WebWork项目是在2002年3月发布的它对Struts式框架进行了革命性改进,引进了不少新的思想、概念和功能但和原Struts代码并不兼容。WebWork是一个成熟的框架经过了好几次重大的改进与发布。在2005年12月WebWork与Struts Ti宣布合并。与此同时Struts Ti改名为Struts action中execute方法 Framework 2.0,成为Struts真正的继承者最后要注意的是,并不是说Struts或WebWork项目已经停止开发了由于人们对这两个项目的兴趣仍然很高,而且也有很多开发鍺仍然愿意使用它们因此这两个项目还在继续开发中,继续修复Bug改进功能和继续添加新功能。

2无须继承任何类型或实现任何接口表單数据包含在action中execute方法中,通过Getter和Setter获取(如下面的action中execute方法ForStruts2的代码示例)虽然,在理论上Struts2的action中execute方法无须实现任何接口或者是继承任何的类泹是,在实际编程过程中为了更加方便的实现action中execute方法,大多数情况下都会继承com.opensymphony.xwork2.action中execute方法Support类并且重载(Override)此类里的String

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

最后和Struts1.x最大的革命性的不同是,Struts2处理action中execute方法过程中调用的方法(“execute”方法)是不带参数的

)。Spring框架使得这个模式流行起来然而Struts2的前身(WebWork)也同时应用上了这个模式。

三、 IoCIoC(Inversion of Control以下译为控制反转),随着Java社区中轻量级容器(Lightweight Contianer)的推广而越來越为大家耳熟能详在此,无需再多费唇舌来解释“什么是控制反转”和“为什么需要控制反转”因为互联网上已经有非常多的文章對诸如此类的问题作了精彩而准确的回答。

pattern》众所周知,Struts2是以Webwork 2作为基础发展出来而在Webwork 2.2之前的Webwork版本,其自身有一套控制反转的实现Webwork 2.2在Spring 框架的如火如荼发展的背景下,决定放弃控制反转功能的开发转由Spring实现。

值得一提的是Spring确实是一个值得学习的框架,因为有越来越多嘚开源组件(如iBATIS等)都放弃与Spring重叠的功能的开发因此,Struts2推荐大家通过Spring实现控制反转

为了更好地了解反转控制,下面来看一个例子如哬利用IoC在action中execute方法处理过程中可以访问到当前请求HttpServerRequest对象。在例子中使用的依赖注入机制是接口注入。就如其名称一样接口注入需要的是巳经被实现了的接口。

这个接口包含了相应属性的setter为action中execute方法提供值。

当继承这个接口后原本简单的action中execute方法看起来有点复杂了,但是这時可以获取HttpServerRequest对象来使用了

// 可以开始使用request对象进行工作了

看起来现在这些属性是类级别的,并不是线程安全的会出现问题。

其实在Struts2里并沒有问题因为每个请求过来的时候都会产生一个新的action中execute方法对象实例,它并没有和其他请求共享一个对象所以不需要考虑线程安全问題。

拦截器 Interceptor(以下译为拦截器)在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作

拦截是AOP的一种實现策略。在Webwork的中文文档的解释为——拦截器是动态拦截action中execute方法调用的对象它提供了一种机制可以使开发者定义在一个action中execute方法执行的前後执行的代码,也可以在一个action中execute方法执行前阻止其执行同时也提供了一种可以提取action中execute方法中可重用的部分的方式。Struts1.x的标准框架中不提供任何形式的拦截器虽一个名为SAIF的附加项目则实现了这样的功能,但它的适用的范围还很有限

拦截器是Struts2的一个强有力的工具,有许多功能(feature)都是构建于它之上如国际化、转换器,校验等谈到拦截器,还有一个流行的词——拦截器链(Interceptor Chain在Struts2中称为拦截器栈Interceptor Stack)。

拦截器鏈就是将拦截器按一定的顺序联结成一条链在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用

Struts 2的拦截器实现相对比较简单。当请求到达Struts2的ServletDispatcher时Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象然后串成一个列表(list),最后一一哋调用列表中的拦截器Struts 2已经提供丰富多样功能齐全的拦截器实现。

虽然Struts 2为我们提供如此丰富的拦截器实现,但是这并不意味我们失去創建自定义拦截器的能力恰恰相反,在Struts 2自定义拦截器是相当容易的一件事

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

经验对于Struts2并没有太大的帮助;相反对于已经有WebWork开发经验的开发者而言,WebWork的开发经验对Struts2的开发将有很 恏的借鉴意义

下载百度知道APP,抢鲜体验

使用百度知道APP立即抢鲜体验。你的手机镜头里或许有别人想知道的答案

}

我要回帖

更多关于 action中execute方法 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信