struts2工作流程

struts2抛弃了request个responsed等ServletAPI,实质上只是隐藏了而已。实际上,struts2的Action都是被调用的。在调用Action的execute的执行方法(只要符合execute的函数类型返回为String的函数都是可以的)前,strut2 会从request中获得参数,并通过set方法设置到Action的属性中,这也是为什么要实现Action属性的Set和Get方法了。

Struts2的工作流程如下:

struts2工作流程_第1张图片 

下面我就这幅图来介绍一下:

1.jsp页面请求,这里就是HttpServletRequest发出请求;

2.request经过ActionContextCleanup,otherFilter,FilterDisPathcher;这里介绍一下FliterDisPathcher他能够截获所有的URI。如果URI以.action结尾,Structs2会查找对应的Action;如果URI中包括/struts/,Struts2会返回他的集成资源就是位于Struts2 Jar包中的。因此配置Fliter时要把所有的URI都配置到Filter中。

3.在ActionMapper中找到request请求对应Action的实例名,所以ActionMapper是rquest和Action的一个映射表;FilterDispatcher询问ActionMapper是否需要调用某个Action来处理这个(request)请求,如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy。

4.ActionProxy在struts框架中发挥着非常重要的作用。通过webwork和xwork交互关系图可以看出,它是action和xwork中间的一层。这里就可理解为ActionProxy会调用confilguration,然后调用在我们配置的struts.xml文件中寻找请求的Action类。

5.这一步时关键的,我的理解就是ActionProxy会异步执行,一是我们上面说的喜爱struts.xml中寻找一应的action类,另外就是加载ActionIncovation的实例,我在网上看到一些介绍ActionIncovation的,我在这里引用过来:“ActionInvocation就是Action的调用者。ActionInvocation在Action的执行过程中,负责Interceptor、Action和Result等一系列元素的调度;Interceptor通过ActionInvocation可以完全的改变Action行为:不让它执行、改变返回值、甚至可以细颗粒的操作Action的方法”。他的作用就是在执行Action类中方法之前加载一些拦截器,如上面说的Interceptor1,interceptor2,interceptor3,等拦截器1,2,3执行完毕在执行Action的相关方法,返回结果界面。

6.通过HttpServletResponse返回处理后的结果给request。

我再介绍一下Struts的线程安全:

首先说明Struts2时线程安全的,再Struts2中每一个Action都会有多个实例,再处理一请求时声称一个Action实例,这些实例彼此相互独立,处理完毕就销毁,所以他是线程安全的;


你可能感兴趣的:(struts)