Struts2 拦截结果监听器(三十)

1.在前面的拦截器中,对execute()方法执行之前和之后都有动作,都定义在拦截器interceptor()方法中,为了精确定义在execute()方法执行结束之后,再处理result执行的动作,Struts2提供了用于拦截结果的监听器,拦截结果监听器通过手动注册给拦截器。

2.首先定义 监听器 必须实现 PreResultListener
package com.sh.interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.PreResultListener;

public class ResultListener implements PreResultListener{

	public void beforeResult(ActionInvocation invocation, String result) {
		System.out.println("拦截结果监听器执行。。。。");
		System.out.println("返回的视图结果为:"+result);
	}
	
}


3.定义拦截器
package com.sh.interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class ResultInterceptor extends AbstractInterceptor {

	@Override
	public String intercept(ActionInvocation ai) throws Exception {
		//注册自己定义的拦截结果监听器给拦截器
                ai.addPreResultListener(new ResultListener());
		System.out.println("execute()方法执行之前。。。。");
		String result=ai.invoke();
		System.out.println("execute()执行之后。。。。");
		return result;
	}
	
}

action
package com.sh.action;

import com.opensymphony.xwork2.ActionSupport;

public class OrderAction extends ActionSupport{
	public String execute(){
		return SUCCESS;
	}
}


struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts> 
	<!-- 如果 注解的action配置改变时候不需要重新启动tomcate -->
	<constant name="struts.devMode" value="false"/>  
    <constant name="struts.convention.classes.reload" value="true" /> 
	
	<package name="default" extends="struts-default">
		<interceptors>
			<interceptor name="resultInterceptor" class="com.sh.interceptor.ResultInterceptor"/>
		</interceptors>
		
		<action name="order" class="com.sh.action.OrderAction">
			<result>/index.jsp</result>
			<interceptor-ref name="defaultStack"/>
			<interceptor-ref name="resultInterceptor"/>
		</action>
	</package>
    
</struts>


--访问
http://localhost:8080/Struts2_PreResultListener/order.action

--控制台输出
execute()方法执行之前。。。。
拦截结果监听器执行。。。。
返回的视图结果为:success
execute()执行之后。。。。

你可能感兴趣的:(拦截器,监听器,拦截结果监听器)