struts2的核心和工作原理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了struts2的核心和工作原理相关的知识,希望对你有一定的参考价值。

struts2的核心和工作原理

设计目标

    Struts设计的第一目标就是使MVC模式应用于web程序设计。技术优势

    Struts2有两方面的技术优势,一是所有的Struts2应用程序都是基于client/server HTTP交换协议,The Java Servlet API揭示了Java Servlet只是Java API的一个很小子集,这样我们可以在业务逻辑部分使用功能强大的Java语言进行程序设计。

二是提供了对MVC的一个清晰的实现,这一实现包含了很多参与对所有请求进行处理的关键组件,如:拦截器、OGNL表达式语言、堆栈。

因为struts2有这样目标,并且有这样的优势,所以这是我们学习struts2的理由,下面我们深入剖析一下struts的工作原理。

 

工作原理

    Suruts2的工作原理可以用下面这张图来描述,下面我们分步骤介绍一下每一步的核心内容

 技术分享

一个请求在Struts2框架中的处理大概分为以下几个步骤 

1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求

2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin) 

3、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action 

FilterDispatcher是控制器的核心,就是mvcc控制层的核心。

4、如果ActionMapper决定需要调用某个ActionFilterDispatcher把请求的处理交给ActionProxy  

5ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类 ,这里,我们一般是从struts.xml配置中读取。

6ActionProxy创建一个ActionInvocation的实例。

7ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。

下面我们来看看ActionInvocation是如何工作的:

ActionInvocationXworks Action 调度的核心。而对Interceptor 的调度,也

 

正是由ActionInvocation负责。ActionInvocation 是一个接口,而

 

DefaultActionInvocation 则是Webwork ActionInvocation的默认实现。

 

Interceptor的调度流程大致如下:

 

1.ActionInvocation初始化时,根据配置,加载Action相关的所有Interceptor

 

2. 通过ActionInvocation.invoke方法调用Action实现时,执行Interceptor

 

Interceptor将很多功能从我们的Action中独立出来,大量减少了我们Action的代码,独立出来的行为具有很好的重用性。XWorkWebWork的许多功能都是有Interceptor实现,可以在配置文件中组装Action用到的Interceptor,它会按照你指定的顺序,在Action执行前后运行。

 

8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper

 

Struts2struts1的比较

    struts2相对于struts1来说简单了很多,并且功能强大了很多,我们可以从几个方面来看:

    从体系结构来看:struts2大量使用拦截器来处理请求,从而允许与业务逻辑控制器 与 servlet-api分离,避免了侵入性(所谓侵入性就是指的这个架构设计出来的部件对系统的影响范围,比如框架的侵入性就很高,因为在一个工程中引入一个框架,你的整个设计都必须围绕这个框架来进行,一旦使用了,框架的可替代性几乎为0,这样子就是高侵入性。组件的侵入性就比较低);而struts1.xaction中明显的侵入了servlet-api.

    从线程安全分析:struts2.x是线程安全的,每一个对象产生一个实例,避免了线程安全问题;而struts1.xaction中属于单线程。

    性能方面:struts2.x测试可以脱离web容器,而struts1.x依赖servlet-api,测试需要依赖web容器。

    请求参数封装对比:struts2.x使用ModelDriven模式,这样我们 直接 封装model对象,无需要继承任何struts2的基类,避免了侵入性。

    标签的优势:标签库几乎可以完全替代JSTL的标签库,并且 struts2.x支持强大的ognl表达式。

    当然,struts2struts1相比,在文件上传,数据校验 等方面也 方便了好多。

 

 

 

    

以上是关于struts2的核心和工作原理的主要内容,如果未能解决你的问题,请参考以下文章

Struts2——struts2的核心和工作原理

struts2的核心和工作原理

struts2的核心和工作原理

strust2的核心和工作原理

strust2的核心和工作原理

菜鸟学Struts2——Struts工作原理