一、接文章十二在struts-demo.xml中,声明拦截器、定义拦截器栈xml配置如下:
<!-- 声明拦截器 -->
<interceptors>
<interceptor name="mytime" class="interceptor.MyTimeInterceptor"></interceptor>
<!-- 定义拦拦截器栈 -->
<interceptor-stack name="myinterceptorstack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="mytime"></interceptor-ref>
</interceptor-stack>
</interceptors>
整体xml文件为:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="demo" namespace="" extends="base">
<!-- 声明拦截器 -->
<interceptors>
<interceptor name="mytime" class="interceptor.MyTimeInterceptor"></interceptor>
<!-- 定义拦拦截器栈 -->
<interceptor-stack name="myinterceptorstack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="mytime"></interceptor-ref>
</interceptor-stack>
</interceptors>
<action name="date" class="action.DataTypeConvertAction" >
<result name="ok">/dateType.jsp</result>
</action>
<action name="fileup" class="action.FileupAction" >
<result name="ok">/fileup.jsp</result>
</action>
<action name="down" class="action.DownAction" >
<result name="ok" type="stream">
<!--有输出中文的时使用 param name="contentType">application/octet-stream;charset=utf-8</param -->
<param name="contentType">application/x-msdownload</param>
<param name="inputName">tagFile</param>
<param name="contentDisposition">filename=${filename}</param>
</result>
</action>
</package>
</struts>
注意:声明拦截器配置必须放在xml最前部分,要定义一个拦截器栈并在栈中将struts2的默认拦截器继承下来因为其他功能都是基于默认拦截器实现的
二、在fileup action 中引用拦截器栈
<interceptor-ref name="myinterceptorstack"></interceptor-ref>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="demo" namespace="" extends="base">
<!-- 声明拦截器 -->
<interceptors>
<interceptor name="mytime" class="interceptor.MyTimeInterceptor"></interceptor>
<!-- 定义拦拦截器栈 -->
<interceptor-stack name="myinterceptorstack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="mytime"></interceptor-ref>
</interceptor-stack>
</interceptors>
<action name="date" class="action.DataTypeConvertAction" >
<result name="ok">/dateType.jsp</result>
</action>
<action name="fileup" class="action.FileupAction" >
<interceptor-ref name="myinterceptorstack"></interceptor-ref>
<result name="ok">/fileup.jsp</result>
</action>
<action name="down" class="action.DownAction" >
<result name="ok" type="stream">
<!--有输出中文的时使用 param name="contentType">application/octet-stream;charset=utf-8</param -->
<param name="contentType">application/x-msdownload</param>
<param name="inputName">tagFile</param>
<param name="contentDisposition">filename=${filename}</param>
</result>
</action>
</package>
</struts>
三、根据xml配置 建立拦截器实现类 MyTimeInterceptor.java 该类实现Interceptor接口 代码如下:
package interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class MyTimeInterceptor implements Interceptor {
@Override
public void destroy() {
System.out.println("自定义拦截器销毁!");
}
@Override
public void init() {
System.out.println("自定义拦截器初始化!");
}
@Override
public String intercept(ActionInvocation invocation) throws Exception {
long star = System.currentTimeMillis();
String str = invocation.invoke();// 接着调用后续的拦截器或是ACTION
long end = System.currentTimeMillis();
System.out.println("拦截器执行时间:" + (end - star));
return str;
}
}
项目结构及运行结果如下图:
完成!