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获取请求参数的资料请关注脚本之家其它相关文章!

相关文章

  • 从零搭建Spring Boot脚手架整合OSS作为文件服务器的详细教程

    从零搭建Spring Boot脚手架整合OSS作为文件服务器的详细教程

    这篇文章主要介绍了从零搭建Spring Boot脚手架整合OSS作为文件服务器的详细教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • Java经典面试题汇总:Spring

    Java经典面试题汇总:Spring

    本篇总结的是Spring框架相关的面试题,后续会持续更新,希望我的分享可以帮助到正在备战面试的实习生或者已经工作的同行,如果发现错误还望大家多多包涵,不吝赐教,谢谢
    2021-07-07
  • Automapper实现自动映射的实例代码

    Automapper实现自动映射的实例代码

    这篇文章主要介绍了Automapper实现自动映射的实例代码,需要的朋友可以参考下
    2017-09-09
  • 使用@Builder导致无法创建无参构造方法的解决

    使用@Builder导致无法创建无参构造方法的解决

    这篇文章主要介绍了使用@Builder导致无法创建无参构造方法的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Json在Struts中的转换与传递方法

    Json在Struts中的转换与传递方法

    下面小编就为大家带来一篇Json在Struts中的转换与传递方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • Maven deploy plugin使用方式

    Maven deploy plugin使用方式

    这篇文章主要介绍了Maven deploy plugin使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Collection stream使用示例详解

    Collection stream使用示例详解

    这篇文章主要介绍了Collection stream使用示例,stream流几乎可以完成对集合的任意操作,映射、去重、分组、排序、过滤等
    2022-12-12
  • MyBatis中的resultMap简要概述

    MyBatis中的resultMap简要概述

    这篇文章主要介绍了MyBatis中的resultMap简要概述的相关资料,需要的朋友可以参考下
    2016-07-07
  • Java 流处理之收集器详解

    Java 流处理之收集器详解

    这篇文章主要介绍了Java 流处理之收集器,本文以记录 Record 为例,结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • mvn中dependencyManagement的使用详解

    mvn中dependencyManagement的使用详解

    这篇文章主要介绍了mvn中dependencyManagement的使用,子项目中只是声明使用此依赖即可,可不用指定版本(将使用父pom同一指定的版本),若指定了版本,将以子项目的版本号为主,需要的朋友可以参考下
    2022-08-08

最新评论