struts2 18拦截器详解(十九) --- DefaultWorkflowInterceptor
来源:互联网 发布:vb基础入门教程 编辑:程序博客网 时间:2024/06/05 08:23
DefaultWorkflowInterceptor
DefaultWorkflowInterceptor拦截器处于defaultStack第十八的位置,为defaultStack拦截器栈中的最后一个拦截器,其主要功能是判断当前Action的执行过程有无错误,包含ActionError与FieldError两种,例如在请求参数类型转换出错后就会添加FieldError。如果执行过程中有错误则会跳转到指定的Result(默认为input)。该拦截器继承自MethodFilterInterceptor类,所以也可以配置哪些方法要应用上该拦截器,哪些方法不要应用上该拦截器,下面是该拦截器在defaultStack中的配置:
<interceptor-ref name="workflow"> <param name="excludeMethods">input,back,cancel,browse</param></interceptor-ref>
也就是说明对于Action的input,back,cancel,browse方法是不会应用上该拦截器的。
下面是该拦截器的doIntercept方法源码:
@Overrideprotected String doIntercept(ActionInvocation invocation) throws Exception { Object action = invocation.getAction();//获取当前执行的Action对象//判断Action是否实现了ValidationAware,继承自ActionSupport类的Action即实现了该接口 if (action instanceof ValidationAware) { ValidationAware validationAwareAction = (ValidationAware) action;//强转//判断Action执行过程中有无错误 if (validationAwareAction.hasErrors()) { if (LOG.isDebugEnabled()) { LOG.debug("Errors on action " + validationAwareAction + ", returning result name 'input'"); }//inputResultName属性值为"input",这是在该拦截器写死的 String resultName = inputResultName;//Action有无实现ValidationWorkflowAware接口 if (action instanceof ValidationWorkflowAware) { //如果实现了则由Aciton的getInputResultName()方法决定resultName的值 resultName = ((ValidationWorkflowAware) action).getInputResultName(); }//判断当前Action要执行的方法上是否标有InputConfig注解 InputConfig annotation = action.getClass().getMethod(invocation.getProxy().getMethod(), EMPTY_CLASS_ARRAY).getAnnotation(InputConfig.class); if (annotation != null) { if (!annotation.methodName().equals("")) {//如果InputConfig注解的methodName属性长度不为0 Method method = action.getClass().getMethod(annotation.methodName());//获取Action中由InputConfig注解的methodName属性指定的方法 resultName = (String) method.invoke(action);//则resultName由该方法的返回值决定 } else {//否则由InputConfig注解的resultName属性值决定 resultName = annotation.resultName(); } }//将resultName值返回 return resultName; } }//如果Action没有实现ValidationAware接口则直接执行Action中的方法 return invocation.invoke();}
学过struts2的肯定知道,如果Action执行的过程出了错(当然前提是添加到了ActionError或FieldError中)就会转向一个名为input的Result,其实就是通过该拦截器实现的,这也是为什么这个Result的名字为input的原因。当然这个Result的名字是可以改的,方式就有很多了:
1.给该拦截器在配置文件上传递一个名为inputResultName的参数,其值由自己决定
2.让Aciton实现ValidationWorkflowAware接口,Result名字就会由ValidationWorkflowAware接口中声明的getInputResultName方法决定
3.在Action中执行的方法上面添加InputConfig注解,该注解有两个属性:methodName-->用于指定当前Action中的一个方法名称,用该方法的返回值作为Result名字;resultName-->直接指定Result名字。
最后调用invocation.invoke();执行Action中的方法,因为在defaultStack中这已经是最后一个拦截器,所以调用的是Action中的方法了......
- struts2 18拦截器详解(十九) --- DefaultWorkflowInterceptor
- Struts2拦截器详解
- Struts2拦截器详解
- Struts2拦截器详解
- struts2拦截器详解
- struts2 拦截器详解
- Struts2 拦截器 详解
- Struts2拦截器详解
- Struts2拦截器详解
- Struts2拦截器详解
- Struts2拦截器详解
- Struts2 拦截器详解
- struts2拦截器详解
- Struts2拦截器详解
- Struts2--拦截器详解
- Struts2拦截器详解
- struts2拦截器详解
- struts2拦截器详解
- Excel导入数据库(一)
- 黑马程序员-Java高新技术之类加载器和代理
- Django学习笔记
- iOS 7用户界面过渡指南(下):更新UI
- 某资深程序员写给后来者的忠告
- struts2 18拦截器详解(十九) --- DefaultWorkflowInterceptor
- Lock wait timeout exceeded; try restarting transaction
- Css 重新学习 关于reset.css
- 创建滚动条
- expect spawn、linux expect 用法小记
- 【phonegap】使用的java与js互相调用的原理
- IOS 之 螺旋仪与加速计, 磁力计
- 基于 OpenFlow 实现网络虚拟化
- matlab用鼠标对感兴趣区域的提取(如画线,画圆,画多边形等)