Struts2与Struts的区别

从Struts2的发展过程来看,Struts2继承了Struts与WebWork的血脉,Struts2取两者之精华,形成新德框架,但是struts2还是更多的继承了struts的设计思想,并加入了WebWork的优点。在了解Struts2体系之前,让我们先看看struts2对struts做了哪些修改。

Struts2与struts的不同主要体现在以下几个方面。

(1)  Action类

1》在struts中都是使用抽象类编程而不是接口,因此他要求开发Action类继承一个抽象的基类,如DispatchAction等。

2》Struts2则基于接口编程,我们的Action类可以实现一个Action接口,使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去实现常用的接口。更加强大的是,在struts2中Action接口不是必需的,任何有execute()函数的pojo对象都可以用作struts2的Action类来使用。

(2)  线程模式

1》       struts的Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单列策略限制了struts Action能做的事,并且要在开发时特别小心,Action资源必须是线程安全的或同步的;

2》       struts2的Action对象为每一个请求产生一个实例,因此没有线程安全问题。

(3)  Servlet依赖

1》       struts的Action依赖于Servlet API,当一个Action被调用时,HttpServletRequest和HttpServletResponse被传递给执行方法,例如:

publicActionForward execute(Actionmapping mapping,ActionForm Form,HttpServletRequestrequest,HttpServletResponse response){

}

2》       struts2的Action不依赖与容器,允许Action脱离容器单独被测试。如果需要,Struts2的Action任然可以访问初始的request和response。例如下面的这个类MyAction.Java,他可以通过ActionContext对象取得Session值,也可以通过ServletActionContext对象取得request对象。

Publicclass MyAction{

protected Object getSession(String key){

return ActionContext.getContext().getSession(key);

}

protectedHttpServletRequest getRequest(){

return(String)ServletActionContext.getRequest();

}

}

(4)  可测试性

1》       测试Struts Action的一个主要问题是,execute()方法暴露了Servlet API,这使得测试要依赖于容器。虽然有第三方的软件struts TestCase能够使用模拟对象来进行测试,但显然会让我们的测试变得更加复杂。

2》       Struts2 Action的类是POJO对象,因此可以直接编写测试类来测试Action类,只需要在测试类中注入属性即可。

(5)  捕获输入

1》       struts使用ActionForm对象捕获用户输入,所有的ActionForm必须继承一个基类ActionForm。因为其他的JavaBean不能用作ActionForm,开发者经常创建多余的类捕获输入。动态表单可以作为创建传统ActionForm的选择,但是,开发者可能是再创建已经存在的JavaBean,仍然会导致有冗余的JavaBean;

2》       struts2直接使用Action属性作为输入属性,消除对第二个输入对象的需求。输入属性可能是有自己子属性的rich对象类型。Action属性能够通过Web页面的taglibs访问。同时,struts2也支持ActionForm模式。

(6)  表达式语言

1》       struts整合了JSTL,这种EL有基本对象图遍历,但是对集合和索引属性的支持很弱

2》       struts2可以使用JSTL,但是也支持一个更强大和灵活的表达式语言OGNL

(7)  绑定值到页面

1》       struts使用标准jsp机制把对象绑定到页面中来访问

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

(8)  类型转换

1》       struts的ActionForm属性通常都是String类型,并不使用 Commons-Beanutils进行类型转换。每个类提供一个转换器,对每个实例来说是不可配置的;

2》       struts2使用OGNL进行OGNL进行类型转换,提供了基本和常用对象转换器。

(9)  数据校验

1》       struts支持在ActionForm的Validate方法中手动校验,或者通过Commons Validator来扩展校验。同一个类可以有不同的校验内容,但不能校验子对象;

2》       struts2支持通过validata()方法和XWork校验框架来进行校验,XWork校验框架使用为属性类型定义的校验和内容校验,来支持chain校验子属性。

(10) Action执行的控制

1》       struts支持每一个模块有单独的Request Processors(生命周期),但是模块中的所有Action必须提供相同的生命周期;

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

Struts2与Struts的区别的更多相关文章

  1. Struts1与Struts2的12点区别

    Struts1与Struts2的12点区别  1) 在Action实现类方面的对比:Struts 1要求Action类继承一个抽象基类:Struts 1的一个具体问题是使用抽象类编程而不是接口.Str ...

  2. 面试中问到SpringMVC与struts的区别

    1.先简单的介绍一下SpringMVC 废话不多说,其实SpringMVC就是一个MVC的框架,SpringMVC它的annotation式的开发比struts 开发的方便很多,可以直接代替strut ...

  3. JSF和Struts的区别概述

    JSF和Struts的区别概述,都采用taglib来处理表示层:在jsp页面中,二者都是采用一套标记库来处理页面的表示和model层的交互. 据说JSF的主要负责人就是struts的主要作者,所以二者 ...

  4. Struts2和SpringMVC的区别

    简单谈一下Struts2和SpringMVC的区别,文章有所引用知乎所对应的答案数据,和所查看的其余资料数据,进行一个简单的汇总,后续查看时使用: 知乎解释链接为:https://www.zhihu. ...

  5. JavaWeb_(Struts2框架)struts.xml核心配置、动态方法调用、结果集的处理

    此系列博文基于同一个项目已上传至github 传送门 JavaWeb_(Struts2框架)Struts创建Action的三种方式 传送门 JavaWeb_(Struts2框架)struts.xml核 ...

  6. JavaWeb_(Struts2框架)Struts创建Action的三种方式

    此系列博文基于同一个项目已上传至github 传送门 JavaWeb_(Struts2框架)Struts创建Action的三种方式 传送门 JavaWeb_(Struts2框架)struts.xml核 ...

  7. Struts2之初识篇(一)——与struts的区别和基本配置

    Struts2资源下载地址: Struts官方地址:http://struts.apache.org/ 我这里下载了struts2的最新版本struts2-2.5.10.1-all.所有内容如下图: ...

  8. struts2:struts.xml配置文件详解

    1. 几个重要的元素 1.1 package元素 package元素用来配置包.在Struts2框架中,包是一个独立的单位,通过name属性来唯一标识包.还可以通过extends属性让一个包继承另一个 ...

  9. struts2中struts.xml配置文件详解

    struts.xml的常用配置 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts ...

随机推荐

  1. 隐藏自定义tabbar(关于tabbar的hide属性对于自定义无效)

    背景: 最近在做一个项目中 需要在tabbar中的一个子控制器中隐藏tabbar. 我是tabbar我是自定义的XIB 视图addsubview到tabbar上. 首先po 一个在网上查到的解决方法: ...

  2. java多线程执行问题

    class Demo extends Thread{ public Demo(String name){ super(name); } public void run(){ for(int i=0; ...

  3. svn 合并分支代码到主干

    1. eclipse 安装subclipse 2. 将主干trunk导入到eclipse中 3. 右键选择team-->合并,注意,去掉红色圈内的选项 4. next 选中select查找svn ...

  4. 如何调试PHP程序

    一.PHP自带的调试功能 1.修改php.ini )开发环境 需要打开报错输出显示,方便开发者调试. display_errors = On )生产环境 不能直接将错误输出,而是记入日志,以免透露路径 ...

  5. 加速Web开发的9款知名HTML5框架

    与手工编码比起来,HTML5框架在准确性和正确率方面给予了保证.大多数HTML5框架都会有一个组合或者包含一些额外的组件,比如jQuery Scripts.CSS3样式表则以改善多媒体特征的功能性和响 ...

  6. C#深入.NET平台的软件系统分层开发

    今天我们来讲讲分层开发,你从标题能不能简单的认识一下什么是分层呢? 不懂也没关系,接下来我来给你讲讲. 第一章 软件系统的分层开发 (1)其实分层模式可以这样定义:将解决方案中功能不同的模块分到不同的 ...

  7. 读卡器的Win32 Dll调用

    unsafe class Program { [DllImport("mwhrf_bj.dll")] public static extern int rf_card(int ic ...

  8. Web API配置自定义路由

    默认访问Web API时,是无需指定method名.它会按照默认的路由来访问.如果你的Web API中出现有方法重载时,也许得配置自定义路由: 标记1为自定义路由,标记2为默认路由,需要把自定义路由排 ...

  9. C# 汉字转拼音(支持GB2312字符集中所有汉字)

    GB2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个. 分区表示  GB 2312中对所收汉字进行了“分区”处理,每区含有94个汉字/符号.这种表示方式也称为区位码. )- ...

  10. 【SQL】统计所有表的行数

    环境:mssql ent 2k8 r2 原理:遍历所有用户表,用sp_spaceused过程分别获取每张表的行数并写入临时表,最后返回临时表 IF OBJECT_ID('tempdb..#TableR ...