struts2中默认拦截器栈中的拦截器…

本文介绍了Struts2框架中的默认拦截器栈,包括其工作原理和常见拦截器的作用,帮助理解Struts2的请求处理流程。
摘要由CSDN通过智能技术生成

1:  com.opensymphony.xwork2.interceptor.ExceptionMappingIntercep tor

        While you can configure exception mapping in your configuration file at any point, the configuration
        * will not have any effect if this interceptor is not in the interceptor stack for your actions.
        It is recommended that
        * you make this interceptor the first interceptor on the stack,
        ensuring that it has full access to catch any
        * exception, even those caused by other interceptors.
        这句话的意思是你可以配置异常在任何位置,只要这个拦截器没有加入生效的拦截器栈中,该拦截器就不会生效;
        官方建议,将异常拦截器配置在拦截器的第一个位置,因为只有这样才能更好的捕获异常,甚至是
        其他拦截器发生的异常;
        @Override
            public String intercept(ActionInvocation invocation) throws Exception {
            String result;

            try {
                  result = invocation.invoke();
            } catch (Exception e) {
                  if (isLogEnabled()) {
                  handleLogging(e);
                  }
                  List<ExceptionMappingConfig> exceptionMappings =
                  invocation.getProxy().getConfig().getExceptionMappings();
                  ExceptionMappingConfig mappingConfig =
                  this.findMappingFromException s(exceptionMappings, e);
                  if (mappingConfig != null && mappingConfig.getResult()!=null) {
                  Map parameterMap = mappingConfig.getParams();
                  // create a mutable HashMap since some interceptors will remove parameters, and parameterMap is immutable
                  invocation.getInvocationContext().setParameters(new HashMap<String, Object>(parameterMap));
                  result = mappingConfig.getResult();
                  publishException(invocation, new ExceptionHolder(e));
                  } else {
                  throw e;
                  }
            }

            return result;
            }
      这个拦截器的关键代码:
      这段代码的意思是,ActionInvocation调用栈中下一个的拦截器或者action对象(统称为元素);
      对这个调用进行try catch 捕获;
      如果调用这个方法不抛异常,直接将invoke方法的结果返回,回到ActionInvocation中继续执行栈中的下一个元素
      (可能是拦截器,也有可能是action类);
      如果调用invoke方法发生异常了对异常进行捕获;首先从配置文件中找到配置的所有异常处理配置项对应的那个map集合;
      用捕获的Exception为key去该map中找,看是否有对该异常的处理配置A,尤其是发生异常后的跳转页面B;
      如果has(A&&B),为false,即没有对应的配置,直接抛出该异常;交给服务器去管理;
      如果有该异常对应的处理配置,即异常的跳转页面;取出配置,
      将一些异常配置信息信息放入到ActionContext中的请求参数集合中去;
      同时将异常信息压入栈中,供调试获取显示输出用;
      异常处理完成;
      我们知道action的默认方法execute中抛出Exception父类;
      我们必须要知道,对应struts执行过程中可能出现的异常进行捕获,跳转到相应页面,尤其是
      业务逻辑异常,要给用户明确的提示;最后要配置异常和错误的父类,以捕获所有的异常;避免将异常直接抛给用户;
      为保险起见,在struts中配置了,在web.xml中也要进行配置;

2:  com.opensymphony.xwork2.interceptor.AliasInterceptor:
      这个拦截器的意思就是如果你在struts.xml文件中为action配置了参数;类似于这个
    <action name="register" class="com.itheima.web.struts.actions.RegisterAction" >
                          <interceptor-ref name="defaultStack"/>
                          <result type="chain">register2</result>
              </action>
              <action name="register2" class="com.itheima.web.struts.actions.RegisterAction2" >
                          <param name="aliases">#{'myname':'name','myvalue':'value'}</param>
                          <interceptor-ref name="defaultStack"/>
                          <result>/index.jsp</result>
      </action>
      假设register有属性名称为myname,myvalue
      而register2中有属性名称为name,value;
      如果定义了该拦截器(默认栈中有),并配置了该<param name="aliases">#{'myname':'name','myvalue':'value'}</param>
      属性;记住param中aliases是固定的;
      那么这个拦截器会将myname属性的值copy到name属性上,将myvalue属性的值copy到value属性上;
      同时在register2这个action中对应的类必须要有setAliases方法,否则会报错;
      这个拦截器在使用chain这个结果视图类型时很有用;
      但是chain这种转发类型请慎用;

3:org.apache.struts2.interceptor.ServletConfigInterceptor
  是为你的action类自动注入web开发常用的对象,当然前提是你必须实现对应的接口:
  ServletContextAware}
  ServletRequestAware}
  ServletResponseAware}
  ParameterAware}
  RequestAware}
  SessionAware}
  ApplicationAware}
  PrincipalAware}
  实现了这些接口,你覆盖了对应的setServletContext();方法,这个拦截器会为你注入对应的web开发常用的对象;
  struts2中的依赖注入功能;但是一般不会这么干,我们直接就通过ServletActionContext或者ActionContext进行获取;
  两者关系,后者是父类,前者是子类,功能更加强大;

4:com.opensymphony.xwork2.interceptor.I18nInterceptor
  这个我只能说是国际化的拦截器,他是通过对请求参数进行判断;
  看你是否带着request_locale参数,如果有不管你设置了什么值,都给你注入到对应的域范围;
  这里是request;如果你设置的本地化参数仅仅是想对本次请求生效的话;请使用:request_only_locale
  比如:
  foo.action?request_locale=en_US

5 com.opensymphony.xwork2.interceptor.PrepareInterceptor
  定义这个拦截器的action类,要实现com.opensymphony.xwork2.Preparable,并覆盖prepare方法;
  这个方法是指在执行真正的目标方法之前(不是ActionProxy代理类的方法执行),执行一些业务逻辑操作;
  由于这个拦截器继承了com.opensymphony.xwork2.interceptor.MethodFilterInterceptor,因此可以针对指定方法
  进行prepare操作;--就是说这个配置只对指定方法生效;
  当然必须得配置好这个拦截器;---默认拦截器栈中有;
  当你的action中的目标方法需要一些预定义的参数信息来实现的话,比如依赖于某个对象,要先加载;
  可以使用该拦截器;---可能用到的地方--
  数据库中;

6:com.opensymphony.xwork2.interceptor.ChainingInterceptor
  这个拦截器的作用是将ValueStack中的所有的对象属性都copy到当前执行的action中去,当然有几个
  不是:Errors, Field errors and Message如果你需要的话,可以定义几个常量:
  <li>struts.xwork.chaining.copyErrors - set to true to copy Action Errors</li>
  <li>struts.xwork.chaining.copyFieldErrors - set to true to copy Field Errors</li>
  <li>struts.xwork.chaining.copyMessages - set to true to copy Action Messages</li>
  这个拦截器是在定义chain这个结果视图时被用到,我们定义该结果视图时,
  其实--发送了几次请求啊.一次
  proxy = actionProxyFactory.createActionProxy(finalNamespace, finalActionName, finalMethodName, extraContext);
  proxy.execute();
  这个执行流程是这样的,当我们返回了chain视图,时,是将我们当前的action的所有数据(errors等三个除外,但是可以配置)
  拷贝到新创建的ActionProxy中,并执行该proxy代理,并返回这个代理的执行结果视图;
  转到你配置的那个action中取;从而实现了action之间的数据共享;或者说不同的action之间跳转,数据的共享;

  7:org.apache.struts2.interceptor.FileUploadInterceptor
  拦截器的作用主要是供文件上传的,他还是依赖第三方jar包,fileupload和commons-io的支持;
  这个拦截器主要基于这个MultiPartRequestWrapper多部分表单数据请求封装类进行工作的;
  特性和servlet3.0规范中的文件上传注解;
  对于文件上传可能出现的错误,我们可以配置相关的信息到struts-messages.properties文件(在struts-core核心包下面有)中去,
  几个key:
  struts.messages.error.uploading
  struts.messages.error.file.too.large
  struts.messages.error.content.type.not.allowed
  struts.messages.error.file.extension.not.allowed
  等类似的;
  文件上传到蛮简单的;

org.apache.struts2.interceptor.CheckboxInterceptor在表单中设置某个隐藏的checked;名称为__checkbox_
    而且不能有同名可见的副本;才调用到该拦截器的核心功能才生效
    如果这个隐藏的checked没有被提交,在parameters对应的集合中有uncheckedValue的key对应的值为false
    我也不知道这个到底有什么用;
    这个是在当你的表单中有checkbox,而对应的javabean中的属性是是boolean型,而你给的初始值为
    true,而你的表单提交的时候,checkbox中没有选中,返回的值本来应该是false的;
    但是这个默认的值确起作用了,把他该为true;
    解决方案:
    1 使用包装类Boolean
    2 使用该拦截器;



9 org.apache.struts2.interceptor.MultiselectInterceptor
  和8类似,当表单中存在不可见的名称为__multiselect_的字段属性,且不存在同名可见的元素;
  该拦截器生效,作用我猜想类似8;

10 com.opensymphony.xwork2.interceptor.StaticParametersIntercep tor
    这个拦截器是将配置在action中的param参数封装进请求参数map中即parametersMap中;
    但是你不能将该拦截器的配置参数merge配置文false,否则不会将这个参数放到parametersMap中去;
11 org.apache.struts2.interceptor.ActionMappingParametersI nteceptor
    类似于12com.opensymphony.xwork2.interceptor.ParametersInterceptor拦截器,11是12的子类;
    只是他只针对actionMapping中配置的params参数将其加入到ActionContext中parametersMap中;


12com.opensymphony.xwork2.interceptor.ParametersInterceptor

疑问为什么要搞三个params拦截器呢,反正都对应的是那一个map,parametersMap;
疑问:actionMapping对应的getParams()是指的什么
actionProxy.getConfig()对应的又是哪个;
这个没搞懂什么都白搭;
   
  separate aware:分离关注:解耦;实现任务的拆解;
  成员变量:最好叫实例变量;
  创建某个类的对象最好叫做创建某个类的实例instance;

  13 org.apache.struts2.interceptor.RolesInterceptor
  该拦截器会将你配置的action,仅仅只对指定角色的人允许访问,其他人访问报403状态码;即禁止访问;
  <action name="index" class="com.itheima.web.struts.actions.LoginAction" >
                            <interceptor-ref name="roles">
                            <param name="allowedRoles">admin,member</param>
                            </interceptor-ref>
            <interceptor-ref name="defaultStack"/>
                          <result>/index.jsp</result>
  </action>

  14org.apache.struts2.interceptor.CookieInterceptor
  这个拦截器可以给cookie注值;

  15org.apache.struts2.interceptor.MessageStoreInterceptor
    可以将action(实现ValidationAware,ActionSupport实现了该接口)中的校验消息,错误消息从request范围延伸到
    session范围;
    com.opensymphony.xwork2.spring.interceptor.ActionAutowiringIntercep tor
    是将action自动装配到spring中去的拦截器;
 
  16org.apache.struts2.interceptor.ScopeInterceptor
当我们的action中有一些参数需要使用,而且在其他action中也需要使用的时候,将这些参数拷贝到session范围或者应用范围
但是他容易产生安全问题,可以用这个拦截器;
猜测:OpenSessionInView可能要用到;

17org.apache.struts2.interceptor.CreateSessionInterceptor
  重新创建session,在使用freemarker时候用到;
<script type="text/javascript" id="wumiiRelatedItems"> </script>
 
阅读(61) | 评论(0)
推荐 转载
历史上的今天
最近读者
热度
在LOFTER的更多文章
评论
{if x.visitorName==visitor.userName} ${x.visitorNickname|escape} {else} ${x.visitorNickname|escape} {/if}
{if x.moveFrom=='wap'}   {elseif x.moveFrom=='iphone'}   {elseif x.moveFrom=='android'}   {elseif x.moveFrom=='mobile'}   {/if} ${fn(x.visitorNickname,8)|escape}
{/if} {/list}
${a.selfIntro|escape}{if great260}${suplement}{/if}
 
{/if}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值