SpringMVC获取请求参数的方法详解

 更新时间:2023年07月21日 10:38:09   作者:从未止步..  
这篇文章主要为大家详细介绍了SpringMVC中获取请求参数的方法,例如通过ServletAPI获取和通过控制器方法的形参获取请求参数等,需要的可以参考下

本篇文章的项目配置是在这篇文章的基础上实现的

通过ServletAPI获取

将HttpServletRequest作为控制器方法的形参,此时HttpServletRequest类型的参数表示封装了当前请求的请求报文的对象

举例如下:

第一步:在html文件中创建表单,如下所示:

index.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<h1>欢迎进入首页!</h1>
<form th:action="@{/param/ServletAPI}" method="post">
    用户名:<input type="text" name="username"><br>
    密码:<input type="password" name="password"><br>
    登录:<input type="submit" value="登录">
</form>
</body>
</html>

第二步:创建控制器方法,如下所示:

浏览器发送的请求被DispatcherServlet处理后,DispatcherServlet会将得到的请求信息和当前控制器中的@RequestMapping的信息进行匹配,如果匹配成功,则调用当前的方法处理当前的请求

package Controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import javax.servlet.http.HttpServletRequest;
@Controller
public class ServletAPIController {
    @RequestMapping( value = "/param/ServletAPI",method = RequestMethod.POST)
    //HttpServletRequest是Servlet API提供的一个接口,用于封装HTTP请求的信息,而request即为当前要处理的请求对象
    public String getParamTesting(HttpServletRequest request){
        String username=request.getParameter("用户名");
        String password=request.getParameter("密码");
        System.out.println("username:"+username+",password:"+password);
        return "success" ;
    }
}

重新部署项目,测试结果如下:

表单填写完成后,点击登录

成功跳转到success页面

返回控制台,表单信息也被成功获取

通过控制器方法的形参获取请求参数

在控制器方法的形参位置,设置和请求参数同名的形参,当浏览器发送请求,匹配到请求映射时,在DispatcherServlet中就会将请求参数赋值给相应的形参

举例如下:

第一步:创建新的控制器和控制器方法,如下所示:

package Controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class paramTesting {
    @RequestMapping("/param")
    public String getParamTesting(String username,String password){//注意这里的形参名必须与表单中的name相一致
        System.out.println("username:"+username+",password:"+password);
        return "success";
    }
}

第二步:将变量的值动态的渲染到form表单中

index.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<h1>欢迎进入首页!</h1>
<form th:action="@{/param}" method="post">
    用户名:<input type="text" name="username"><br>
    密码:<input type="password" name="password"><br>
    登录:<input type="submit" value="登录">
</form>
</body>
</html>

重新部署项目,将浏览器中的表单填写

跳转到如下所示成功的登录页面:

打开控制台,获取到的表单中的信息如下所示:

我们会发现username,我们在表单填写时的值为小明,而出现在控制台却是乱码的,解决方法如下所示:

package Controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import java.io.UnsupportedEncodingException;
@Controller
public class paramTesting {
    @RequestMapping("/param")
    public String getParamTesting(String username,String password) throws UnsupportedEncodingException {
        //在controller层添加这句话,把jsp前端传过来的字符串改变编码
        username= new String(username.getBytes("ISO8859-1"),"UTF-8");
        password= new String(password.getBytes("ISO8859-1"),"UTF-8");
        System.out.println("username:"+username+",password:"+password);
        return "success";
    }
}

此时重新部署项目,测试结果如下所示:

乱码问题被解决

上述我们是通过设置和请求参数同名的形参,但是在实际开发中往往都是前后端分离,可能会出现前端命名不规范,或者后端变量名冲突,此时后端获取到的有可能为null,对此我们可手动创建请求参数和形参的关系

@RequestParam注解的使用

@RequestParam注解源码,如下所示:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package org.springframework.web.bind.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {
    @AliasFor("name")
    String value() default "";
    @AliasFor("value")
    String name() default "";
    boolean required() default true;
    String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
}

@RequestParam注解是Spring MVC框架中的一个注解,用于绑定请求参数到方法的参数上。它的作用是将HTTP请求中的参数值映射到方法的参数上,以便在方法中使用这些参数值。

具体来说,@RequestParam注解可以用于以下几个方面:

1:绑定请求参数的名称:通过@RequestParam注解,可以指定请求参数的名称,将请求中对应名称的参数值绑定到方法的参数上

2:设置参数的默认值:通过@RequestParam注解的defaultValue属性可以设置参数的默认值。如果请求中没有传递对应名称的参数,那么方法的参数将使用默认值。

3:设置参数的必需性:通过@RequestParam注解的required属性可以指定参数是否为必需的。如果将required属性设置为true(默认值为true),而请求中没有传递对应名称的参数,那么将抛出MissingServletRequestParameterException异常。例如:

但由于我们是表单提交的方式,因此表单中的每个参数名都会被传递,所以为了测试该属性的效果,我们可以手动在地址栏将username删除,只保留password,如下所示:

但是当我们将required的值设置为false时,即使我们手动的在地址栏将请求参数名username删除,只保留password,也不会报错,如下所示:

@RequestHeader注解的使用

将请求头信息和控制器方法进行绑定

@RequestHeader注解源码如下所示:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package org.springframework.web.bind.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestHeader {
    @AliasFor("name")
    String value() default "";
    @AliasFor("value")
    String name() default "";
    boolean required() default true;
    String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
}

举例如下:

假设我们现在向获取请求头信息中的referer,如下所示:

获取方法如下所示:

package Controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.io.UnsupportedEncodingException;
@Controller
public class paramTesting {
    @RequestMapping(value = "/param")
    public String getParamTesting(@RequestParam(required = false,defaultValue = "hello") String username, String password, @RequestHeader("referer") String referer) throws UnsupportedEncodingException {//在控制器方法的形参处创建新的形参名referer,并且给该形参名添加@RequestHeader注解,注解值为请求头信息的参数名
        username= new String(username.getBytes("ISO8859-1"),"GBK");
        password= new String(password.getBytes("ISO8859-1"),"GBK");
        System.out.println("referer:"+referer);
        System.out.println("username:"+username+",password:"+password);
        return "success";
    }
}

测试后,控制台输出如下所示:

@RequestHeader注解中的defaultvalue属性,当该请求的请求头信息中包含@RequestHeader注解中的value时,那么如上所示,它会直接获取该值,否则,将输出defaultvalue中的值,举例如下所示:

我们将defaultvalue的值设置为"No referer",因此当该请求没有来源地址时,会输出该值

public String getParamTesting(@RequestParam(required = false,defaultValue = "hello") String username, String password, @RequestHeader(value = "referer",defaultValue = "No referer") String referer)

测试方法为:将http://localhost:8080/ServletAPI/param?username=zhangsan&password=123复制在新的浏览器地址栏中打开,控制台输出如下所示:

@CookieValue注解的使用

将cookie数据和控制器方法进行绑定

@CookieValue注解源码如下所示:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package org.springframework.web.bind.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CookieValue {
    @AliasFor("name")
    String value() default "";
    @AliasFor("value")
    String name() default "";
    boolean required() default true;
    String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
}

通过之前的学习,我们都知道cookie是键值对,因此,当我们想要获取cookie就比较麻烦,首先通过getcookies()方法获取一个类型为cookie的数组,再通过getName和getValue方法进行获取其键名和值,如果我们想获取一个指定的cookie,那么还需要判断它是否属于某个类,属于我们才能获取其值,但在SpringMVC中,我们不需要如此麻烦,我们可以直接通过@CookieValue注解,如下所示:

假设我们想获取该cookie,方法如下:

测试结果如下所示,控制台输出:

通过pojo获取请求参数

假设我们通过浏览器向服务器传输的数据很复杂,包括姓名,年龄,性别,爱好,邮箱,家庭住址等等,如果我们还是按照上述的方法在控制器方法的参数部分创建形参来接受,这样就会非常麻烦,对此SpringMVC为我们提供了一种简单的方法:只需要在控制器方法的形参位置设置实体类形参,但是需要保证实体类中的属性和请求参数中的名称一致,那么我们才可以直接将请求参数中的值封装到实体类类型的形参中

举例如下所示:

第一步首先创建实体类:

package Controller.pojo;
public class User {
    private Integer id;
    private String username;
    private String password;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    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 User(Integer id, String username, String password) {
        this.id = id;
        this.username = username;
        this.password = password;
    }
    public User() {
    }
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

第二步:创建控制器方法

package Controller.pojo;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class pojoController {
    @RequestMapping("/param/pojo")
    public String pojoTesting(User user){//在控制器方法的形参位置设置实体类形参
    	System.out.println("用户信息为如下所示:");
        System.out.println(user);
        return "success";
    }
}

第三步修改index.html文件

如下所示:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<h1>欢迎进入首页!</h1>
<form th:action="@{/param/pojo}">
    id:<input type="text" name="id"><br>
    用户名:<input type="text" name="username"><br>
    密码:<input type="password" name="password"><br>
    登录:<input type="submit" value="登录">
</form>
</body>
</html>

在浏览器中填写表单:

页面跳转成功后,控制台输出如下所示:

以上就是SpringMVC获取请求参数的方法详解的详细内容,更多关于SpringMVC获取请求参数的资料请关注脚本之家其它相关文章!

相关文章

  • 如何通过idea实现springboot集成mybatis

    如何通过idea实现springboot集成mybatis

    这篇文章主要介绍了如何通过idea实现springboot集成mybatis,使用springboot 集成 mybatis后,通过http请求接口,使得通过http请求可以直接操作数据库,本文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • java中的匿名内部类总结

    java中的匿名内部类总结

    这篇文章主要介绍了 java中的匿名内部类总结的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-09-09
  • SpringBoot整合微信小程序支付V3(支付退款)

    SpringBoot整合微信小程序支付V3(支付退款)

    小程序支付在很多项目都会使用,本文主要介绍了SpringBoot整合微信小程序支付V3,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • 如何把第三方服务注册到spring项目容器中

    如何把第三方服务注册到spring项目容器中

    这篇文章主要为大家介绍了如何把第三方服务注册到spring项目容器中,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Java多线程之哲学家就餐问题详解

    Java多线程之哲学家就餐问题详解

    这篇文章主要介绍了Java多线程之哲学家就餐问题详解,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • java解析Excel文件的方法实例详解

    java解析Excel文件的方法实例详解

    在日常工作中,我们常常会进行文件读写操作,除去我们最常用的纯文本文件读写,更多时候我们需要对Excel中的数据进行读取操作,下面这篇文章主要给大家介绍了关于java解析Excel文件的方法,需要的朋友可以参考下
    2022-06-06
  • java反射_改变private中的变量及方法的简单实例

    java反射_改变private中的变量及方法的简单实例

    下面小编就为大家带来一篇java反射_改变private中的变量及方法的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • Spring事务失效场景的详细整理

    Spring事务失效场景的详细整理

    Spring 事务的传播特性说的是,当多个事务同时存在的时候,Spring 如何处理这些事务的特性,下面这篇文章主要给大家介绍了关于Spring事务失效场景的相关资料,需要的朋友可以参考下
    2022-02-02
  • Flink入门级应用域名处理示例

    Flink入门级应用域名处理示例

    这篇文章主要介绍了一个比较简单的入门级Flink应用,代码很容易写,主要用到的算子有FlatMap、KeyBy、Reduce,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • 如何解决java.util.zip.ZipFile解压后被java占用问题

    如何解决java.util.zip.ZipFile解压后被java占用问题

    这篇文章主要介绍了如何解决java.util.zip.ZipFile解压后被java占用问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06

最新评论