一.总结
- 常用拦截器的执行步骤
- 登录中的拦截器执行过程
- 首先执行默认拦截器DefaultActionInvocation
- 首先执行其中的init方法
- 该方法创建Action,并将Action压入栈顶
-
- 首先执行其中的init方法
- 然后执行模型驱动拦截器ModelDrivenInterceptor
- 首先执行其中的intercept方法
- 该方法中获取模型驱动,并将模型压入栈顶
-
- 然后继续执行默认拦截器DefaultActionInvocation
- 执行该拦截器中的invoke方法
- 首先执行其中的intercept方法
- 然后执行赋值拦截器ParametersInterceptor
- 首先执行其中的doIntercept方法
- 该方法中获取request请求中的parameterMap中的请求数据。
- 然后调用setParameters(final Object action, ValueStack stack, final Map<String, Object> parameters)方法
- 在该方法中为Action中的属性赋值。
-
- 首先执行其中的doIntercept方法
- 首先执行默认拦截器DefaultActionInvocation
- 保存功能,拦截器的执行过程。
- 首先执行默认拦截器DefaultActionInvocation
- 执行其中的init方法,创建action并压入栈顶
- 然后执行ModelDrivenInterceptor
- 走了两次
- 一次是执行拦截器:actionMappingParams, Action映射赋值
- 一次是执行拦截器:Params,属性赋值
- 走了两次
- 执行ParametersInterceptor
- 此时parameters中无数据
- 再执行DefaultActionInvocation
- 再执行ParametersInterceptor
- 此时parameters中有页面传过来的数据
- 首先执行默认拦截器DefaultActionInvocation
- 总结:
- 实现模型驱动接口的Action,struts赋值执行流程
- 首先执行DefaultActionInvocation<com.opensymphony.xwork2.DefaultActionInvocation>判断要执行的拦截器,在该拦截器的init初始化方法中将请求的Action压入stack栈顶,然后执行invoke方法调用不同的拦截器
- 当DeafaultActionInvocation中invoke方法要执行modelDrive拦截器的时候,调用ModelDriven<com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor>拦截器。ModelDriven拦截器只负责将Model模型压入栈顶,也就是说此时action中的模型已经在栈中在ModelDriven压入的模型的下面。
- 当DeafaultActionInvocation中invoke方法要执行ActionMapping拦截器的时候,调用ParametersInterceptor<com.opensymphony.xwork2.interceptor.ParametersInterceptor>拦截器进行映射关系赋值。此时页面提交过来的parameters为空。
- 当DeafaultActionInvocation中invoke方法要执行params拦截器的时候,调用ParametersInterceptor拦截器进行Action属性赋值,此时页面提交过来的parameters有数据。
- 由于stack栈顶是ModelDriven拦截器压入的模型,所以赋值以该模型为先。就是说如果ModelDriven压入栈中的模型中如果存在与Action中属性名重名的属性,struts2的params拦截器会以ModelDriven压入栈的模型为先赋值、赋值结束后不会再对Action中同名属性进行赋值。如果ModelDriven压入栈的模型因为数据类型或者其他的原因赋值失败了,需要注意的是params拦截器也会终止为该属性继续赋值。
- Struts2拦截器赋值需要注意两点:
- 赋值时按照对象名称进行检索
- 赋值的时候对象在栈中的先后顺序决定了该对象是否会被赋值。
- 这个知识点是由于页面中的表单数据无法为目标Action中的属性赋值引起的?
- 原因就是因为模型驱动中提供了与Action中同名的属性。
- 实现模型驱动接口的Action,struts赋值执行流程