关于拦截结果的监听器不能使用invocation.invoke()!
2013-04-01 13:01
357 查看
<?xml version="1.0" encoding="GBK"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" "http://struts.apache.org/dtds/struts-2.1.7.dtd"> <struts> <!-- 通过常量配置Struts 2的国际化资源信息 --> <constant name="struts.custom.i18n.resources" value="mess"/> <!-- 通过常量配置Struts 2所使用的解码集--> <constant name="struts.i18n.encoding" value="GBK"/> <!-- 配置本系统所使用的包 --> <package name="lee" extends="struts-default"> <!-- 应用所需使用的拦截器都在该元素下配置 --> <interceptors> <!-- 配置mysimple拦截器 --> <interceptor name="mysimple" class="org.crazyit.app.interceptor.BeforeResultInterceptor"> <!-- 为拦截器指定参数值 --> <param name="name">简单拦截器</param> </interceptor> </interceptors> <action name="loginPro" class="org.crazyit.app.action.LoginAction"> <result name="error">/WEB-INF/content/error.jsp</result> <result name="success">/WEB-INF/content/welcome.jsp</result> <!-- 配置系统的默认拦截器 --> <interceptor-ref name="defaultStack"/> <!-- 应用自定义的mysimple拦截器 --> <interceptor-ref name="mysimple"> <param name="name">改名后的拦截器</param> </interceptor-ref> </action> <action name="*"> <result>/WEB-INF/content/{1}.jsp</result> </action> </package> </struts>
拦截器类:
package org.crazyit.app.interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import java.util.*;
import org.crazyit.app.action.*;
/**
* Description:
* <br/>网站: <a href="http://www.crazyit.org">疯狂Java联盟</a>
* <br/>Copyright (C), 2001-2012, Yeeku.H.Lee
* <br/>This program is protected by copyright laws.
* <br/>Program Name:
* <br/>Date:
* @author Yeeku.H.Lee kongyeeku@163.com
* @version 1.0
*/
public class BeforeResultInterceptor
extends AbstractInterceptor
{
public String intercept(ActionInvocation invocation)
throws Exception
{
//将一个拦截结果的监听器注册给该拦截器
invocation.addPreResultListener(new MyPreResultListener());
System.out.println("execute方法执行之前的拦截...");
//调用下一个拦截器,或者Action的执行方法
String result = invocation.invoke();
System.out.println("execute方法执行之后的拦截...");
return result;
}
}
监听上面拦截器结果的类:
package org.crazyit.app.interceptor;
import com.opensymphony.xwork2.interceptor.*;
import com.opensymphony.xwork2.ActionInvocation;
/**
* Description:
* <br/>网站: <a href="http://www.crazyit.org">疯狂Java联盟</a>
* <br/>Copyright (C), 2001-2012, Yeeku.H.Lee
* <br/>This program is protected by copyright laws.
* <br/>Program Name:
* <br/>Date:
* @author Yeeku.H.Lee kongyeeku@163.com
* @version 1.0
*/
public class MyPreResultListener
implements PreResultListener
{
//定义在处理Result之前的行为
public void beforeResult(ActionInvocation invocation
,String resultCode)
{
//打印出执行结果
System.out.println("返回的逻辑视图为:" + resultCode);
try
{
invocation.invoke();
}
catch (Exception ex)
{
ex.printStackTrace();
}
finally
{
}
}
}
上面可以实现拦截器结果的监听器,上面的监听器虽然也可以传入ActionInvocation,但是切记不能在beforeResult()中使用invovation.invoke()方法,这样会导致死循环:
因为会在Action结果返回之前会先调用监听器中的beforeResult()方法,然后beforeResult方法中,又会调用invovation.invoke()方法,又会返回一个Action处理结果,然后又会在结果出现之前会再次调用beforeResult()方法→invoke()→返回结果之前→beforeResult()→invoke().........无限循环啦
相关文章推荐
- 关于使用security和静态资源被拦截的问题
- selenium+python关于登录的脚本代码,使用了读取excel以及向excel中写入测试结果的方法
- 关于更改ip后dbconsole服务不能启动(em不能使用)问题的根本解决方法
- 关于cocos2dx3.0 UITextField不能使用退格键删除字符的解决方式
- 关于c++中GetIDsOfNames与Invoke的使用~
- 关于php语言限制,使用http协议不能及时返回客户端方法解决方案
- 关于arcmap的VBA不能使用解决办法
- 关于split分割字符串,空结果不能得到的问题(转)
- 关于Linux kernel 3.14 使用hook抓包不能成功的一点记录
- 关于ueditor编辑器插件的使用记录 --- 解决"后端配置项没有正常加载,上传插件不能正常使用"上传图片处的问题
- 关于在extjs中使用column布局,不能显示textfield的标签(fieldLabel)解决方法
- 关于Axis2 Eclipse plugin在eclipse中不能使用的问题
- 关于解决win8.1 不能使用Net Framework 3.5的方法
- jquery mobile+iscroll使用时关于页面不能操作input标签问题
- 关于使用SpringSecurity不能设置Session并发无效、剔除前一个用户无效的核心解决方案
- IIS7.0发布后关于"不能在此路径中使用此配置节”的解决办法
- windows server 2012 下IIS8.5关于“ 配置错误 不能在此路径中使用此配置节”的解决办法
- 关于EAS中供应链管理的kdtable不能直接使用ctrl+c、v进行复制、粘贴的问题
- 关于RedHat6在VMware中克隆产生的网卡不能使用解决办法
- 关于oracle11g RAC 监听器使用中出现的no services以及no listener分析