Struts2是一套很是优秀的Web应用框架,实现优雅、功能强大、使用简洁。能够说是Struts2是一款很是成熟的MVC架构。程序员
在咱们学习Struts2时,最好是先学习它的运行流程、核心概念,从中获得启发,提高本身,而不只仅是学习怎么怎么使用它。web
在网上看到这样一句话:缓存
你千万不要成为一个只会熟练使用框架的程序员,那样,你会疲于奔命,你也许永远只会使用 Hadoop ,而写不出一个 Hadoop ,你只是一个 Hadoop程序员,而不是一个分布式工程师。
你也许永远只会使用 Struts,而忘记了本身写 filter,你只是一个 SSH 程序员,而不是一个 Web 工程师。
话很少说,一块儿走进Struts2服务器
1、系统架构架构
Struts2的官方文档附带了Struts2的架构图。从这张图能够很好的去理解Struts2app
关于图中的Key:框架
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架构图