拦截器原理的实现(动态代理):
package Struts.test.proxy; //功能执行类 public class ExecuteFunction implements ExecuteFunctionInterface{ public void execute(){//执行功能类执行方法 System.out.println("execute something……"); } }
package Struts.test.proxy; //拦截器类 public class Interceptor { public void beforeDoing() {// 拦截执行功能类之前执行方法 System.out.println("before doing Something……"); } public void afterDoing() {// 拦截执行功能类之后执行方法 System.out.println("after doing Something……"); } }
package Struts.test.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; //拦截器处理类 public class InterceptorHandler implements InvocationHandler { private Object object; private Interceptor inter = new Interceptor(); public void setObject(Object object) {// 设置需要拦截的执行功能类 this.object = object; } // 接口invoke方法,proxy是代理实例,method是实例方法,args是代理类传入的方法参数 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { inter.beforeDoing(); // object提供该方法的类实例,args是调用方法所需的参数值的数组 Object returnObject = method.invoke(object, args); inter.afterDoing(); return returnObject; } }
package Struts.test.proxy; import java.lang.reflect.Proxy; //代理对象类 public class ProxyObject { private InterceptorHandler handler = new InterceptorHandler(); public Object getProxy(Object object) {// 得到执行类的代理对象实例 handler.setObject(object); // 创建对象实例 return Proxy.newProxyInstance(ExecuteFunction.class.getClassLoader(), object.getClass().getInterfaces(), handler); } }
package Struts.test.proxy; public class TestInterceptor { public static void main(String[] args) { ExecuteFunctionInterface test = new ExecuteFunction(); // 得到执行类的一个代理对象实例 ExecuteFunctionInterface resultObject = (ExecuteFunctionInterface) new ProxyObject().getProxy(test); resultObject.execute();// 代理对象执行 } }
执行效果:

配置自定义拦截器:
1.扩展拦截器接口
实现Interceptor接口
2.继承抽象拦截器
继承AbstractInterceptor抽象类,重写intercept()方法。
3.继承方法拦截器
继承MethodFilterInterceptor抽象类,重写doIntercept()方法。
<!-------------------------文件名:struts.xml------------------------->
<struts>
<!--Action所在包定义-->
<package name="C04.3"extends="struts-default">
<!--拦截器配置定义-->
<interceptors>
<interceptor name="example"
class="com.example.struts.interceptor.ExampleInterceptor">
</interceptor>
</interceptors>
<!--
缺省拦截器栈配置定义
<default-interceptor-ref name="example"></default-interceptor-ref>
-->
<!--Action名字,类以及导航页面定义-->
<!--通过Action类处理才导航的Action定义-->
<action name="Login"
class="com.example.struts.action.LoginAction"method="method">
<result name="input">/jsp/login.jsp</result>
<result name="success">/jsp/success.jsp</result>
<!--Action方法拦截器配置定义-->
<interceptor-ref name="example">
<!--被拦截方法配置定义-->
<param name="includeMethods">method</param>
<!--不被拦截方法配置定义-->
<param name="excludeMethods">method, execute</param>
</interceptor-ref>
</action>
</package>
</struts>
文件上传:
在JSP的Form中:
1.<s:form action="upload"method="post"enctype="multipart/form-data">,其中method和enctype的参数一定要如上所示。
2.在web目录下创建一个存放上传文件的根目录。
3. 在action中定义三个参数,file,fileFileName和fileContentType,每个参数前面的file就是jsp表单中上传文件标签的name属性中的value值。
4.配置拦截器的时候,可以配置两个参数:
allowType:根据文件的类型约束上传的文件
allowExtensions:根据文件的后缀名约束上传的文件
5.如果显示配置Struts 2自己的缺省拦截器一定要写在"defaultStack"前,否则自己定义的拦截器不会执行拦截。
文件下载:
1.在<result>标签中定义了type属性,值为"stream"。
2.contentDisposition处理方式如下:

3.//从下载文件原始存放路径读取得到文件输出流
public InputStream getDownloadFile(){ return ServletActionContext.getServletContext().getResourceAsStream(DOWNLOADFILEPATH+fileName); }