struts拦截器使用方法

     拦截器(Interceptor)拦截器是Struts2的核心,Struts2的众多功能都是通过拦截器来实现的。拦截器和之前我们jsp中的filter原理相同,使用方法也类似。

1.测试拦截器内部方法的先后执行顺序

  TheInterceptor1.java(也可继承AbstractIntercepter父类):

  public class TheInterceptor1 implements Interceptor

{

public void destroy()

{

// TODO Auto-generated method stub

}

public void init()

{

-

System.out.println("init invoke");

}

public String intercept(ActionInvocation invocation) throws Exception

{

System.out.println("before");

String result = invocation.invoke();

System.out.println("after");

return result;

}

}

  struts.xml:

           <interceptors>

<interceptor name="theInterceptor" class="com.erzong.interceptor.TheInterceptor1"></interceptor>

</interceptors> 

  在需要使用拦截器的action的result后面声明所使用的拦截器的名字

  执行结果:

                


          

2  一旦定义了自己的拦截器,将其配置到 action上后,我们需要在action的最后加上默认的拦截器栈:defaultStack。

  如:

     

3.在初始化拦截器时候添加初始化信息

  struts.xml:

  <interceptors>

<interceptor name="theInterceptor" class="com.erzong.interceptor.TheInterceptor1">

<param name="test">erzong</param>

</interceptor>

</interceptors>

 再在拦截器里定义名字为test的变量,并为其添加set和get方法,当拦截器启动时,就会自动找到这个属性并附上值。

4.多个拦截器累加形成的执行顺序:先从先配置进去的,再分别调用两个拦截器的的Invocation.invoke()方法,最后先从后配置的拦截器出来,再从先配置的拦截器出来。

  

5.Invocation.getAction()方法:

  得到当前拦截器进行拦截的action类

6.拦截器拦截的是目标action的execute()方法,但是前面我们所讲的可以用自定义的(例如myExecute方法)替代execute,所以为了让拦截器拦截自己的方法,必须继承MethodFilterInterceptor类。

  (1)拦截器继承MethodFilterIntercepter类,并实现doIntercept();

   (2)

 

   includeMethods:要进行过滤的方法

   excludeMethods:不进行过滤的方法

   如果一个方法在两个参数都有设定,那么则设定该方法为includeMethods

  (3)在方法过滤拦截器中,如果既没有指定 includeMethods 参数,也没有指定execludeMethods 参数,那么所有的方法都会被拦截,也就是说所有的方法都被认为是 includeMethods 的;如果仅仅指定了 includeMethods,那么只会拦截 includeMethods 中的方法,没有包含在includeMethods 中的方法就不会被拦截。

7.拦截器在登录验证的时候使用方式,当用户登录时候,如果没有登录,则会转到登录界面,如果登录成功了,则会转到下一个页面。

LoginInterceptor:

public class LoginInterceptor extends AbstractInterceptor

{

@Override

@SuppressWarnings("unchecked")

public String intercept(ActionInvocation invocation) throws Exception

{

if(LoginAction.class == invocation.getAction().getClass())//排除掉LoginAction

{

return invocation.invoke();

}

Map map = invocation.getInvocationContext().getSession();//获得map形式的httpsession

if(null == map.get("userInfo"))

{

return Action.LOGIN;//回到登陆界面

}

return invocation.invoke();//什么都不处理,继续往下走

}

}

action中execute方法:

  if(loginService.isLogin(usernamepassword))

{

User user = new User();

user.setUsername(username);

user.setPassword(password);

ActionContext.getContext().getSession().put("userInfo", user);

return SUCCESS;

}

return INPUT;

struts.xml:(为了使这个拦截机器可以拦截所有action,又不想在action一个个配置,可以先配置拦截器栈,再定义自己的默认拦截器)

   <interceptor-stack name="myDefaultInterceptorStack">

<interceptor-ref name="loginInterceptor"></interceptor-ref>

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

   </interceptor-stack>

  

  <default-interceptor-ref name="myDefaultInterceptorStack"></default-interceptor-ref>

  <global-results>

<result name="login">/error.jsp</result>

</global-results>

8.如果需要定义多个xml配置文件,则可以把这些配置文件放在src目录下,然后在struts.xml中添加例如

阅读更多

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