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日

相关文章

  • Springboot集成jdbcTemplate过程解析

    下面就是Springboot集成jdbcTemplate的完整攻略。 简介 jdbcTemplate是Spring框架提供的对JDBC操作的封装,可以大大减少项目中JDBC代码的编写量,提高开发效率。Springboot集成jdbcTemplate非常简单,可以通过简单的配置即可完成。 配置依赖 首先,在Springboot项目中引入jdbcTemplate…

    Java 2023年5月20日
    00
  • 微信小程序中转义字符的处理方法

    当在微信小程序中使用文本时,可能会遇到需要处理特殊字符的情况,例如 HTML 中的 <, > ,& 等字符。这些字符可能会干扰浏览器的解析,导致不良的显示效果或安全问题。因此,在小程序中需要对这些字符进行转义,使之具有普通文本的意义而不被解析。 常见的转义字符有以下几种: & 符号转义为 &amp; < 符号转义为 …

    Java 2023年5月23日
    00
  • struts2中一个表单中提交多个请求的例子(多个提交按钮)

    在struts2中实现一个表单中提交多个请求的例子,常见的方法是使用多个提交按钮,每个按钮对应一个请求。以下是详细的步骤: 1. 编写表单 首先在jsp页面中编写表单,并使用<s:submit>标签来生成提交按钮。每个不同的提交按钮会绑定不同的请求。例如: <s:form action="processForm">…

    Java 2023年5月20日
    00
  • 自定义一个简单的JDBC连接池实现方法

    自定义 JDBC 连接池是一项非常重要的任务,它可以帮助开发人员管理数据库连接并提高系统性能。下面是自定义一个简单的 JDBC 连接池的步骤和示例: 步骤 创建一个 ConnectionPool 类用于管理数据库连接。 在 ConnectionPool 类中创建一个空闲连接池来保存未使用的连接。 在 ConnectionPool 类中创建一个活动连接池来保存…

    Java 2023年6月1日
    00
  • 启用springboot security后登录web页面需要用户名和密码的解决方法

    启用 SpringBoot Security 后登录 Web 页面需要用户名和密码的解决方法主要涉及到如何添加用户和授权认证的过程。 添加用户 可以通过在 application.yml 文件中配置用户名和密码来添加用户: spring: security: user: name: admin # 用户名 password: password # 密码 ro…

    Java 2023年5月20日
    00
  • JavaWeb读取配置文件的四种方法

    关于JavaWeb读取配置文件的四种方法,我将会按照以下四种方法作详细介绍: 使用ClassLoader的getResourceAsStream方法读取 使用Properties类读取 使用ServletContext的getRealPath方法读取 使用Spring框架的PropertiesLoaderUtils方法读取 1. 使用ClassLoader的…

    Java 2023年5月19日
    00
  • 3分钟纯 Java 注解搭个管理系统的示例代码

    要搭建一个管理系统,我们可能需要用到很多注解。本文将介绍如何使用 Java 注解来搭建一个简单的管理系统,时间仅需三分钟。 准备工作 首先,我们需要安装 JDK 并配置好环境变量。接着,使用 Maven 或 Gradle 构建工具创建一个新的项目,并添加如下的依赖: <dependency> <groupId>org.springfr…

    Java 2023年5月19日
    00
  • java初学者如何让编程学习起来更简单

    这里提供一些帮助Java初学者更轻松学习编程的攻略: 1. 选择适合自己的学习方法 学习方法的选择对于学习编程语言来说非常重要。有的人更喜欢以视频教程和示例代码为主,而有些人则更喜欢以书本为主。此外,还有一些适用于不同学习风格的在线课程,例如交互式课程和mooc(大规模开放式在线课程)。初学者应该探索各种不同的学习途径,找出自己最适合的一种。 2. 坚持练习…

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