`
ak23173969
  • 浏览: 29398 次
社区版块
存档分类
最新评论

Struts2运行流程

阅读更多

                     这篇文章大部分是转载的,虽然不知道作者是谁,但是还是非常膜拜的,描述的非常清晰,我觉得要是自己去陈诉也没有这么好,中间我修改了最新的核心控制器名称,主要是struts2的核心控制器现在并不是FilterDispatcher对象,而是StrutsPrepareAndExcuteFilter对象;中间有许多图片还是FilterDisptcher,我这边偷下懒,大家知道就行

     

 

第一步 :我们先来看下struts2官方提供的运行流程图

 


 

                    

这张图上分了好多块,彼此之间相互联系,先浏览一下各块的名字,再留心一下运行图最下面的图例,分为四种颜色。

  • 橙色是Servlet Filters,过滤器链,所有的请求都要经过Filter链的处理。
  • 浅蓝色是Struts Core,Struts2的核心部分,Struts2中已经做好的功能,在实际开发中不需要动它们。
  • 浅绿色是Interceptors,Struts2的拦截器。Struts2提供了很多默认的拦截器,可以完成日常开发的绝大部分工作;当然,也可以自定义拦截器,用来实现具体业务需要的功能。
  • 浅黄色是User Created,由开发人员创建的,包括struts.xml、Action、Template,这些其实就是在前面HelloWorld应用里面折腾的那些东西,是每个使用Struts2来进行开发的人员都必须会的。

 

第二部分我们粗略的陈诉下各个模块作用

                  

  • StrutsPrepareAndExcuteFilter是整个Struts2的调度中心,根据ActionMapper的结果来决定是否处理请求,如果ActionMapper指出该URL应该被Struts2处理,那么它将会执行Action处理,并停止过滤器链上还没有执行的过滤器。
  • ActionMapper提供了HTTP请求与action执行之间的映射,简单点说,ActionMapper会判断这个请求是否应该被 Struts2处理,如果需要Struts2处理,ActionMapper会返回一个对象来描述请求对应的ActionInvocation的信息。
  • ActionProxy是一个特别的中间层,位于Actionxwork之间,使得我们在将来有机会引入更多的实现方式,比如通过WebService来实现等。
  • ConfigurationManagerxwork配置的管理中心,通俗的讲,可以把它看做struts.xml这个配置文件在内存中的对应。
  • struts.xmlStuts2的应用配置文件,负责诸如URLAction之间映射的配置、以及执行后页面跳转的Result配置等。
  • ActionInvocation:真正调用并执行Action,它拥有一个Action实例和这个Action所依赖的拦截器实例。ActionInvocation会执行这些拦截器、Action以及相应的Result
  • Interceptor(拦截器):拦截器是一些无状态的类,拦截器可以自动拦截Action,它们给开发者提供了在Action运行之前或Result运行之后来执行一些功能代码的机会。类似于我们熟悉的javax.servlet.Filter
  • Action:动作类是Struts2中的动作执行单元。用来处理用户请求,并封装业务所需要的数据。
  • ResultResult就是不同视图类型的抽象封装模型,不同的视图类型会对应不同的Result实现,Struts2中支持多种视图类型,比如JspFreeMarker等。
  • Templates:各种视图类型的页面模板,比如JSP就是一种模板页面技术。
  • Tag SubsystemStruts2的标签库,它抽象了三种不同的视图技术JSPvelocityfreemarker,可以在不同的视图技术中,几乎没有差别的使用这些标签。

 

第三部分接下来我们来真正陈诉下运行流程

             前提:我们正在模拟用户登入,进入index.jsp页面,该页面有两个输入框,分别是账号与密码,还有提交按钮,当输入的信息后然后提交到后台处理,插入web.xml文件中的过滤器配置

	<!-- 配置Struts2控制器 -->
	<filter>
		<filter-name>struts2</filter-name>
		<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
	</filter>

	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>*.action</url-pattern>
	</filter-mapping>

 

 

             过程:

 

1首先是在登录页面,用户填入帐号和密码,然后点击提交按钮,好了,就从这里开始分析背后的处理流程,这是我们进行分析的起点。

2当用户提交登录请求后,请求的URL为:“/helloworld /helloworldAction.action”,请求会被Tomcat服务器接收到,Tomcat服务器会根据请求URL中的web上下文,也就是 “/helloworld”,来选择处理这个请求的Web应用,那就是由helloworld这个web工程来处理这个请求。

3Web容器会去读取helloworld这个工程的web.xml,在web.xml中进行匹配,发现后缀为“.action”的请求,由struts2这个过滤器来进行处理,根据Filter的配置,找到实际的类为FilterDispatcher

4Web容器会获取FilterDispatcher这个类的实例,然后回调doFilter方法,进行真正的处理。StrutsPrepareAndExcuteFilter作为前端控制器,是整个Struts2的调度中心。

注意:在架构图上,可以看到有三个过滤器层次,分别是ActionContextCleanUp SiteMesh等其他过滤器和FilterDispatcher。这三个层次中,ActionContextCleanUp FilterDispatcherStruts2的过滤器,而SiteMeshSiteMesh等其他过滤器不是。

StrutsPrepareAndExcuteFilter是任何一个Struts2应用都需要配置的,一般出现在过滤器链的最后;如果在StrutsPrepareAndExcuteFilter前出现了如SiteMesh这种特殊的过滤器,还必须在SiteMesh前引用Struts2ActionContextCleanUp过滤器

在前面的helloworld中,并没有出现SiteMesh这种特殊的过滤器,所以只需要引用StrutsPrepareAndExcuteFilter就可以了。

这就相当于前进到Struts2架构图上的第一步,如下所示:



 

 

5StrutsPrepareAndExcuteFilter将请求转发给ActionMapperActionMapper负责识别当前的请求是否需要Struts2做出处理。这就相当于前进到Struts2架构图上的第二步,如下所示:



 

6ActionMapper告诉StrutsPrepareAndExcuteFilter,需要处理这个请求,StrutsPrepareAndExcuteFilter会停止过滤器链以后的部分,所以通常情况下:StrutsPrepareAndExcuteFilter应该出现在过滤器链的最后。然后建立一个ActionProxy对象,这个对象作为Actionxwork之间的中间层会代理Action的运行过程。

这就相当于前进到Struts2架构图上的第三步,如下所示:

                  

 

7ActionProxy对象刚被创建出来的时候,并不知道要运行哪个Action,它手里只有从StrutsPrepareAndExcuteFilter中拿到的请求的URL。这时候,它去向ConfigurationManager询问到底要运行哪个Action

回忆一下,某个特定的URL由哪个Action响应由谁负责,定义在什么地方呢?没错,在struts.xml里面。而 ConfigurationManager就是负责读取并管理struts.xml的,可以简单的理解为ConfigurationManager struts.xml在内存中的映像。

在服务器启动的时候,ConfigurationManager会一次性的把struts.xml中的所有信息读到内存里,并缓存起来,以保证ActionProxy拿着来访的URL向他询问要运行哪个Action的时候,就可以直接匹配、查找并回答了。

这就相当于前进到Struts2架构图上的第四步和第五步了,如下所示:



 

 

8ActionProxy拿到了运行哪个Action、相关的拦截器以及所有可能使用的result信息,就可以着手建立ActionInvocation对象了,ActionInvocation对象描述了Action运行的整个过程。

注意:Action运行绝不仅仅只是运行Actionexecute方法这么简单,还包括其他部分,完整的调用过程由ActionInvocation对象负责。

这就相当于前进到Struts2架构图上的第六步,如下所示:



 

9回忆一下,HelloWorldActionexecute方法运行的时候,是不是它的属性就已经有了请求中的参数呢?这说明,在execute方法之前,有人偷偷的帮我们做了这件事,把请求中的参数赋值到了Action的属性上,这个有人就是刚刚说的拦截器。

拦截器的运行被分成两部分,一部分在Action之前运行,一部分在Result之后运行,而且顺序是刚好反过来的。也就是在Action执行前的顺序,比如是拦截器1、拦截器2、拦截器3,那么运行Result之后,再次运行拦截器的时候,顺序就变成拦截器3、拦截器2、拦截器1了。

总之ActionInvocation对象执行的时候比较复杂,会做很多事:

  • 首先按照拦截器的引用顺序依次执行各个拦截器的前置部分。

这就相当于前进到Struts2架构图上的第七步,如下所示:



 

  • 然后执行Actionexecute方法

这就相当于前进到Struts2架构图上的第八步,如下所示:



 
然后根据execute方法返回的结果,也就是Result,在struts.xml中匹配选择下一个页面,这就相当于前进到Struts2架构图上的第九步,如下所示:



 

  • 找到页面后,由于现在的页面一般都是模板页面,在页面上,可以通过Struts2自带的标签库来访问需要的数据,并生成最终页面

这就相当于前进到Struts2架构图上的第十步,如下所示:



 

  • 最后,ActionInvocation对象再按照拦截器的引用顺序的倒序依次执行各个拦截器的后置部分。

这就相当于前进到Struts2架构图上的第十一步,如下所示:



 

10ActionInvocation对象执行完毕后,实际上就已经得到响应对象了,也就是HttpServletResponse对象,最后按与过滤器器配置定义相反的顺序依次经过过滤器,向用户展示出响应的结果。

这就相当于前进到Struts2架构图上的第十二步,得到最终完整的系统架构图了

 



 

 

  • 大小: 324.6 KB
  • 大小: 17.9 KB
  • 大小: 20.4 KB
  • 大小: 22.5 KB
  • 大小: 27.7 KB
  • 大小: 31.8 KB
  • 大小: 36.4 KB
  • 大小: 38 KB
  • 大小: 38.9 KB
  • 大小: 44.1 KB
  • 大小: 47.4 KB
分享到:
评论
1 楼 hengren 2013-10-11  
不错。学习了

相关推荐

    Struts2 运行流程分析

    现在,让我们深入探讨Struts2的运行流程。 1. **请求接收**:当用户在浏览器中输入URL并提交请求时,该请求首先会被web服务器(如Apache Tomcat)捕获。如果URL映射与Struts2配置文件中的Action配置相匹配,请求将...

    Struts2运行流程测试

    在本文中,我们将深入理解Struts2的运行流程,并通过单元测试来验证其完整的工作机制,特别是涉及拦截器、验证框架和Result。 首先,让我们回顾一下Struts2的运行流程。当一个HTTP请求到达服务器时,Struts2框架会...

    Struts运行流程图(详细)

    底层,详细. Struts运行流程图(详细) Struts运行流程图(详细) Struts运行流程图(详细)

    struts2运行机制

    ### Struts2运行机制详解 #### 一、Struts2框架概述 Struts2是一个基于MVC(Model-View-Controller)设计模式的Java Web应用框架,它为开发者提供了构建可扩展、易于维护的Web应用程序的工具。Struts2不仅继承了...

    研磨struts2

    ### Struts2 运行流程及核心概念解析 #### Struts2 概述与 MVC 模式 **Struts2** 是一个基于 **MVC(Model-View-Controller)** 设计模式的 Java Web 应用框架。它通过将应用程序分为模型、视图和控制器三个部分来...

    Struts2的运行流程

    在本文中,我们将深入探讨Struts2的运行流程,了解它是如何处理用户的请求并协调各个组件来实现业务逻辑和视图展示的。 首先,让我们回顾一下在HelloWorld示例中所涉及的基本步骤: 1. 在`web.xml`配置文件中,...

    Struts2运行流畅动态演示

    本文档生动地向初学者展示了Struts2的运行流程,让初学者对Struts2的工作机制在短时间内有一个完整清晰的认识。独树一帜的展示知识的方式,肯定会让读者耳目一新,拒绝平庸,拒绝照本宣科,拒绝一切故弄玄虚,让技术...

    struts2开发流程简图

    在使用Struts2进行开发时,遵循一定的流程可以帮助我们更好地组织代码和管理项目。以下是基于提供的部分内容详细描述的Struts2开发流程: 1. **引入Struts2的JAR包**: 开发Struts2应用的第一步是将Struts2的库...

    struts运行流程图

    对于初学者来说,理解Struts的运行流程至关重要。 在Struts框架中,一个典型的请求处理流程可以分为以下步骤: 1. **用户请求**:当用户通过浏览器发起一个HTTP请求,比如访问`HelloWorld.do`,这个请求首先会被...

    留言板留言板struts2留言板struts2

    这个"留言板留言板struts2"项目,显然是一个基于Struts2实现的简单留言板系统,旨在展示Struts2的核心功能和开发流程。下面将详细介绍Struts2框架以及在该项目中可能涉及的关键知识点。 1. **Struts2框架概述**:...

    struts2jar包

    6. **其他依赖的jar包**:Struts2运行还需要一些其他的库,如freemarker或velocity用于模板引擎,javassist用于动态类生成,log4j或slf4j用于日志记录等。 引入Struts2的jar包有多种方式: - **Eclipse/IDEA等集成...

    java框架:struts

    ### Java框架:Struts2运行流程与关键技术解析 #### Struts2概述 Struts2是Apache Struts的一个重要分支,它是一种开源的Web应用程序框架,主要用于构建基于Java的动态网站和应用程序。Struts2框架继承了Struts1的...

    struts1与Struts2的流程

    Struts1和Struts2是两个非常著名的Java Web框架,它们都用于构建MVC(Model-View-Controller)架构的应用程序。...两者都在MVC模式下运行,但Struts2在设计和功能上进行了许多改进,提高了开发效率和应用的可维护性。

    Struts2视频教程

    - **Hello Struts2**:通过创建一个简单的“Hello World”示例,帮助开发者快速上手Struts2的基本配置和运行流程。 - **Action类详解**:Action类是Struts2的核心组件之一,负责处理用户的请求并返回相应的结果。...

    struts1的工作流程

    ### Struts1的工作流程详解 #### 一、概述 Struts1是Apache Struts的第一个版本,它是基于Java Servlet/JavaServer Pages技术构建的MVC框架。对于初学者来说,了解Struts1的工作流程是非常重要的,这有助于理解...

    Struts2项目开发流程简明实例

    功能: ...  否则页面跳转到login.jsp页面等待用户输入;  此实例只适合对Struts2不了解的初学者. 工具:Eclipse+Tomcat 技术:Jsp,Struts2 步骤: 1. 创建web项目 2. 项目添加Struts2类...7. 部署和运行struts2项目

    Struts2由浅入深学习教程(46集)

    本视频对 Struts2 庞杂的技术点进行抽丝剥茧,提炼出企业开发必备的核心技术和重要技能。每个技术点都配备案例和代码,对于拦截器、Struts2 运行流程分析、值栈等技术点的讲授更是深入解析源代码,授之以渔。

    struts2 ,struts2 demo

    在提供的“struts2 demo”压缩包中,你可以找到这些概念的具体实现,包括Action类、视图页面、配置文件等,通过分析和运行这些示例,你可以深入理解Struts2的工作原理和用法。这个压缩包对于初学者来说是一个很好的...

    struts.hibernate工作流程

    **Struts 1.2 工作流程** 1. **用户请求**: 用户通过浏览器发送HTTP请求到服务器。 2. **DispatcherServlet(ActionServlet)**: Struts的前端控制器接收请求,并进行初步处理。 3. **配置映射**: 请求URL被映射到...

Global site tag (gtag.js) - Google Analytics