关于struts1与struts2
1.Action方面
Action是整个Struts框架的核心内容,Struts1.x与Struts2的Action模型很大的区别。Struts2是一个 pull-MVC架构 ,从开发者角度看,就是说需要显示给用户的数据可以直接从Action中获取,而不像 Struts1.x那样,必须把相应的Bean存到Page、Request或者Session中才能获取。Struts1.x 必须继承org.apache.struts.action.Action或者其子类,表单数据封装在FormBean中。在Struts2中,处理业务逻辑的方法(通常是execute方法)返回的对象不是ActionForward,而是String。在Struts1.x中,只有“execute”方法才能处理该Action的业务逻辑, 但在Struts2中并非必要,任何声明为public String methodName() 方法,都能通过配置来调用Action。
Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口,而struts2的Action是接口;
Struts2的Action 可以实现一个Action接口,也可实现其他接口,还可以不实现任何接口,这使得可选和定制的服务成为可能。在Struts2中,它提供了一个ActionSupport基类去实现 常用的接口。注意,Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象。
2.线程模式方面
Struts1的Action是线程安全的单例模式,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事,并且要在开发时特别小心,因为Action使用的资源必须是线程安全的或同步的。
Struts2的Action对象为每一个请求产生一个实例,因此没有线程安全问题。Struts2中的ActionContext为Action的执行提供了环境,而 ActionContext 实质上是一个 ThreadLocal 变量。
3.对servlet的依赖方面
Struts1的Action与Servlet API是紧耦合的。
Struts2的Action 并不依赖于Servlet容器,允许Action脱离容器单独被测试。
4.可测试性方面
测试Struts1的Action的一个主要问题是execute方法暴露了servlet API,这使得测试要依赖于容器。
Struts2的Action可以通过初始化、设置属性、调用方法来测试,“依赖注入”支持也使测试更容易。
5.输入捕获方面
Struts1使用ActionForm对象捕获输入。所有的ActionForm必须继承一个基类,因为其他JavaBean不能用作ActionForm,开发者经常创建多余的类捕获输入。
Struts2直接使用Action属性作为输入属性,消除了对第二个输入对象的需求。
6.表达式语言方面
Struts1 整合了JSTL,因此可以使用JSTL的EL。
Struts2 可以使用JSTL,但是也支持一个更强大和灵活的表达式语言OGNL(Object Graph Notation Language)。
7.绑定值到页面方面
Struts1使用标准JSP机制把对象绑定到页面中来访问;
Struts2 通过ValueStack可以使taglib能够访问值而不需要把你的页面(view)和对象绑定起来。
8.类型转换方面
Struts1的ActionForm属性通常都是String类型,Struts1借助于Apache的Commons-Beanutils进行类型转换。
Struts2使用OGNL进行类型转换,并且提供基本和常用对象的转换器。
9.数据校验方面
Struts1支持在ActionForm的validate方法中手动校验,或者通过Commons Validator的扩展来校验。
Struts2支持通过validate方法和XWork校验框架(拦截器机制)来进行校验。
10.对Action执行的控制方面
Struts1支持每一个模块有单独的Request Processors(生命周期),但是模块中的所有Action必须共享相同的生命周期;
Struts2支持通过拦截器堆栈(InterceptorStacks)为每一个Action创建不同的生命周期。
11.对IOC的应用
Struts2是以Webwork 2作为基础发展出来。而在Webwork 2.2之前的Webwork版本,其自身有一套控制反转的实现,Struts2推荐大家通过Spring实现控制反转。
12.struts2的拦截机制
拦截器(Interceptor) 在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前进行拦截,然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。在Webwork的中文文档的解释为:拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时,也提供了一种可以提取action中可重用的部分的方式。
- Struts1.x的标准框架中不提供任何形式的拦截器,虽然有一个名为SAIF的附加项目则实现了这样的功能,但它的适用的范围还很有限。
- 拦截器是Struts2的一个强有力的工具。Struts2许多的功能(feature)都是构建于它之上,如国际化、类型转换器、数据校验、异常处理等。
关于struts1与struts2的更多相关文章
- jsp\struts1.2\struts2 中文件上传(转)
jsp\struts1.2\struts2 中文件上传 a.在jsp中简单利用Commons-fileupload组件实现 b.在struts1.2中实现c.在sturts2中实现现在把Code与大家 ...
- Struts1与Struts2的12点区别
Struts1与Struts2的12点区别 1) 在Action实现类方面的对比:Struts 1要求Action类继承一个抽象基类:Struts 1的一个具体问题是使用抽象类编程而不是接口.Str ...
- 浅析Struts1和Struts2的Action线程安全问题 转
浅析Struts1和Struts2的Action线程安全问题 转 http://blog.csdn.net/virgoboy2004/article/details/5876133 [问题描述]最近 ...
- Struts1和Struts2的区别和对比(完整版)
Struts2其实并不是一个陌生的Web框架,Struts2是以Webwork的设计思想为核心,吸收了Struts1的优点,因此,可以认为Struts2是Struts1和Webwork结合的产物. 简 ...
- Struts1、Struts2和SpringMVC剖析【转载】
前段框架用了不少,今天就来做个总结.网上关于Struts1.Struts2.SpringMVC的文章有很多,这里的内容就是基于它们,来做个比较. 这三个框架是按照上面的顺序,依次出现的,它们都是对MV ...
- Struts2五、Struts1与Struts2的区别
Struts1和Struts2的区别和对比: Action 类: • Struts1要求Action类继承一个抽象基类.Struts1的一个普遍问题是使用抽象类编程而不是接口,而struts2的Ac ...
- Struts1和Struts2对照
最近学习Struts1和Struts2.好多人.提到非常多的信息. Struts2不从Struts1进化. Struts2的前身WebWork. 呢,看了一些资料,下边就来比較比較. 一.架构分析 S ...
- Struts1和Struts2的区别和对比
Struts1和Struts2的区别和对比: Action 类: • Struts1要求Action类继承一个抽象基类.Struts1的一个普遍问题是使用抽象类编程而不是接口. • Struts 2 ...
- struts1和struts2和springMVC的区别和介绍
MVC是web开发常用的模式,M即模型层(Model):主要由javabean来实现.V即视图层(View):主要由jsp.velocity.freemarker等.C即控制层(Controller) ...
- Struts1与Struts2的那些事
一.概述 Struts1以ActionServlet作为核心控制器,由ActionServlet负责拦截用户的全部请求.Struts1框架有3个重要组成部分:Action.ActionForm和Act ...
随机推荐
- python3 raw 数据转换为jpg
python3 raw 数据转换为jpg 我们大家都知道,sensor 直接出来的裸数据为raw 数据,没有经过编解码,压缩. 我们需要将raw数据转换为其他格式比如jpg,png,bmp 人眼才能看 ...
- python编程入门笔记
一.作用域 在python中,作用域分为两种:全局作用域和局部作用域. 全局作用域是定义在文件级别的变量,函数名.而局部作用域,则是定义函数内部. 关于作用域,我们要理解两点: a.在全局不能访问到局 ...
- 跟我一起学.NetCore之日志作用域及第三方日志框架扩展
前言 上一节对日志的部分核心类型进行简单的剖析,相信现在再使用日志的时候,应该大概知道怎么一回事了,比如记录器是怎么来的,是如何将日志内容写入到不同目的地的等:当然还有很多细节没深入讲解,抽时间小伙伴 ...
- 使用BeetleX在Linux下部署.NET多站点服务
在windows下常用IIS来部署.NET的多站点服务,但在Linux下就没这么方便了:虽然可以使用一些代理服务器如nginx,jexus等来反代或部署应用,但nginx对.NET应用的 ...
- asp image
@Url.Content("~/Content/images/myimage.png") <img src="~/Content/images/myimage.pn ...
- MPI Maelstrom (Dijstra+atoi函数转换整数)
BIT has recently taken delivery of their new supercomputer, a 32 processor Apollo Odyssey distribute ...
- Netty学习笔记-入门版
目录 Netty学习笔记 前言 什么是Netty IO基础 概念说明 IO简单介绍 用户空间与内核空间 进程(Process) 线程(thread) 程序和进程 进程切换 进程阻塞 文件描述符 文件句 ...
- Go语言 | goroutine不只有基础的用法,还有这些你不知道的操作
今天是golang专题第15篇文章,我们来继续聊聊channel的使用. 在我们的上篇文章当中我们简单介绍了golang当中channel的使用方法,channel是golang当中一个非常重要的设计 ...
- 一位北漂12年IT工程师的年终总结
Hi,我叫李振良,来自河南周口农村的一个普通家庭,如今来北京已经12年了,我是那种没有大学背景.没有聪明头脑.没有人脉的奋斗青年,但我又是那种不甘于现状,一直想做最好的那个人! 2019年已悄然离去, ...
- H5简单内容
1.简单认识H5 HTML5不仅仅是作为HTML标记语言的一个最新版本,更重要的是它指定了Web开发的一系列标准,成为第一个将Web作为应用开发平台的HTML语言. 我们日常讨论的H5其实是有一个泛称 ...