• 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>

    登录界面:

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

  • 相关阅读:
    MyBatis参数传入集合之foreach动态sql
    【mybatis】多次查询缓存的问题
    svn is already locked解决方案
    Python 命令行之旅:使用 docopt 实现 git 命令
    Django 官方推荐的姿势:类视图
    这可能就是你苦苦寻找免费、高颜值、功能强大的 Markdown 编辑器(共5款)
    超级好用的 Java 数据可视化库:Tablesaw
    让你如“老”绅士般编写 Python 命令行工具的开源项目:docopt
    开发 Django 博客文章阅读量统计功能
    使用 Docker 让部署 Django 项目更加轻松
  • 原文地址:https://www.cnblogs.com/xiaolongSunny/p/4659817.html
Copyright © 2020-2023  润新知