Struts2_拦截器_简单介绍

3 阅读2分钟

Struts2_拦截器_简单介绍

一、初始介绍:

1. 案例:计算execute运行的时间:

##### <1>分析:
 1. 在struts.xml配置文件即将进入action01中时,对事件进行拦截,开始计时
 2. 当action中事件执行完成,终止拦截,结束计时
<2>代码执行:

1.所需jar包

	asm-3.3.jar
	asm-commons-3.3.jar
	asm-tree-3.3.jar
	commons-chain-1.2.jar
	commons-fileupload-1.3.jar
	commons-io-2.0.1.jar
	commons-lang3-3.1.jar
	commons-logging-1.1.3.jar
	freemarker-2.3.19.jar
	javassist-3.11.0.GA.jar
	jcommon-1.0.23.jar
	jfreechart-1.0.19.jar
	log4j-1.2.17.jar
	mysql-connector-java-5.1.8-bin.jar
	ognl-3.0.6.jar
	struts2-core-2.3.15.3.jar
	struts2-jfreechart-plugin-2.3.4.1.jar
	struts2-json-plugin-2.3.4.1.jar
	xwork-core-2.3.15.3.jar

2.web.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

  <!-- 配置核心控制器  -->
  <filter>
  	<filter-name>strutsFilter</filter-name>
  	<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>strutsFilter</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

3.新建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>
<package name="day06"  extends="struts-default">
	<!-- 声明拦截器 -->
	<interceptors>
		 <interceptor name="timeInterceptor" class="interceptor.TimeInterceptor"></interceptor>
		
		<!-- 声明拦截器栈  -->
		<interceptor-stack name="myStack">
			<interceptor-ref name="defaultStack"></interceptor-ref>
			<interceptor-ref name="timeInterceptor"></interceptor-ref>
		</interceptor-stack>
	</interceptors>
	
	<!-- 全局result 适用于所有的action中配置 -->
	<global-results>
			<result name="error">/error.jsp</result>
	</global-results>
	
	<!-- 全局异常 -->
	<global-exception-mappings>
	    <!-- 如果action类中出现异常 跳转到error字符串对应的页面 -->
	  <exception-mapping result="error" exception="java.lang.RuntimeException"></exception-mapping>
	</global-exception-mappings>
	
	<action name="ac01" class="action.Action01">
		<!-- 配置拦截器到需要的action上 -->
		<interceptor-ref name="timeInterceptor"></interceptor-ref>
		<!-- 
		   a.action中 如果没有配置任何拦截器  struts会默认提供一个 defaultStack(默认拦截器栈 params等)
		   b.一旦你配置了一个拦截器 默认的deufaultStack就不会在提供了    一定要将defaultStack手动配置了   			
		 -->
		 <interceptor-ref name="defaultStack"></interceptor-ref>
		<result>/index.jsp</result>
	</action>
	<action name="ac02" class="action.Action02">
		<interceptor-ref name="myStack"></interceptor-ref>
		<result>/index.jsp</result>
	</action>
</package>

4.编写action类

1. (action01)
	package action;
	public class Action01  extends BaseAction{
		@Override
		public String execute() throws Exception {
			String s ="";
			for(int i=0;i<100000;i++){
				s+="a";
			}
			return SUCCESS;
		}
	}

2. (action02)
    package action;
	public class Action02  extends BaseAction{
		@Override
		public String execute() throws Exception {
			StringBuffer buffer = new StringBuffer("");
			for(int i=0;i<100000;i++){
				buffer.append("a");
			}
			return SUCCESS;
		}
	}

5.编写拦截器(interceptor)

package interceptor;
import java.io.FileWriter;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
//计算时间 
public class TimeInterceptor  extends AbstractInterceptor {
/**
 * ActionInvocation:action对象和拦截器对象的调用执行对象
 */
@Override
public String intercept(ActionInvocation invocation) throws Exception {
	long start = System.currentTimeMillis();
	//调用后续的拦截器或者action对象
	   //如果action对象被调用  那么result没有意义
	   //如果action对象没有被调用  那么result标识jsp页面
	String result = invocation.invoke();//execute就被调用执行了
	long end = System.currentTimeMillis();
	long time = end-start;
	//获取action类名 方法名  Class
	String actionClassName = invocation.getAction().getClass().getSimpleName();
	String actionMethodName = invocation.getProxy().getMethod();
	String  info = "类名:"+actionClassName+",方法名"+actionMethodName+",花了"+time+"毫秒";
	System.out.println(info);
	//往磁盘文件输出info
	FileWriter fw = new FileWriter("d:\\8b.txt",true);
	fw.write(info);
	fw.close();
	return result;
	}
}

6.分别访问:

localhost:8080/struts1201/ac01
localhost:8080/struts1201/ac02