详解Struts2拦截器机制

yizhihongxing

详解Struts2拦截器机制

1. 什么是Struts2拦截器

Struts2拦截器是一个非常重要的组件,用于对请求进行拦截和处理,同时也是整个Struts2框架的核心。

在Struts2中,每个请求都会经过多个拦截器的处理,每个拦截器只是完成了部分工作,多个拦截器组合在一起,最终完成了一个完整的请求处理流程。

2. Struts2拦截器机制的流程

Struts2拦截器机制的流程如下:

  1. 请求发起:当用户在浏览器中输入URL,请求到达Struts2 Controller时,请求被拦截器拦截。

  2. 拦截器链:所有的拦截器按照Struts.xml中定义的顺序组成拦截器链。拦截器链是一个有序集合,按照定义的顺序执行。

  3. 执行拦截器:拦截器链中的每个拦截器都会执行自己的逻辑,并将请求传递给下一个拦截器。

  4. Action执行:当拦截器链中的所有拦截器执行完成后,请求最终被传递给Action,Action执行自己的逻辑。

  5. 结果返回:Action执行完成后,结果被返回给拦截器链,拦截器链进行后续处理,最终将结果返回给浏览器。

3. Struts2拦截器的分类

Struts2拦截器根据其功能和执行位置的不同,可以分为以下几类:

  1. 控制拦截器(Control Interceptor):决定是否执行Action。如:params、prepare、validation、workflow等。

  2. 工作流拦截器(Workflow Interceptor):用于工作流控制,如:exception、debug、profiling等。

  3. 处理拦截器(Execution Interceptor):管理Action执行流程,如:action、result等。

  4. 输入拦截器(Input Interceptor):管理如何将请求参数绑定到Action属性中。

  5. 输出拦截器(Output Interceptor):将Action的执行结果转换为最终的输出格式。

  6. 安全拦截器(Security Interceptor):管理一个请求是否可被理解为受控请求,使用安全拦截器可以配置哪些请求进行安全控制,如:authentication、authorization等。

4. 示例1:自定义拦截器

下面以示例的形式,演示如何自定义一个控制拦截器。

  1. 创建拦截器类:示例中使用java类实现拦截器。
public class CustomInterceptor implements Interceptor {

    private static final long serialVersionUID = 1L;

    @Override
    public void destroy() {
        System.out.println("Interceptor destroyed");
    }

    @Override
    public void init() {
        System.out.println("Interceptor initialized");
    }

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        System.out.println("Interceptor invoked");
        return invocation.invoke();
    }
}
  1. 在struts.xml中配置自定义拦截器:
<package name="default" extends="struts-default">
    <interceptors>
        <interceptor name="custom" class="com.example.interceptor.CustomInterceptor"/>
        <interceptor-stack name="myStack">
            <interceptor-ref name="custom"></interceptor-ref>
            <interceptor-ref name="params"></interceptor-ref>
            <interceptor-ref name="validationWorkflowStack"></interceptor-ref>
        </interceptor-stack>
    </interceptors>
</package>
  1. 使用拦截器:使用在Struts.xml中定义的自定义拦截器。
<action name="login" class="com.example.action.LoginAction" method="login">
    <interceptor-ref name="myStack"></interceptor-ref>
    <result name="success">welcome.jsp</result>
</action>

5. 示例2:使用Struts2内置拦截器实现表单验证

下面以示例的形式,演示如何使用Struts2内置拦截器实现表单验证。

  1. 编写Action
public class LoginAction extends ActionSupport {

    private static final long serialVersionUID = 1L;

    private String username;
    private String password;

    @Override
    public String execute() throws Exception {
        if(username.equals("admin") && password.equals("admin123")) {
            return SUCCESS;
        }
        else {
            addActionError(getText("error.login"));
            return INPUT;
        }
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getUsername() {
        return username;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getPassword() {
        return password;
    }
}
  1. 配置struts.xml:
<action name="login" class="com.example.action.LoginAction" method="execute">
    <result name="input">/login.jsp</result>
    <result name="success">/welcome.jsp</result>
    <interceptor-ref name="defaultStack">
        <param name="validation.excludeMethods">execute</param>
    </interceptor-ref>
</action>
  1. 在JSP中使用标签库实现前端验证
<%@taglib prefix="s" uri="/struts-tags" %>
<s:form action="login">
    <s:textfield name="username" label="username" />
    <s:password name="password" label="password" />
    <s:submit value="login" />
</s:form>

在以上示例中,通过配置defaultStack拦截器完成了表单验证的功能。参数validation.excludeMethods指定了执行Action的方法不应该进行表单验证。在login.jsp中,通过使用struts标签库,可以实现前端验证的功能。

6. 总结

了解Struts2拦截器机制可以帮助我们更好的掌握Struts2框架,并实现更灵活的工作流程。Struts2提供了许多内置的拦截器,同时也可以通过自定义拦截器来满足个性化需求。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Struts2拦截器机制 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • C# 中Excel导入时判断是否被占用三种方法

    下面是详细讲解 “C# 中 Excel 导入时判断是否被占用三种方法” 的完整攻略。 一、需求说明 在使用 C# 程序导入 Excel 数据时,可能会遇到一个问题,即当 Excel 文件正在被其他程序占用时,程序无法正确读取数据。因此我们需要通过一些方法判断 Excel 文件是否被其他程序占用。 二、方法一 第一种方法是通过 try…catch 来判断 …

    Java 2023年5月19日
    00
  • C#生成word记录实例解析

    C#生成Word记录是一个常见的需求,可以使用各种库和工具来完成这个任务。本攻略将向您展示生成Word记录的完整过程。 步骤一:安装DocX库 为了生成Word记录,我们需要使用DocX库。它是一个非常流行的开源C#库,可以轻松创建和编辑Word文档。 要安装DocX库,请在Visual Studio中打开NuGet包管理器,然后搜索并安装DocX库。 步骤…

    Java 2023年6月15日
    00
  • Android Activity生命周期详解

    下面是关于“Android Activity生命周期详解”的完整攻略。 简介 很多初学者在学习 Android 开发时容易被 Activity 的生命周期所迷惑。但实际上,了解生命周期可以帮助我们更好地理解 Activity 的内部操作以及增强应用程序的用户体验。 Activity 的生命周期由一系列的阶段组成,从 Activity 的启动到关闭,包括一些生…

    Java 2023年6月15日
    00
  • Spring Boot统一接口返回及全局异常处理

    针对这个问题,我需要从以下几个方面来进行讲解: Spring Boot统一接口返回 全局异常处理 Spring Boot统一接口返回 在Spring Boot开发中,我们通常需要采用统一的接口返回格式,以便于前后端进行沟通和交互,同时对于异常情况也需要进行统一处理。 在实现统一接口返回的过程中,我们可以借助Spring Boot提供的ResponseBody…

    Java 2023年5月27日
    00
  • 基于jsp:included的使用与jsp:param乱码的解决方法

    接下来我将为您详细讲解“基于jsp:included的使用与jsp:param乱码的解决方法”的完整攻略。 1. 基于jsp:included的使用 1.1 简介 jsp:include指令用于在当前JSP文件中包含其他JSP页面片段或者静态页面。使用该指令可以提高应用程序的模块化,方便代码的维护。 1.2 语法 <jsp:include page=&…

    Java 2023年6月15日
    00
  • Spring框架实现AOP的两种方式详解

    Spring框架实现AOP的两种方式详解 Spring框架是JavaEE应用中最常用的框架之一,其中一个主要的特性就是支持AOP(面向切面编程)的实现。在Spring框架中,AOP有两种主要的实现方式:基于代理(Proxy-based)和基于AspectJ(AspectJ-based)。 基于代理的AOP实现方式 基于代理的AOP实现方式是Spring框架默…

    Java 2023年5月19日
    00
  • 响应式编程初探

    响应式 响应式系统(Reactive System) 具有以下特质:即时响应性(Responsive)、回弹性(Resilient)、弹性(Elastic)以及消息驱动(Message Driven)响应式系统更加灵活,松耦合,可伸缩 即时响应性 只要有可能, 系统就会及时地做出响应。 即时响应是可用性和实用性的基石, 而更加重要的是,即时响应意味着可以快速…

    Java 2023年4月17日
    00
  • java可变参数当做数组处理的方法示例

    Java的可变参数可以让我们在定义方法时不确定参数的个数,这些参数被当做数组来处理,能够使方法的调用更加灵活方便。下面将为大家介绍Java可变参数当做数组处理的方法示例,具体步骤如下: 第一步:定义一个接收可变参数的方法 首先,我们需要在Java代码中定义一个接收可变参数的方法。以打印数组中所有元素为例,代码如下: public static void pr…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部