java struts2 的请求处理流程详解-mile米乐体育
一、struts2的处理流程:
- 客户端产生一个httpservletrequest的请求,该请求被提交到一系列的标准过滤器(filter)组建链中(如actioncontextcleanup:它主要是清理当前线程的actioncontext、dispatcher,filterdispatcher主要是通过actionmapper来决定需要调用那个action,filterdispatcher是控制器的核心,也是mvc中控制层的核心组建)。
- 核心控制器组建filterdispatcher根据actionmapper中的设置获得是否需要调用某个action组建来处理这个httpservletrequest请求,如果actionmapper决定调用某个action组建,filterdispatcher核心控制器组建就会把请求的处理权委托给actionproxy组建
- actionproxy组建通过configuration manager组建获得struts2框架的配置文件struts.xml,最后找到需要调用的目标action组建类,然后actionproxy组建就创建出一个实现了命令模式的actioninvocation类的对象实例类的对象实例(这个过程包括调用anction组建本身之前调用多个的拦截器组建的before()方法 )同时actioninvocation组建通过代理模式调用目标action组建。但是在调用之前actioninvocation组建会根据配置文件中的设置项目加载与目标action组建相关的所有拦截器组建(interceptor)。
- 一旦action组建执行完毕,actioninvocation组建将根据开发人员在struts2.xml配置文件中定义的各个配置项目获得对象的返回结果–为这个action组建的结果码(一个像success,input)然后根据该返回的结果调用目标jsp页面以实现显示输出。
- 最后各个拦截器组建会被再次执行(但是顺序和开始时相反,并调用after()方法),然后请求最终被返回给系统的部署文件中配置的其他过滤器,如果已经设置了actioncontextcleanup过滤器,那么filterdispatcher就不会清理在threadlocal对象中保存的actioncontext信息。如果没有设置actioncontextcleanup过滤器,filterdispatcher就会清除掉所有的threadlocal对象。
更加清晰的来说就是:
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请求处理示意图: