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

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 运行流程分析,Struts2 运行流程分析,Struts2 运行流程分析

    Struts2运行流程测试

    单元测试 之 16.3 测试完整的Struts2运行流程

    Struts运行流程图(详细)

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

    Struts2的运行流程

    Struts2的架构和运行流程 之 3.2 Struts2的运行流程 交流分类:Java

    尚硅谷Java视频_Struts2视频教程

    每个技术点都配备案例和代码,对于拦截器、Struts2 运行流程分析、值栈等技术点的讲授更是深入解析源代码,授之以渔。  学习完本Java视频教程,你会真正理解 Struts2 的优雅和简洁,并使你具备开发 Struts2 企业...

    Struts2运行流畅动态演示

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

    研磨struts2

    研磨struts2博文,详细讲解了struts2运行流程,值得大家阅读

    struts运行流程图

    struts运行流程图,刚接触struts的一定要了解

    Struts2项目开发流程简明实例

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

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

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

    struts.hibernate工作流程

    struts和hibernate的工作流程详细

    Struts2_源码及PPT课件

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

    struts2工作原理

    struts2工作原理、请求响应流程。。。。。。。。。。。。。。。

    Struts2入门demo

    这个示例是Struts2的入门例子,非常适合Struts2的初学者,通过这个例子的学习,初学者可以很快掌握Struts2的运行流程。

    Struts2的系统架构

    Struts2的架构和运行流程 之 3.1 Struts2的系统架构

    Struts2快速学习步骤

    本章学习目标  struts2 的概念和作用 ... 简单分析struts2 的运行流程  struts2 配置文件加载  struts.xml 配置文件详解  struts2 常量文件修改  Action 动作类的三种写法  Action 动作类的三种访问方式

    struts2执行顺序

    struts2执行顺序,清楚描述从处理请求到返回response的整个流程

    配置Struts 2开发环境,了解和熟悉Struts 2的开发流程、了解和熟悉Struts2标签的使用方法.rar

    2.配置struts.xml文件; 3.掌握在视图中访问Action的方法. 4. 掌握在视图中多方法调用同一个Action的方法 5.掌握常用标签textfield、radio、paaaword、checkboxlist、select、data的使用方法,实现页面与Action的交互...

    通俗易懂的Struts2教程(含配套资料)

    每个技术点都配备案例和代码,对于拦截器、Struts2 运行流程分析、值栈等技术点的讲授更是深入解析源代码,授之以渔。 学习完本 Java视频教程,你会真正理解 Struts2 的优雅和简洁,并使你具备开发 Struts2 企业级...

Global site tag (gtag.js) - Google Analytics