Struts2源码流程

Xwork 命令模式 ---> webXork多了一些拦截器 --90%代码-->   Struts出名。
Struts 2核心入口  StrutsPrepareAndExecuteFilter

Filter具备的生命周期,它的生命周期主要是init(),doFilter(),destroy() 分三部分:
   (1)当服务器启动的时候加载过滤器,并调用init () 方法进行初始化。
   (2)每个请求调用执行doFilter () 方法执行流程。
   (3)最后通过调用destroy()方法销毁实例。
init ()
初始化的时候,也是在Dispatcher里面通过模版模式初始化struts。而模版模式主要解决了流程统一,以及减少代码冗余。
init_TraditionalXmlConfigurations(); 初始化Struts2的自带配置文件struts.xml , struts-defut.xml ,struts-plugin.xml 。
init_PreloadConfiguration();把配置文件放进容器里。
init_LegacyStrutsProperties();加载struts自带配置文件struts.xml , struts-defut.xml ,struts-plugin.xml 。

init_PreloadConfiguration();把配置文件放进容器里,初始化容器。

struts2自带了一个IOC容器,init方法主要是构建这个容器,并且使用模板模式加载struts2 的配置文件并注入到IOC容器。使用ioc容器来管理我们的对象,降低对象之间的耦合度。

然后进入dofilter方法,dofilter方法主要是将请求对象进行了重新包装。
Struts2源码的实现主要是通过Filter过滤器进行过滤拦截。
StrutsPrepareAndExecuteFilter提供了doFilter(),此方法传入了3个操作参数。

ServletRequest 请求信息, ServletResponse 响应信息 , FilterChain过滤链 ,FilterChain过滤链开发者很好运用到了职责链模式思想。通过过滤链获得请求信息与响应的信息。
应用职责链模式解决多个对象处理一个请求的问题。struts2源码中就是通过职责链模式解决到多个Filter()。

首先是将servletRequest转换成高级 HttpServletRequest 。
调用setEncodingandlocale方法,处理编码和国际化,struts2的默认编码式utf-8,所以在使用struts2时不存在乱码问题。

在调用CreateActionContext方法,创建ActionContext,也就是Action的上下文,ActionContext主要是 封装了所有与action交互数据的对象。通过容器得到值栈,然后将servlet api 以map的形式封装起来并 放到值栈里面。Struts与 Servlet 解耦的地方,所以OGNL可以直接访问Http了。最后将用户请求封装Map 返回。

调用passignDispatcherToThread ()方法处理线程不安全。
ThreadLocal 线程本地变量,也是解决每个变量线程复制一份,对每个线程进行绑定,这样就不会造成线程不安全。

通过configurationManager 得到config,通过config得到actionProxy,也就是action的代理类。调用代理类的execute方法,actionProxy里面有 一个调度器,execute方法调用调度器里面的invoke方法,调度器的invoke方法主要是迭代所有的拦截器 ,并调用拦截器的intercept方法,这里使用了职责链模式,调用完拦截器之后才真正执行我们action。通过调用Action执行不同的方法就是用到了命令模式。

为什么使用代理模式
代理 ActionProxy
被代理 Action
Action不能直接访问actionProxy
用户直接访问请求很多东西 没有处理 没操作完。如国际化、验证、拦截器等。
为什么用职责链模式
用户处理请求提出一系列复杂请求。
一个链执行一个请求。
为什么要用命令模式
把不同的方法封装成同一方法。
用户请求方法全成了execute()方法

拦截器
struts-defut.xml
<bean>  对象之间的依赖关系,降低代码的耦合度。
Intercentorc    Struts2 三十多个拦截器
把几个拦截器进行分组,出现了Stack
<default-interceptor-ref name="defaultStack"/>
<!-- 用来限制Struts 启动时调用的栈 -->
Action默认18个拦截器
Struts什么都不做的时候也会执行栈。

Exception 执行了一行代码,设计巧妙
把所有的拦截器包括自己都能捕捉的到,处理异常。
任何情况下都要捕捉异常往后传,出错的机会大。好处:对用户的提示很任性化。

ServletConfig 在所有的Action访问Servlet 对象
每个接口对应一个对象,实现不同的接口对应不同的对象。

Prepare 准备工作 Action执行之前
  用在Action之前必须做的事情。 实现Preparable接口 重写prepare()方法。

ModelDriven 模型驱动
在以前jsp页面拿值都是用对象点属性
实现ModelDriven 重写getModel()直接属性
Stack.push(model); 放到了栈顶。

你可能感兴趣的:(struts2)