Struts 2拦截器

 

Struts 2拦截器

代理模式

抽象主题:真是主题和代理主题的共同接口

真实主题:实现抽象主题,定义了代理角色所代表的真实对象

代理主题:实现抽象主题,含有对真实主题角色的引用,代理角色通常将会在客户端调用传递给真实主题对象之前或者之后执行的某些操作,而不是单纯返回真实对象。

 

动态代理模式

1.       创建抽象主题接口

2.       创建真实主题类实现抽象主题接口

3.       新建处理类,实现java.lang.reflect.InvocationHandler接口

4.       Client类,该类中new一个真实主题对象并传入处理类中

5.       最后用JDK自带的Proxy类的newProxyInstance方法,创建动态代理实例。

 

拦截器的实现原理

拦截器:在进行一个操作(调用某个方法)时,它会在执行操作前进行一些列的操作,而在执行完操作后,它又会进行一系列操作。

拦截:其实是动态地生成一个代理对象,而这个代理对象包含对拦截器方法的调用。因此调用代理对象的方法的同时也调用拦截器方法,这样就实现了动态的调用拦截器方法。

举例:

1.       新建DAO接口,因为动态代理只能对实现了接口的实例来生成代理。定义相应的方法。

2.       DAO接口实现类,实现DAO接口的所有方法。

3.       拦截器类

4.       处理类,实现java.lang.reflect.InvocationHandler接口,方法中以适当的顺序调用DAOImpl类和拦截器类的方法。

5.       代理工厂类,该工厂接受目标代理对象,创建一个处理类对象,目标代理对象传入处理类对象,最后用java.lang.reflect.Proxy创建并返回代理对象实例。

6.       Client类,调用代理

 

自定义拦截器

第一种自定义拦截器的方法:

实现com.opensymphony.xwork2.interceptor.Interceptor接口

实现其intercept方法尤为重要,可以在该方法里定义各种动作。

package com.opensymphony.xwork2.interceptor;

 

import com.opensymphony.xwork2.ActionInvocation;

 

import java.io.Serializable;

 

public interface Interceptor extends Serializable{

void destroy();

void init();

String intercept(ActionInvocation invocation) throws Exception;

}

 

第二种自定义拦截器方法:

继承com.opensymphony.xwork2.interceptor.AbstractInterceptor

该类实现了上述的Interceptor接口。

 

自定义好拦截器后要进行配置:

配置拦截器

在struts.xml中添加<interceptors>标签,是<package>的子标签

<interceptors>

      <interceptor name=”拦截器名” class=”拦截器实现类”></interceptor>

</interceptors>

如果需要传参:

<interceptors>

      <interceptor name=”拦截器名” class=”拦截器实现类”>

               <param name=”参数名”>参数值</param>

     </interceptor>

</interceptors>

如果需要配置多个拦截器,就多添加<interceptor>,还可以把多个拦截器组合起来组成拦截器栈。

<interceptors>

      <interceptor name=”拦截器名” class=”拦截器实现类”>

               <param name=”参数名”>参数值</param>

     </interceptor>

 

     <interceptor-stack name=”拦截器栈名”>

            <interceptor name=”拦截器一” class=”拦截器实现类”>

                  <param name=”参数名”>参数值</param>

            </interceptor>

            <interceptor name=”拦截器二” class=”拦截器实现类”></interceptor>

     </interceptor-stack>

 

</interceptors>

 

按上面的方法配置好拦截器后,还要

配置Action使用拦截器:struts.xmls在<action>标签中添加子标签:

<interceptor-ref name=”myInter”></interceptor-ref>

 

<interceptor-ref name=”myInter”>

                <param name=”myValue”>abcd</param>

</interceptor-ref>

 

这就完成了拦截器的创建配置使用。按以上步骤完成后发现原来的输入校验功能没有了,数据格式不对的话直接跳到了登陆失败页面,而数据格式对了也是登录失败。原因如下:

配置Action时,package是继承struts-default包的,而这个struts-default包配置了默认的拦截器栈defaultStack,这个栈中定义了大量的拦截器。Struts 2中的类型转换输入校验文件上传等操作都是通过调用这些隐含配置的拦截器。

如果struts.xml的package包中的Action没有添加使用拦截器,则默认的拦截器将会起作用。而一旦该包中的Action添加使用了某个拦截器,那么默认的拦截器就相当于没有添加,所以没有作用。这时需要在<action>中手动添加子标签来配置这个defaultStack:

<interceptor-ref name=”defaultStack”></interceptor-ref>

这样就一切OK啦!

阅读更多
个人分类: Core Java
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭