您的位置:首页 > 其它

关于拦截结果的监听器不能使用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().........无限循环啦
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐