Struts2之Action接收请求参数和拦截器详解

Struts2之Action接收请求参数和拦截器详解

本文主要介绍了如何在Struts2中使用Action来接收请求参数,并通过拦截器对Action进行增强。

Action接收请求参数

在Struts2中,我们可以通过Action来获取请求中的参数。

获取参数的方式

  1. 直接在Action的成员变量中声明参数,并提供setter方法,Struts2会自动为我们注入参数值。

    ```java
    public class LoginAction extends ActionSupport {
    private String username;
    private String password;

    public void setUsername(String username) {
        this.username = username;
    }
    
    public void setPassword(String password) {
        this.password = password;
    }
    
    // 处理登录请求的方法
    public String login() {
        // 登录逻辑代码
        return SUCCESS;
    }
    

    }
    ```

  2. 在Action中声明与请求参数同名的方法,并提供参数类型为String的参数。

    ```java
    public class LoginAction extends ActionSupport {
    private String username;
    private String password;

    public String getUsername() {
        return username;
    }
    
    public void setUsername(String username) {
        this.username = username;
    }
    
    public String getPassword() {
        return password;
    }
    
    public void setPassword(String password) {
        this.password = password;
    }
    
    // 处理登录请求的方法
    public String login() {
        // 登录逻辑代码
        return SUCCESS;
    }
    

    }
    ```

参数传递的方式

在Struts2中,参数可以通过两种方式传递给Action:URL传参和表单提交。

URL传参

在URL中传递参数时,参数名和参数值要放在URL的问号后面,并以“参数名=参数值”的形式拼接,多个参数之间用“&”隔开。

例如:

http://localhost:8080/login.action?username=admin&password=123456

表单提交

在表单中提交参数时,参数名和参数值会被封装成一个Map对象,通过HttpServletRequest的getParameterMap()方法可以获取该Map对象。参数名就是Map的键,参数值是一个字符串数组,可以通过数组下标获取。

例如:

<form action="login.action" method="post">
    <label for="username">用户名:</label>
    <input type="text" id="username" name="username"><br>
    <label for="password">密码:</label>
    <input type="password" id="password" name="password"><br>
    <input type="submit" value="登录">
</form>

经过表单提交后,Action中需要添加一个处理请求的方法,该方法的命名需要与表单中的"action"属性一致,并使用@org.apache.struts2.convention.annotation.Action标注。

import org.apache.struts2.convention.annotation.Action;

public class LoginAction extends ActionSupport {
    private String username;
    private String password;

    public String getUsername() {
        return username;
    }

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

    public String getPassword() {
        return password;
    }

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

    // 处理表单提交请求的方法
    @Action(value = "login")
    public String execute() {
        // 登录逻辑代码
        return SUCCESS;
    }
}

示例

示例一:直接在Action中声明参数

下面是一个简单的示例,展示了如何在Action中接收请求参数。

import com.opensymphony.xwork2.ActionSupport;

public class UserAction extends ActionSupport {
    private String username;
    private String password;

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

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

    public String login() {
        System.out.println("username: " + username + ", password: " + password);
        return SUCCESS;
    }
}

在上面的代码中,我们声明了两个成员变量"username"和"password",并提供了setter方法,用于接收请求中的参数。在"login"方法中,我们打印了接收到的参数值。

接下来,我们在XML配置文件中配置该Action:

<struts>
    <package name="default" extends="struts-default">
        <action name="user" class="com.example.UserAction">
            <result name="success">/success.jsp</result>
        </action>
    </package>
</struts>

然后,在浏览器地址栏中输入以下URL:

http://localhost:8080/user!login.action?username=admin&password=123456

可以看到,在控制台中输出了以下内容:

username: admin, password: 123456

示例二:在Action中声明与请求参数同名的方法

下面是一个示例,展示了如何在Action中声明与请求参数同名的方法,用于接收参数。

import com.opensymphony.xwork2.ActionSupport;

public class UserAction extends ActionSupport {
    private String username;
    private String password;

    public String getUsername() {
        return username;
    }

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

    public String getPassword() {
        return password;
    }

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

    public String login() {
        System.out.println("username: " + getUsername() + ", password: " + getPassword());
        return SUCCESS;
    }
}

在上面的代码中,我们没有在成员变量中声明参数,而是声明了与请求参数同名的getter和setter方法。

接下来,我们同样需要在XML配置文件中配置该Action:

<struts>
    <package name="default" extends="struts-default">
        <action name="user" class="com.example.UserAction">
            <result name="success">/success.jsp</result>
        </action>
    </package>
</struts>

最后,我们在表单中提交请求:

<form action="user!login.action" method="post">
    <label for="username">用户名:</label>
    <input type="text" id="username" name="username"><br>
    <label for="password">密码:</label>
    <input type="password" id="password" name="password"><br>
    <input type="submit" value="登录">
</form>

在浏览器中输入以下URL:

http://localhost:8080/user!login.action

在表单中输入用户名和密码,点击登录后,可以在控制台中看到以下内容:

username: admin, password: 123456

拦截器详解

Struts2的拦截器与Servlet的Filter类似,可以对请求进行过滤和增强,还可以对异常进行捕获和处理。

拦截器类

Struts2中的拦截器是一个Java类,继承自com.opensymphony.xwork2.interceptor.Interceptor接口,必须要实现其抽象方法。

/package com.example.interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

public class MyInterceptor implements Interceptor {
    @Override
    public void init() {
        // 初始化代码
    }

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        // 前置代码
        String result = invocation.invoke(); // 调用Action的方法
        // 后置代码
        return result;
    }

    @Override
    public void destroy() {
        // 销毁代码
    }
}

在上面的代码中,我们实现了Interceptor接口,并重写了init()、intercept()和destroy()方法。

  1. init()方法是拦截器初始化方法,用于初始化拦截器;
  2. intercept()方法是拦截器的核心方法,用于对请求进行过滤和增强。通过ActionInvocation类的invoke()方法可以调用下一个拦截器,或者调用Action的方法(注意,这里如果不调用Action的方法,后面的拦截器也将不会被执行),并返回一个字符串类型的结果,该结果会被Struts2框架用于选择相应的结果视图;
  3. destroy()方法是拦截器销毁方法,用于销毁拦截器。

在Struts2中配置拦截器

要在Struts2中使用拦截器,需要将拦截器配置在XML配置文件中。

<struts>
    <package name="default" extends="struts-default">
        <interceptors>
            <interceptor name="myInterceptor" class="com.example.interceptor.MyInterceptor"/>
        </interceptors>

        <default-interceptor-ref name="myInterceptor"/> <!-- 默认拦截器 -->

        <action name="user" class="com.example.action.UserAction">
            // 配置拦截器
            <interceptor-ref name="myInterceptor1"/>
            <interceptor-ref name="myInterceptor2"/>
            <interceptor-ref name="myInterceptor3"/>

            <result name="success">/success.jsp</result>
            <result name="error">/error.jsp</result>
        </action>
    </package>
</struts>

在上面的代码中,我们首先在interceptors标签中定义了一个名称为"myInterceptor"的拦截器。然后,在default-interceptor-ref标签中,我们将该拦截器设置为默认拦截器。这意味着,在没有明确指定拦截器的情况下,所有的Action都将使用该拦截器。

在action标签中,我们配置了三个拦截器:myInterceptor1、myInterceptor2和myInterceptor3。它们的调用顺序是按照声明的顺序,即如果myInterceptor1执行成功,则调用myInterceptor2,如果myInterceptor2执行成功,则调用myInterceptor3。如果其中任何一个拦截器执行失败,则直接返回。

示例

下面是一个示例,展示了如何使用拦截器来统计Action方法的执行时间。

/package com.example.interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

public class TimerInterceptor implements Interceptor {
    private static final long serialVersionUID = 1L;

    @Override
    public void init() {}

    @Override
    public void destroy() {}

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        String timerName = invocation.getAction().getClass().getName() + "." + invocation.getProxy().getMethod();
        long startTime = System.currentTimeMillis();
        String result = invocation.invoke();
        long endTime = System.currentTimeMillis();
        long executeTime = endTime - startTime;
        System.out.println(timerName + ": " + executeTime + "ms");
        return result;
    }
}

在上面的代码中,我们实现了一个计时器拦截器,用于统计Action方法的执行时间。在intercept()方法中,我们首先通过ActionInvocation的getAction()方法获取Action的实例,然后通过getProxy()方法获取当前的代理,再通过getMethod()方法获取当前执行的方法名。我们将获取到的方法名作为计时器的名称。

接下来,我们记录当前的系统时间,调用Action的方法,再获取一次当前的系统时间,并计算出方法执行的时间。最后,我们将计时器的名称和执行时间打印到控制台上。

接下来,我们在XML配置文件中配置该拦截器:

<struts>
    <package name="default" extends="struts-default">
        <interceptors>
            <interceptor name="timerInterceptor" class="com.example.interceptor.TimerInterceptor"/>
        </interceptors>

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

        <action name="user" class="com.example.action.UserAction">
            <result name="success">/success.jsp</result>
            <result name="error">/error.jsp</result>
        </action>
    </package>
</struts>

在上面的代码中,我们定义了一个名称为"timerInterceptor"的拦截器,在default-interceptor-ref标签中将该拦截器设置为默认拦截器。这意味着,在没有明确指定拦截器的情况下,所有的Action都将使用该拦截器。

最后,我们使用以下地址访问Action方法:

http://localhost:8080/user.action

在控制台中可以看到以下内容:

com.example.action.UserAction.execute: 2896ms

表示执行时间为2.896秒。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Struts2之Action接收请求参数和拦截器详解 - Python技术站

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

相关文章

  • Java 创建线程的3种方法及各自的优点

    下面我将为您详细讲解“Java 创建线程的3种方法及各自的优点”的完整攻略。 Java 创建线程的3种方法及各自的优点 在Java中,创建线程有三种常用的方法,分别为继承Thread类、实现Runnable接口和实现Callable接口。各自的优点如下: 继承Thread类 继承Thread类创建线程是最简单的方法,只需要重写Thread类的run方法即可。…

    Java 2023年5月18日
    00
  • 解读Tomcat启动、重启、暂停操作(window)

    我来为您详细讲解“解读Tomcat启动、重启、暂停操作(window)”的完整攻略。 1. Tomcat启动操作 1.1. 检查JDK环境变量 首先要检查JDK 的环境变量设置是否正确。具体来说,需要检查以下环境变量: JAVA_HOME:JDK的安装目录路径。 CLASSPATH:Java运行时使用的类搜索路径。 PATH:系统的环境变量,需要将%JAVA…

    Java 2023年5月19日
    00
  • Java8语法糖之Lambda表达式的深入讲解

    Java8语法糖之Lambda表达式的深入讲解 什么是Lambda表达式 Lambda表达式是Java8引入的一种新特性,它是一种匿名函数,可以用来简洁地表示某种行为,简化代码的编写。 Lambda表达式通常由参数列表、箭头符号和函数体组成。参数列表指定了传入该Lambda表达式的变量;箭头符号表示Lambda表达式的执行方向;函数体包含了Lambda表达式…

    Java 2023年5月26日
    00
  • Java生成PDF文件的实例代码

    下面是详细讲解Java生成PDF文件的实例代码的攻略。 步骤一:引入依赖 我们使用iText这个开源工具来生成PDF文件,所以我们需要在项目中引入iText的依赖。 <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</art…

    Java 2023年5月20日
    00
  • nginx lua集成kafka的实现方法

    下面我将为你详细讲解“nginx lua集成kafka的实现方法”的完整攻略。 准备工作 安装Openresty 安装kafka 代码实现 安装kafka-lua kafka-lua具体安装步骤可参考Github官网:kafka-lua。 lua代码基本骨架 local producers = require ("resty.kafka.produ…

    Java 2023年5月20日
    00
  • 详解Spring Boot 定时任务的实现方法

    Spring Boot提供了一种简单的方式来实现定时任务。以下是详解Spring Boot定时任务的实现方法的完整攻略: 添加依赖 在pom.xml文件中添加以下依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>sp…

    Java 2023年5月15日
    00
  • Java中的面向对象编程是什么?

    Java中的面向对象编程(Object-Oriented Programming)是一种编程理念,它是基于对象的概念而建立的,通过将数据和函数绑定到一个对象上,以实现程序的封装、继承和多态三个特性。 封装 封装是面向对象编程的一种基本特性,它允许程序员将数据和函数绑定到一个对象中,并且可以对外隐藏对象的实现细节。在Java中,我们可以通过访问修饰符(publ…

    Java 2023年4月27日
    00
  • Java8时间api之LocalDate/LocalDateTime的用法详解

    Java8时间API之LocalDate/LocalDateTime的用法详解 Java8提供了全新的时间日期API,提供了更好的灵活性和易用性。其中,LocalDate和LocalDateTime是比较常用的类,下面详细讲解它们的用法。 LocalDate LocalDate是纯日期类,不包含时间。它的使用方式如下: // 获取当前日期 LocalDate…

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