JavaWeb----学习(31)----struts2---Struts2运行流程分析

JavaWeb----学习(31)----struts2---Struts2运行流程分析

 1.浏览器发送请求---->StrutsPrepareAndExecuteFilter.doFilter(ServletRequest, ServletResponse, FilterChain)

                             ---->StrutsActionProxy.execute()

                             ---->DefaultActionInvocation.invoke()

                        (从此开始调用个个拦截器的intercept方法,结束后回调DefaultActionInvocation.invoke()方法

                           直到struts-default.xml文件中配置的所有拦截器被调用完毕执行目标action的方法)

                            ---->ExceptionMappingInterceptor.intercept(ActionInvocation)  

                            ---->DefaultActionInvocation.invoke()

                           .................................................................................................

                            ---->DebuggingInterceptor.intercept(ActionInvocation)

                            ---->DefaultActionInvocation.invoke()

                       (调用到最后一个拦截器后调用DefaultActionInvocation.invokeActionOnly()方法)

                             ---->DefaultActionInvocation.invokeActionOnly()

                             ---->EmpAction.delete()   (调用请求目标方法)

struts-default.xml文件中配置的所有拦截器

  <interceptor-stack name="paramsPrepareParamsStack">
                <interceptor-ref name="exception"/>
                <interceptor-ref name="alias"/>
                <interceptor-ref name="i18n"/>
                <interceptor-ref name="checkbox"/>
                <interceptor-ref name="multiselect"/>
                <interceptor-ref name="params">
                    <param name="excludeParams">dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*</param>
                </interceptor-ref>
                <interceptor-ref name="servletConfig"/>
                <interceptor-ref name="prepare"/>
                <interceptor-ref name="chain"/>
                <interceptor-ref name="modelDriven"/>
                <interceptor-ref name="fileUpload"/>
                <interceptor-ref name="staticParams"/>
                <interceptor-ref name="actionMappingParams"/>
                <interceptor-ref name="params">
                    <param name="excludeParams">dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*</param>
                </interceptor-ref>
                <interceptor-ref name="conversionError"/>
                <interceptor-ref name="validation">
                    <param name="excludeMethods">input,back,cancel,browse</param>
                </interceptor-ref>
                <interceptor-ref name="workflow">
                    <param name="excludeMethods">input,back,cancel,browse</param>
                </interceptor-ref>
            </interceptor-stack>

2. Params 拦截器:

        Parameters 拦截器将把表单字段映射到 ValueStack 栈的栈顶对象的各个属性中

        如果某个字段在模型里没有匹配的属性, Param 拦截器将尝试 ValueStack 栈中的下一个对象

        问题:参数是如何从页面表单传到action中的?

                   页面有name字段,发送请求时,通过Params 拦截器,值赋给栈顶对象的属性,此时栈顶对象即为 当前action

                   在action里面存在与之对应的name属性,所以赋值成功。

 

----------------------------------------------------------------------手动分割线------------------------------------------------------------------------------------

补充:

 

JavaWeb----学习(31)----struts2---Struts2运行流程分析

Struts2 运行流程分析:

            1.  请求发送给 StrutsPrepareAndExecuteFilter(web,xml文件中配置的过滤器)

            2.   StrutsPrepareAndExecuteFilter 询问 ActionMapper

                           该请求是否是一个 Struts2 请求(即是否返回一个非空的 ActionMapping 对象)

            3.  若 ActionMapper 认为该请求是一个 Struts2 请求,

                 则 StrutsPrepareAndExecuteFilter 把请求的处理交给 ActionProxy

            4.  ActionProxy 通过 Configuration Manager 询问框架的配置文件,确定需要调用Action 类及 Action 方法

            5.  ActionProxy 创建ActionInvocation 的实例,并进行初始化

            6.  ActionInvocation 实例负责在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。

            7. Action 执行完毕,ActionInvocation 负责根据 struts.xml 的配置找到对应的返回结果

                       调用结果的 execute 方法,渲染结果。在渲染的过程中可以使用Struts2 框架中的标签(TagSubsystem)。

            8.  执行各个拦截器 invocation.invoke() 之后的代码

            9.  把结果发送到客户端

其中涉及到的相关API:

            1.ActionMapping:

             2.ActionMapper:

             3.ActionProxy

             4. ActionInvocation