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
等类似的;
文件上传到蛮简单的;
8
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>
转发至微博
转发至微博
在LOFTER的更多文章
关闭
玩LOFTER,免费冲印20张照片,人人有奖!
我要抢>
{/if} {/list}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{/if}
评论