Struts2工做原理

Struts2是一套很是优秀的Web应用框架,实现优雅、功能强大、使用简洁。能够说是Struts2是一款很是成熟的MVC架构。程序员

在咱们学习Struts2时,最好是先学习它的运行流程、核心概念,从中获得启发,提高本身,而不只仅是学习怎么怎么使用它。web

在网上看到这样一句话:缓存

你千万不要成为一个只会熟练使用框架的程序员,那样,你会疲于奔命,你也许永远只会使用 Hadoop ,而写不出一个 Hadoop ,你只是一个 Hadoop程序员,而不是一个分布式工程师。
你也许永远只会使用 Struts,而忘记了本身写 filter,你只是一个 SSH 程序员,而不是一个 Web 工程师。

话很少说,一块儿走进Struts2
服务器

1、系统架构架构

Struts2的官方文档附带了Struts2的架构图。从这张图能够很好的去理解Struts2app

关于图中的Key:框架

 

  • Servlet Filters:过滤器链,客户端的全部请求都要通过Filter链的处理。
  • Struts Core:Struts2的核心部分,可是Struts2已经帮咱们作好了,咱们不须要去作这个
  • Interceptors,Struts2的拦截器。Struts2提供了不少默认的拦截器,能够完成平常开发的绝大部分工做;而咱们自定义的拦截器,用来实现实际的客户业务须要的功能。
  • User Created,由开发人员建立的,包括struts.xml、Action、Template,这些是每一个使用Struts2来进行开发的人员都必须会的。

 

 

 

  • 1.FilterDispatcher是整个Struts2的调度中心,也就是MVC中的C(控制中心),根据ActionMapper的结果来决定是否处理请求,若是ActionMapper指出该URL应该被Struts2处理,那么它将会执行Action处理,并中止过滤器链上尚未执行的过滤器。
  • 2.ActionMapper 会判断这个请求是否应该被Struts2处理,若是须要Struts2处理,ActionMapper会返回一个对象来描述请求对应的ActionInvocation的信息。
  • 3.ActionProxy,它会建立一个ActionInvocation实例,位于Action和xwork之间,使得咱们在未来有机会引入更多的实现方式,好比经过WebService来实现等。
  • 4.ConfigurationManager是xwork配置的管理中心,能够把它看作struts.xml这个配置文件在内存中的对应。
  • 5.struts.xml,是开发人员必须光顾的地方。是Stuts2的应用配置文件,负责诸如URL与Action之间映射关系的配置、以及执行后页面跳转的Result配置等。
  • 6.ActionInvocation:真正调用并执行Action,它拥有一个Action实例和这个Action所依赖的拦截器实例。ActionInvocation会按照指定的顺序去执行这些拦截器、Action以及相应的Result。
  • Interceptor(拦截器):是Struts2的基石,相似于JavaWeb的Filter,拦截器是一些无状态的类,拦截器能够自动拦截Action,它们给开发者提供了在Action运行以前或Result运行以后来执行一些功能代码的机会。
  • 7.Action:用来处理请求,封装数据。
  •  
  • 2、运行流程
  •  

1.当用户的发出请求,好比http:localhost:8080/Struts2/helloworld/helloworldAction.action,请求会被Tomcat接收到,Tomcat服务器来选择处理这个请求的Web应用,那就是由helloworld这个web工程来处理这个请求。分布式

2.Web容器会去读取helloworld这个工程的web.xml,在web.xml中进行匹配,但发现,由struts2这个过滤器来进行处理(也就是oop

StrutsPrepareAndExecuteFilter),根据Filter的配置,找到FilterDispatcher(Struts2的调度中心)学习

3.而后会获取FilterDispatcher实例,而后回调doFilter方法,进行真正的处理

PS:FilterDispatcher是任何一个Struts2应用都须要配置的,一般状况下,web.xml文件中还有其余过滤器时,FilterDispatcher是放在滤器链的最后;若是在FilterDispatcher前出现了如SiteMesh这种特殊的过滤器,还必须在SiteMesh前引用Struts2的ActionContextCleanUp过滤器

 

对应Struts2的架构图以下

 

 

4.这时FilterDispatcher会将请求转发给ActionMapper。ActionMapper负责识别当前的请求是否须要Struts2作出处理。ActionMapper就相似于公司的保安,来识别是否是当前客户是否是我公司的人

 

对应Struts2的架构图以下

 

 

5.若是须要Struts2处理,ActionMapper会通知FilterDispatcher,须要处理这个请求,FilterDispatcher会中止过滤器链之后的部分,(这也就是为何,FilterDispatcher应该出如今过滤器链的最后的缘由)。而后创建一个ActionProxy实例,这个对象做为Action与xwork之间的中间层,会代理Action的运行过程。

 

对应Struts2的架构图以下

 

 

6.ActionProxy对象在被建立出来的时候,并不知道要运行哪一个Action,它手里只有从FilterDispatcher中拿到的请求的URL。

而真正知道要运行哪一个Action的是ConfigurationManager。由于只有它才能读取咱们的strtus.xml

 

(在服务器启动的时候,ConfigurationManager就会把struts.xml中的全部信息读到内存里,并缓存,当ActionProxy带着URL向他询问要运行哪一个Action的时候,就能够直接匹配、查找并回答了)

 

对应Struts2的架构图以下

 

  -> 

 

7.ActionProxy知道本身该干什么事以后(运行哪一个Action、相关的拦截器以及全部可能使用的result信息),而后立刻创建ActionInvocation对象了,ActionInvocation对象描述了Action运行的整个过程。

注意:Action完整的调用过程都是由ActionInvocation对象负责

 

对应Struts2的架构图以下

 

 

 

8.在execute方法以前,好像URL请求中的参数已经赋值到了Action的属性上,这就是咱们的"雷锋"—拦截器。

拦截器的运行被分红两部分,一部分在Action以前运行,一部分在Result以后运行,并且顺序是恰好反过来的。也就是在Action执行前的顺序,好比是拦截器一、拦截器二、拦截器3,那么运行Result以后,再次运行拦截器的时候,顺序就变成拦截器三、拦截器二、拦截器1了。

这就比如,你要去奶奶家,须要经过 水泊梁山->盘丝洞 -> 索马里,到了奶奶家,看奶奶回来的时候,就必需要经过 索马里 -> 盘丝洞 -> 水泊梁山。

因此ActionInvocation对象执行的时候须要经过不少复杂的过程,按照指定拦截器的顺序依次执行。

 

对应Struts2的架构图以下

 

 

 

9.到了奶奶家,而后执行Action的execute方法

 

 

 

10.而后根据execute方法返回的结果(Result),去struts.xml中匹配选择下一个页面

 

 

11.根据结果(Result)找到页面后,在页面上(有不少Struts2提供的模板),能够经过Struts2自带的标签库来访问须要的数据,并生成最终页面

注意:这时尚未给客户端应答,只是生成了页面

 

 

12.最后,ActionInvocation对象倒序执行拦截器,从奶奶家回来

 

 

13.ActionInvocation对象执行完毕后,已经获得响应对象(HttpServletResponse)了,最后按与过滤器(Filter)配置定义相反的顺序依次通过过滤器,向客户端展现出响应的结果

 

获得完整Struts2架构图

 

相关文章
相关标签/搜索