2012-03-26
struts2的主要工作流程是这样的:
首先有一个http请求,会首先进入ActionContextCleanup(清空值栈等,但会留下自己的,比如session,Attribute等),其作用见括号中的
其次,走一些过滤器,filter,然后进入闻名的struts2的总控FilterDispatcher
穿过上述几层后,会进入ActionMapper,来判断此请求是否需要struts2处理,如果需要,那么由ActionProxy来接管,通过配置管理我们可以找到我们的struts.xml,然后进入真正做事的Action
Invocation,依次穿过我们的拦截器,进入action,从而根据返回的result选择我们要的页面,在拦截器的前半部分去值栈中取值通过标签展示在页面上,最后生成response返回,具体的图如下
此图是我自己总结的,颜色比较多的那个图是struts2的官方图片,只是加了注释
struts2说的应用一些,举例,就像我们图中的,当你点击新增按钮后,会触发一个action给web服务器,服务器接受请求,给对应的web容器,根据上下文可以找到我们的webapp应用,找到总的配置文件web.xml,根据里面的配置来判断action谁去处理,找到filter,反射创建类,回调init,读取struts2的配置文件struts.xml,根据命名空间等找到action,反射创建action类实例,回到execute方法,找到对应的result转向下一个页面,其中虚线框中为右图的一个简写
当web 容器收到一个请求时,它将请求传递给一个标准的过滤器链,其中包括ActionContentCleanUp过滤器及其他过滤器(如集成的siteMesh的插件),这是非常有用的技术.
接下来 需要调用 FilterDispatcher,它调用ActionMapper 确定请求调用哪个Action ,ActionMapper返回一个收集了Action详细信息的ActionMapping的对象,接下来FilterDispatcher 将控制权委派给 ActionProxy,ActionProxy调用配置管理器(ConfigurationManager)从配置文件中读取配置信息,然后创建ActionInvocation对象.实际上ActionInvocation的处理过程就是Struts2处理请求的过程.ActionInvocation 被创建的同时,填充了需要的所有对象的信息,它在调用Action之前会依次调用所有配置的拦截器. 一旦action执行返回字符串,ActionInvocation负责查找结果字符串对应的Result.然后执行这个Result.通常状况下Result会调用一些模板来呈现页面. 之后
拦截器被再次执行(顺序和Action执行之前相反),最后响应,被返回给在web.xml中配置的那些过滤器(FilterDispatcher)
读取配置信息,把他们存放到各种配置对象;
当ActionServlet接受到客户请求时:
检索客户匹配的ActionMapping实列,如果不存在就会返回请求路经无效
如果ActionForm实列不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到Action中
ActionServlet根据ActionMapping所包含的映射信息决定将请求转发给哪个Action的指定的方法
Action的默认方法是execute() 然后返回一个ActonForward对象
ActionForward()对象指向Jsp组件生成动态网页返回给客户;
Interceptor做一些拦截或者初始的工作
当外部的httpservletrequest到来时
初始到了servlet容器 传递给一个标准的过滤器链
ActionContextCleanUp这个在集成插件方面非常有用
Other filters(SitMesh,etc)
调用FilterDispatecher会去查找相应的ActionMapper
如果找到了相应的ActionMapper它将会将控制权限交给ActionProxy
ActionProxy将会通过ConfigurationManager来查找配置struts.xml
下一步将会 通过ActionInvocation来负责命令模式的实现(包括调用一些拦截Interceptor框架在调用action之前)
一旦action返回,会查找相应的Result
Result类型可以是 jsp或者freeMark 等
这些组件和ActionMapper一起返回给请求的url(注意拦截器的执行顺序)
响应的返回是通过我们在web.xml中配置的过滤器
如果ActionContextCleanUp是当前使用的,则FilterDispatecher将不会清理
sreadlocal ActionContext
如果ActionContextCleanUp不使用,则将会去清理sreadlocals