Struts2的工作原理图如下所示:
Struts2工作原理详解:
1、Struts2框架会将得到的用户请求封装成为一个HttpServletRequest请求对象。
2、这个请求会经过一系列的过滤器,如果Struts2与其他的框架进行了集成,首先会经过ActionContextCleanUp过滤器,然后再经过其他的一些过滤器,最后经过核心过滤器FilterDispatcher或StrutsPreparedAndExecuteFilter。
ActionContextCleanUp过滤器它的作用主要是延长action属性的生命周期,以便在jsp页面访问,当所有过滤器加载完毕后,核心过滤器会清除所有的ActionContext,如果其他的过滤器要使用这些属性时,就得不到想要得到的值。所以让action的属性会统一的交给ActionContextCleanUp过滤器来清除。
FilterDispatcher或StrutsPreparedAndExecuteFilter都是核心过滤器,在2.1.3版本之前使用的是FilterDispatcher,在2.1.3及2.1.3之后使用的都是StrutsPreparedAndExecuteFilter。FilterDispatcher过滤器当我们要自定义过滤器时,我们自定义的过滤器必须要放在struts过滤器之前,放在struts过滤器之后,自定义的过滤器可能会不起作用。
StrutsPrepareAndExecuteFilter可以把它拆分成StrutsPrepareFilter和StrutsExecuteFilter,可以在这两个过滤器之间加上我们自己的过滤器.
3、经过核心过滤器后,核心过滤器ActiobMapper中询问是否需要调用action,ActiobMapper通过反射技术查看是否需要调用action,如果有action,核心过滤器会将请求转发给ActionProxy。
4、ActionProxy会通过ConfigurationManager配置管理器查找struts.xml文件中要调用的Action类。
5、ActionProxy创建一个ActionInvocation实例,该实例使用命名模式来调用。
6、 ActionInvocation依次调用interceptor和action,在Action执行的前后,ActionInvocation实例根据配置文件加载与Action相关的所有拦截器Interceptor。默认的struts拦截器有18个,struts2中很多功能都是通过这些拦截器实现,如:异常处理,文件上传请求参数赋值,数据校验等这些功能实现都在拦截器中。
7、一旦Action执行完毕,ActionInvocation实例根据struts.xml文件中的配置找到相应的返回结果。Template将返回结果进行渲染,Template通常是一个JSP或者FreeMarker的模板。
8、再反向的经过上面的过滤器。
9、将结果形成一个HttpServletResponse对象返还给用户。