Struts1工作原理图:

1、初始化:struts框架的总控制器ActionServlet是一个Servlet,它在web.xml中配置成自动启动的Servlet,在启动时总控制器会读取配置文件(struts-config.xml)的配置信息,为struts中不同的模块初始化相应的对象。(面向对象思想)

2、发送请求:用户提交表单或通过URL向WEB服务器提交请求,请求的数据用HTTP协议传给web服务器。

3、form填充:struts的总控制器ActionServlet在用户提交请求时将数据放到对应的form对象中的成员变量中。

4、派发请求:控制器根据配置信息对象ActionConfig将请求派发到具体的Action,对应的formBean一并传给这个Action中的excute()方法。

5、处理业务:Action一般只包含一个excute()方法,它负责执行相应的业务逻辑(调用其它的业务模块)完毕后返回一个ActionForward对象。服务器通过ActionForward对象进行转发工作。

6、返回响应:Action将业务处理的不同结果返回一个目标响应对象给总控制器。

7、查找响应:总控制器根据Action处理业务返回的目标响应对象,找到对应的资源对象,一般情况下为jsp页面。

8、响应用户:目标响应对象将结果传递给资源对象,将结果展现给用户。

Struts1与struts2有什么不同?

1.Action类 
 Stuts1要求Action类继承一个抽象基类。Struts1的一个普通问题是使用抽象类编程而不是接口。Struts2 Action类可以实现一个Action接口,也可以实现其它接口,使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去实现常用的接口。Action 接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象。

2. 线程模式:Struts1n Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的。 Struts 2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。

3. Servlet依赖:Struts1 Action依赖于Servletn API,因为当一个Action被调用时,HttpServletResquest和HttpServletResponse被传递给execute方法,即Action依赖了容器,测试变得非常麻烦。Struts2 Action不依赖于容器,允许Action脱离容器单独被测试。如果需要,Struts2Action仍然可以访问初始的request和response。但是,其它的元素减少或者消除了直接访问HttpServletRequset和HttpServletResponse的必要性。

4.捕获输入:Struts1使用ActionForm对象捕获输入。所有的ActionForm必须继承一个基类。因为其它JavaBean不能用作ActionForm,开发者经常创建多余的类捕获输入。动态Bean可以作为创建传统ActionForm的选择,但是,开发者可能是在重新描述已经存在的JavaBean,仍然会导致有冗余的javabean。Struts2直接使用Action属性作为输入属性,消除了对第二输入对象的需求。Action属性能够通过web页面上的taglibs访问。Struts2也支持ActionForm模式。(Struts2用普通的POJO来接收数据)

5.表达式语言:Struts1整合了JSTL,但对集合和索引属性的支持很弱。Struts2可以是使用JSTL,但是也支持一个更加强大和灵活的表达式语言 “Object Graph Notation Language”(OGNL).

6. 绑定值到页面(view):Struts1使用标准JSP机制把对象绑定到页面中来访问,Struts1要传递值的时候必须往request里放、往session里放,然后再传递到jsp里面,铜鼓el表达式得到。Struts2使用“ValueStack”技术,使taglib能够访问值而不需要把你的页面和对象绑定起来。ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面。值栈技术非常著名。不需要request、不需要session,直接从Action中取值。

7.类型转换: Struts1ActionForm属性通常都是String类型。Struts1使用Commons-Beanutils进行类型转换。每个类一个转换器,对每一个实例来说是不可配置的。Struts2 使用OGNL进行类型转换。提供基本和常用对象的转换器。

8.校验:Struts1支持在ActionForm的validate方法中手动校验,或者通过Commons Validator的扩展来校验。同一个类可以有不同的校验内容,但不能校验子对象。Struts2支持通过validate方法和Xwork校验框架来进行校验。Xwork校验框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性。

9.Action执行的控制:Struts1支持每一个模块有单独的RequestProcessors(生命周期),但是模块中的所有Action必须共享相同的生命周期。(服务器重启时,Action生命周期结束,即生命周期无法控制)。Struts2支持通过拦截器堆栈(Interceptorn Stacks)为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。(可以控制Action的生命周期)

简单的说:
struts1 和struts2的核心原理不同: 
struts1.X是基于servlet的 
struts2是xwork的变体:他的核心是filter 
struts1是单力模式开发, 
struts2是多力模式。 
struts1的单力模式好处是节省内存,缺点是并发性查,非同步。 
struts2好处是线程安全是同步的每次使用开辟新的内存空间,缺点是占用资源多。

为什么要使用Struts框架 ?

既然本文的开始就说了,自己可以建这种框架,为什么要使用Struts呢?我想下面列举的这些理由是显而易见的:首先,它是建立在MVC这种公认的好的模式上的,Struts在M、V和C上都有涉及,但它主要是提供一个好的控制器和一套定制的标签库上,也就是说它的着力点在C和V上,因此,它天生就有MVC所带来的一系列优点,如:结构层次分明,高可重用性,增加了程序的健壮性和可伸缩性,便于开发与设计分工,提供集中统一的权限控制、校验、国际化、日志等等;其次,它是个开源项目得到了包括它的发明者Craig R.McClanahan在内的一些程序大师和高手持续而细心的呵护,并且经受了实战的检验,使其功能越来越强大,体系也日臻完善;最后,是它对其他技术和框架显示出很好的融合性。如,现在,它已经与tiles融为一体,可以展望,它很快就会与JSF等融会在一起。当然,和其他任何技术一样,它也不是十全十美的,如:它对类和一些属性、参数的命名显得有些随意,给使用带来一些不便;还有如Action类execute方法的只能接收一个ActionForm参数等。但瑕不掩瑜,这些没有影响它被广泛使用

Struts1与Struts2运行机制

struts1框架机制:

使用ActionForm进行用户数据收集,形成业务model 通过xml配置文件对应到特定的Action进行处理, ActionMapping提供页面跳转,兼有请求转发的功能 框架内置的Filter机制可以在formbean构造完成,Action处理之前做前期业务过滤工作 同时struts1自带标签库提供页面引用,并支持自定义标签开发,来丰富页面展示

struts2框架机制

自带的xwork依赖注入框架完成业务model数据的收集和创建,并直接注入到Controller里等待处理 Controller的多种实现方式方便开发员更自由的面向对象的进行业务数据的处理工作,同时摆脱了对软件服务器底层API的依赖, 内置强大的Inerceptor拦截器提供了许多常用的功能,实现在Action处理前和处理后的AOP拦截工作, struts2还支持自定义RusultType和Inerceptor的功能,方便了自主开发的扩展实现。

小学生之浅谈Struts2与struts1的运行机制的更多相关文章

  1. 浅谈struts2之chain

    转自:http://blog.csdn.net/randomnet/article/details/8656759 前一段时间,有关chain的机制着实困绕了许久.尽管网上有许多关于chain的解说, ...

  2. 浅谈 Struts2 面试题收藏

    Struts2面试题 一.工作原理 一个请求在Struts2框架中的处理大概分为以下几个步骤 1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求 2 这个请求经过一系列的过滤器(Fi ...

  3. 浅谈Struts2

    学过SSH框架很长一段时间了,一直没有很系统的总结一下,这里先简单谈谈Struts2. 为什么要用Struts2? 这里列举一些Servlet的缺点: 1.每写一个servlet在web.xml中都要 ...

  4. 浅谈Struts2拦截器的原理与实现

    拦截器与过滤器           拦截器是对调用的Action起作用,它提供了一种机制可以使开发者定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行.同时也是提供了 ...

  5. [SSH 2] 以网站主页面浅谈Struts2配置

    导读:前面总体的介绍了一下SSH框架,那么作为Struts这一支,具体是怎么配置的呢?本篇博客则主要是以自己做过的实例中的登录一条线,简单介绍一下struts2的配置,如有不妥之处,还请大家多提点提点 ...

  6. 浅谈Struts2(四)

    一.Struts2的拦截器(Intercept) 作用:把多个Action中的共有代码,提取至拦截器,从而减少Action中的冗余代码. 1.Action拦截器 a.编写interceptor类 pu ...

  7. 浅谈Struts2(三)

    一.Struts2收集client的参数 核心思路: <form method="post" action="XXXX"> <input ty ...

  8. 浅谈Struts2(二)

    一.struts2的跳转 1.action跳转JSP a.默认为forward <action name="action1" class="com.liquidxu ...

  9. 浅谈Struts2(一)

    一.Struts2引言 1.Struts2框架的概念 解决的MVC开发过程中,控制器(Controller)的通用问题. a.什么是MVC开发 MVC开发是一种编程思想,由设计者人为的把一个项目,划分 ...

随机推荐

  1. ubuntu系统mysql.h no such file or directory

    在Ubuntu系统中,你已经安装了mysql,即你使用sudo apt-get install mysql-server mysql-client然而使用C语言访问mysql数据库时,却发现出现了如下 ...

  2. java web 学习(1)

    java web 应用的核心技术包括以下几个方面: jsp:进行输入和输出的基本手段 javabean:完成功能的处理 servlet:对应用的流程进行控制 jdbc:是与数据库进行交互不可缺少的技术 ...

  3. Xcode升级导致插件失效的解决办法-b

    作为iOS界的攻城师,每一次水果发布新的Xcode开发版本时,我们都会跟进,然而那些好用的Xcode插件都会莫名的失灵...对此我各种百度,在这里,我将跟大家分享我是如何解决这些问题的.当然,我的方案 ...

  4. IPv6-only 的兼容性解决方案-b

    前几天Apple宣布 6月1日后所有应用必须支持IPv6-only网络 今天抽空看了下这方面的知识 首先解释下IPv6的是什么? 维基百科的定义如下:IPv6是Internet Protocol ve ...

  5. 转:Sharethrough使用Spark Streaming优化实时竞价

    文章来自于:http://www.infoq.com/cn/news/2014/04/spark-streaming-bidding 来自于Sharethrough的数据基础设施工程师Russell ...

  6. c语言之函数指针

    一.基础研究 这里研究的内容是函数指针,需要我们在研究后构造程序来描述函数指针数组的用法和向函数传函数指针的方法. 指针有很多种:整型指针.结构体指针.数组指针等等,它们的本质是它们的值都是一个地址, ...

  7. javascript note

    boolean("false") =====>true Date(1387123200000)不等于new Date(1387123200000) 用Date(1387123 ...

  8. VitamioBundle-master

    1. 下载资源 (1) 核心插件 VitamioBundle 下载地址:https://github.com/yixia/VitamioBundle (2) 官方示例 VitamioDemo 下载地址 ...

  9. 理解和使用NT驱动程序的执行上下文

    理解Windows NT驱动程序最重要的概念之一就是驱动程序运行时所处的“执行上下文”.理解并小心地应用这个概念可以帮助你构建更快.更高效的驱动程序. NT标准内核模式驱动程序编程的一个重要观念是某个 ...

  10. iconv内容,convmv文件名,unix2dos,dos2unix文件格式转换,od/cut/wc/dd/diff/uniq/nice/du等命令,linux文件名乱码,文件名,文件内容,vim编码设置

    1.enconv文件名编码转换,比如要将一个GBK编码的文件转换成UTF-8编码,操作如下 enconv -L zh_CN -x UTF-8 filename enconv -L GB2312 -x  ...