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的更多相关文章

  1. jsp\struts1.2\struts2 中文件上传(转)

    jsp\struts1.2\struts2 中文件上传 a.在jsp中简单利用Commons-fileupload组件实现 b.在struts1.2中实现c.在sturts2中实现现在把Code与大家 ...

  2. Struts1与Struts2的12点区别

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

  3. 浅析Struts1和Struts2的Action线程安全问题 转

    浅析Struts1和Struts2的Action线程安全问题  转 http://blog.csdn.net/virgoboy2004/article/details/5876133 [问题描述]最近 ...

  4. Struts1和Struts2的区别和对比(完整版)

    Struts2其实并不是一个陌生的Web框架,Struts2是以Webwork的设计思想为核心,吸收了Struts1的优点,因此,可以认为Struts2是Struts1和Webwork结合的产物. 简 ...

  5. Struts1、Struts2和SpringMVC剖析【转载】

    前段框架用了不少,今天就来做个总结.网上关于Struts1.Struts2.SpringMVC的文章有很多,这里的内容就是基于它们,来做个比较. 这三个框架是按照上面的顺序,依次出现的,它们都是对MV ...

  6. Struts2五、Struts1与Struts2的区别

    Struts1和Struts2的区别和对比: Action 类:  • Struts1要求Action类继承一个抽象基类.Struts1的一个普遍问题是使用抽象类编程而不是接口,而struts2的Ac ...

  7. Struts1和Struts2对照

    最近学习Struts1和Struts2.好多人.提到非常多的信息. Struts2不从Struts1进化. Struts2的前身WebWork. 呢,看了一些资料,下边就来比較比較. 一.架构分析 S ...

  8. Struts1和Struts2的区别和对比

    Struts1和Struts2的区别和对比: Action 类: • Struts1要求Action类继承一个抽象基类.Struts1的一个普遍问题是使用抽象类编程而不是接口. • Struts 2  ...

  9. struts1和struts2和springMVC的区别和介绍

    MVC是web开发常用的模式,M即模型层(Model):主要由javabean来实现.V即视图层(View):主要由jsp.velocity.freemarker等.C即控制层(Controller) ...

  10. Struts1与Struts2的那些事

    一.概述 Struts1以ActionServlet作为核心控制器,由ActionServlet负责拦截用户的全部请求.Struts1框架有3个重要组成部分:Action.ActionForm和Act ...

随机推荐

  1. idea 推送jar包到maven私库

    1.推送到本地仓库 idea直接install即可 2.推送到公司私库 2.1 使用配置公司仓库地址的setting文件 <?xml version="1.0" encodi ...

  2. 匹配对象方法:group() 与 groups()

    当在处理正则表达式的时候,除了正则表达式对象之外,还有另一个对象类型:匹配对象,即是成功调用match()或者search()所返回的对象. 匹配对象有两个主要方法:group() 和 groups( ...

  3. OMG,12 个精致的 Java 字符串操作小技巧,学它

    字符串可以说是 Java 中最具有代表性的类了,似乎没有之一哈,这就好像直播界的李佳琪,脱口秀中的李诞,一等一的大哥地位.不得不承认,最近吐槽大会刷多了,脑子里全是那些段子,写文章都有点不由自主,真的 ...

  4. 关于函数式接口, printable 自定义

    这段代码在jdk1.8可以使用,  由于我是jdk14, 会报错. 这里可以优化, lambda表达式进一步优化写为:  printString(System.Out::println); 注意案例版 ...

  5. 面试官:谈一下你对DDD的理解?我:马什么梅?

    领域模型(domain model)是对领域内的概念类或现实世界中对象的可视化表示.领域模型也称为概念模型.领域对象模型和分析对象模型. ——<UML和模式应用> 我们在日常开发中,经常针 ...

  6. Less 预处理笔记

    1. less 简介 1. less是CSS的预编译器,可以扩展CSS语言(当然也兼容CSS),可以定义变量.混合.函数等等,让CSS代码更易维护和扩展 2. less与传统写法相比: less后缀为 ...

  7. 【Android】Android开发初学者实现拨打电话的功能,拨打电话app小demo实现

    作者:程序员小冰,GitHub主页:https://github.com/QQ986945193 新浪微博:http://weibo.com/mcxiaobing 首先先给大家看一下最终实现的效果: ...

  8. Pytest-allure 生成美观好看的测试报告

    在我们使用pytest-allure生成测试报告时,需要分为以下几步来执行 1.pytest TestCal.py --alluredir=/tmp/my_allure_results[这一步,是设置 ...

  9. 【转】Mac下Eclipse快捷键

    http://blog.sina.com.cn/s/blog_677089db01019jgh.html Command + O:显示大纲Command + 1:快速修复Command + D:删除当 ...

  10. 原生JDK网络编程BIO

    服务端提供IP和监听端口,客户端通过连接操作想服务端监听的地址发起连接请求,通过三次握手连接,如果连接成功建立,双方就可以通过套接字进行通信. 传统的同步阻塞模型开发中,ServerSocket负责绑 ...