Struts2学习笔记(十)——自定义拦截器

Struts2拦截器是基于AOP思想实现的,而AOP的实现是基于动态代理。Struts2拦截器会在访问某个Action之前或者之后进行拦截,并且Struts2拦截器是可插拔的;Struts2拦截器栈就是将拦截器按照顺序连接在一起的链,当满足拦截的要求时,则会按照实现声明的顺序依次执行拦截器。

1、Struts2自定义拦截器介绍

Struts2所有拦截器都必须实现Interceptor接口,Interceptor接口主要有3个方法:

  • init():初始化方法,只在拦截器加载时执行一次
  • intercept(ActionInvocation invocation):拦截器执行方法,每一次请求就执行一次
  • destory():销毁方法,只在拦截器释放时执行一次

AbstractInterceptor抽象类实现了Interceptor 接口。并为init()和destroy()提供了一个空白的实现,所以在实际开发中,自定义拦截器只需要继承AbstractInterceptor类, 并且实现intercept(ActionInvocation invocation)方法就可以了。

2、Struts2自定义拦截器创建步骤

  1).创建一个类实现Interceptor接口或继承AbstractInterceptor类。
  2).重写intercept方法,这个方法是真正拦截操作,如果想要继续向下访问其它拦截器,必须在intercept方法中通过参数ActionInvocation调用invoke方法。
  3).配置拦截器,需要在struts.xml文件中配置,分为两种情况:

  • 为package包下所有<action>配置共用拦截器,需要通过设置<default-interceptor-ref>来设置默认拦截器,需要在<action>之前配置
    • 不配置拦截器栈,只会执行<default-interceptor-ref>设置的拦截器
       1 <package name="default" namespace="/" extends="struts-default">
      
       2      <interceptors>
      
       3           <interceptor name="login" class="com.sunny.interceptor.LoginIntercept"></interceptor>
      
       4      </interceptors>
      
       5      <default-interceptor-ref name="login"></default-interceptor-ref>
      
       6      <action name="loginAction" class="com.sunny.action.LoginAction">
      
       7           <result>/success.jsp</result>
      
       8           <result name="error">/error.jsp</result>
      
       9      </action>
      
      10 </package>
    • 配置拦截器栈
       1  <package name="default" namespace="/" extends="struts-default">
      
       2      <interceptors>
      
       3          <interceptor name="login" class="com.sunny.interceptor.LoginIntercept"></interceptor>
      
       4          <interceptor-stack name="my">
      
       5              <interceptor-ref name="login"></interceptor-ref>
      
       6              <interceptor-ref name="defaultStack"></interceptor-ref>
      
       7          </interceptor-stack>
      
       8       </interceptors>
      
       9       <default-interceptor-ref name="my"></default-interceptor-ref>
      
      10       <action name="loginAction" class="com.sunny.action.LoginAction">
      
      11           <result>/success.jsp</result>
      
      12           <result name="error">/error.jsp</result>
      
      13       </action>
      
      14  </package>
  • 为package包下某个<action>配置拦截器,需要在<action>中通过设置<interceptor-ref>来设置拦截器,如果想要执行defaultStack,则需要在<action>中配置
    • 不配置拦截器栈
       1 <package name="default" namespace="/" extends="struts-default">
      
       2     <interceptors>
      
       3         <interceptor name="login" class="com.sunny.interceptor.LoginIntercept"></interceptor>
      
       4     </interceptors>
      
       5     <action name="loginAction" class="com.sunny.action.LoginAction">
      
       6         <result>/success.jsp</result>
      
       7         <result name="error">/error.jsp</result>
      
       8         <interceptor-ref name="login"></interceptor-ref>
      
       9         <interceptor-ref name="defaultStack"></interceptor-ref>
      
      10     </action>
      
      11 </package>
    • 配置拦截器栈
       1 <package name="default" namespace="/" extends="struts-default">
      
       2     <interceptors>
      
       3         <interceptor name="login" class="com.sunny.interceptor.LoginIntercept"></interceptor>
      
       4         <interceptor-stack name="my">
      
       5             <interceptor-ref name="login"></interceptor-ref>
      
       6             <interceptor-ref name="defaultStack"></interceptor-ref>
      
       7         </interceptor-stack>
      
       8     </interceptors>
      
       9     <action name="loginAction" class="com.sunny.action.LoginAction">
      
      10         <result>/success.jsp</result>
      
      11         <result name="error">/error.jsp</result>
      
      12         <interceptor-ref name="my"></interceptor-ref>
      
      13     </action>
      
      14 </package>

2、Struts2自定义拦截器实现示例:判断是否登录

该示例主要是用来验证用户是否登录,如果没登录,就跳转到error.jsp页面,提示需要登录系统。

拦截器类:

 1 public class LoginIntercept extends AbstractInterceptor {

 2 

 3     @Override

 4     public String intercept(ActionInvocation invocation) throws Exception {

 5         Map session = ServletActionContext.getContext().getSession();

 6         if (session.get("user")==null) {

 7             return "error";

 8         } else {

 9             return invocation.invoke();

10         }

11     }

12 }

Action类:

 1 public class LoginAction extends ActionSupport {

 2     private String name;

 3     public String getName() {

 4         return name;

 5     }

 6     public void setName(String name) {

 7         this.name = name;

 8     }

 9     @Override

10     public String execute() throws Exception {

11         return "success";

12     }

13 }

struts.xml配置文件:

 1 <struts>

 2     <constant name="struts.devMode" value="true" />

 3     

 4     <package name="default" namespace="/" extends="struts-default">

 5         <interceptors>

 6             <interceptor name="login" class="com.sunny.interceptor.LoginIntercept"></interceptor>

 7             <interceptor-stack name="my">

 8                 <interceptor-ref name="login"></interceptor-ref>

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

10             </interceptor-stack>

11         </interceptors>

12         <action name="loginAction" class="com.sunny.action.LoginAction">

13             <result>/success.jsp</result>

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

15             <interceptor-ref name="my"></interceptor-ref>

16         </action>

17     </package>

18 </struts>

input.jsp页面:

1 <body>

2  <form action="${pageContext.servletContext.contextPath}/loginAction.action">

3     姓名:<input type="text" name="name"><br>

4     <input type="submit" value="提交">

5  </form>

6 </body>

error.jsp页面:

1 <body>

2 请登录系统

3 </body>

登录界面:

Struts2学习笔记(十)——自定义拦截器

由于没有登录系统,所以点击提交之后,会显示:

Struts2学习笔记(十)——自定义拦截器

 

你可能感兴趣的:(struts2)