详解Struts2拦截器机制

详解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日

相关文章

  • Java持久层面试题目及答案整理

    Java持久层面试题目及答案整理 1. 什么是持久化? 持久化是指将内存中的数据存储到硬盘等外部介质中,使其具有持久性和长久性,可以随时被读取和使用。在Java中,持久化主要体现在数据的存储和读取,主要通过数据库来实现。 2. 什么是ORM? ORM全称Object Relational Mapping,指对象关系映射。ORM框架是将Java对象和关系数据库…

    Java 2023年6月16日
    00
  • java转换字符串编码格式的方法

    下面是关于Java转换字符串编码格式的方法的完整攻略。 1. String与byte[]的相互转换 在进行编码转换之前,我们首先需要将字符串转换为字节数组或者将字节数组转换为字符串。在Java中,可以通过以下方式进行转换: 1.1 将String转换为byte[] 可以通过调用String对象的getBytes方法将字符串转换为字节数组,示例代码如下: St…

    Java 2023年5月20日
    00
  • skywalking自定义插件开发

    skywalking是使用字节码操作技术和AOP概念拦截Java类方法的方式来追踪链路的,由于skywalking已经打包了字节码操作技术和链路追踪的上下文传播,因此只需定义拦截点即可。 这里以skywalking-8.7.0版本为例。关于插件拦截的原理,可以看我的另一篇文章:skywalking插件工作原理剖析 1. 创建插件模块 在 apm-sniffe…

    Java 2023年4月25日
    00
  • 一步步带你入门Java中File类

    一步步带你入门Java中File类 什么是File类? File类是Java中用来表示文件或目录的类,它可以用来创建、删除、重命名、检查文件或目录是否存在等操作。 如何创建File对象? 我们可以通过以下两种方式来创建File对象: 方法1:使用文件路径字符串创建File对象 File file = new File("path/to/file&q…

    Java 2023年6月1日
    00
  • SpringBoot服务开启后通过端口访问无反应的解决

    当使用SpringBoot开发Web服务时,有可能会出现服务开启后通过端口访问无反应的情况。这种情况通常是由于SpringBoot应用程序对于端口没有正确绑定造成的。以下是详细讲解如何解决这种情况的完整攻略: 1. 确认端口是否被占用 首先,需要检查所使用的端口是否被其他进程占用。可以使用以下命令检查端口占用情况: netstat -ano | findst…

    Java 2023年6月16日
    00
  • SpringMVC中controller接收json数据的方法

    下面我将详细讲解”SpringMVC中controller接收json数据的方法”的攻略。 一、引入Jackson库 在项目的pom.xml文件中增加Jackson依赖: <!–Jackson依赖–> <dependency> <groupId>com.fasterxml.jackson.core</groupI…

    Java 2023年5月26日
    00
  • Java程序单实例运行的简单实现

    Java程序单实例运行的简单实现 在某些情况下,我们需要保证Java程序只能运行一个实例,这就需要实现Java程序单实例运行的功能。下面是实现Java程序单实例运行的简单攻略: 1. 使用文件锁机制 使用文件锁机制实现Java程序单实例运行的方法是:在程序启动时,创建一个文件并加锁,如果文件已经被锁住,就说明已经有一个实例在运行,程序就要直接退出。下面是示例…

    Java 2023年5月19日
    00
  • IDEA创建Java Web项目不能及时刷新HTML或JSP页面问题

    当使用IntelliJ IDEA创建Java Web项目并且编写HTML或JSP页面时,可能会遇到页面不能及时刷新的问题,这是由于IDEA默认采用了缓存机制导致的。为了解决这个问题,可以执行以下步骤: 1. 关闭缓存 通过在IDEA的Editor部分中找到Editor > General > Editor Tabs选项,并勾选“Mark modi…

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