这几天因为在项目中曾经使用过Struts2这个神奇的框架,所以很有必要深入探究一下Struts2的处理的基本流程,如是有大一大二的在校大学生看到这篇博客我像给你的建议是在大学只做一个项目就够了,把整个项目的所有模块都掌握清楚,把所用技术的内部实现原理都给琢磨透那么你的大学就很成功了。做项目一定要做完之后停下来思考揣摩获得提升不能只停留在框架的使用上面,当然一个框架流行也自有他的一些非常好的
实现原理。掌握这些才是在学习阶段最重要的。
下面这幅图在我第一次接触Struts2的时候就已经深深的烙在我的脑海中,但是至于他的内部实现,具体的流出我只是粗略的学习并没有深入研究,现在是时候开始认真总结一下了。
一、Struts2的处理流程:
更加清晰的来说就是:
1.客户端初始化一个指向servlet容器的请求。
2.请求经过一系列的过滤器( ActionContextCleanUp、SiteMesh )
3.FilterDispatcher被调用,并询问ActionMapper来决定这个请求是否需要调用某个Action
4.ActionMapper决定要调用那一个Action,FilterDispatcher把请求交给ActionProxy。
5. ActionProxy通过Configurate Manager询问Struts配置文件,找到要调用的Action类
6. ActionProxy创建一个ActionInvocation实例
7. ActionInvocation实例使用命令模式来调用,回调Action的exeute方法
8. 一旦Action执行完毕,ActionInvocation负责根据Struts.xml的配置返回结果。
二、比较重要的类的介绍:
ActionMapper其实是HttpServletRequest和Action调用请求的一个映射 ,他屏蔽了Action对于Request等Java servlet类的依赖。Struts2中它的默认实现类是DefaultAtionMapper,ActionMapper很大的用处可以根据自己的需要来设计url格式,它自己也有Restful的具体实现。
ActionProxy和ActionInvocation:
Action的一个代理,由ActionProxyFactory创建,它本身不包括Action实例,默认实现DefaultActionProxy是由ActionInvocation持有Action实例。 ActionProxy作用是如何取得Action,无论是本地还是远程 。而 ActionInvocation的作用是如何执行Action ,拦截器的功能就是咱ActionInvocation中实现的。
ConfigurateProvider和Configuration
ConfigurationProvider就是Struts2中配置文件的解析器,Struts2中的配置文件主要是实现XmlConfigurationProvider及其子类StrutsXmlConfigurationProvider来解析。
结合上图Struts2的处理流程就已经能够非常清晰了