Struts2学习日志(1):拦截器

JAVA学习网 2017-11-24 17:29:02

拦截器原理的实现(动态代理):

 
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);
}
 
 

 

 
阅读(728) 评论(0)