SpringMVC获取请求参数~

简介: SpringMVC获取请求参数~

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

通过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>

在浏览器中填写表单:

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

相关文章
|
前端开发 Java 数据安全/隐私保护
深入理解 Spring MVC Controller —— 请求参数获取
前言 接上篇《深入理解 Spring MVC Controller —— 请求映射》,上篇主要介绍了处理器方法及请求映射的定义。有了处理器方法 Spring MVC 就可以对请求进行处理,有了请求映射 Spring MVC 就能知道哪些请求应该由哪些处理器方法来处理。
1091 0
深入理解 Spring MVC Controller —— 请求参数获取
|
2月前
|
存储 缓存 Java
Spring中@Cacheable、@CacheEvict以及其他缓存相关注解的实用介绍
缓存是提升应用性能的重要技术,Spring框架提供了丰富的缓存注解,如`@Cacheable`、`@CacheEvict`等,帮助开发者简化缓存管理。本文介绍了如何在Spring中配置缓存管理器,使用缓存注解优化数据访问,并探讨了缓存的最佳实践,以提升系统响应速度与可扩展性。
258 0
Spring中@Cacheable、@CacheEvict以及其他缓存相关注解的实用介绍
|
XML 前端开发 Java
【Spring MVC 系列】Spring MVC 中 Filter 配置的 6 种方式,看看你了解哪些
Filter 简介 过滤器 Filter 在 Servlet 2.3 版本中被首次提出,唯一的作用就是过滤,它不仅可以过滤请求,还可以过滤响应,当请求到达 Servlet 容器,会先经过 Filter ,然后再交给 Servlet,之后 Filter 还可以对 Servlet 的响应进一步处理。并且多个 Filter 还能形成一个链。使用图示表达如下。
1361 0
【Spring MVC 系列】Spring MVC 中 Filter 配置的 6 种方式,看看你了解哪些
|
存储 前端开发 Java
Spring MVC request 获取方式大总结
前言 普通的 Java Web 项目中,我们经常使用 HttpServletRequest 获取请求参数,请求头等信息。 到了 Spring MVC 项目,我们通常会使用 Spring 提供的注解获取参数,如 @RequestParam、@RequestHeader。 不过在某些场景下,我们可能还是想获取 HttpServletRequest 对象,如获取请求 IP,获取请求域名等。这篇我们来学习如何在 Spring MVC 环境下获取 HttpServletRequest,以及它们的实现方式,以做到知其所以然。
906 0
Spring MVC request 获取方式大总结
|
Java Spring
SpringMVC - @DeleteMapping 注解无法获取参数值及解决方案
SpringMVC - @DeleteMapping 注解无法获取参数值及解决方案
2580 0
|
Java Spring 容器
将Bean放入Spring容器中的几种方式
平时在项目中,都是将对象交由Spring去管理,那么将一个对象加入Spring容器中,有哪些方式呢,下面来总结下。
将Bean放入Spring容器中的几种方式
|
Apache 网络架构
SpringBoot整合cxf发布webService
1. 看看项目结构图 2. cxf的pom依赖 1 2 org.apache.cxf3 cxf-spring-boot-starter-jaxws4 3.2.45 3.
2374 0
|
17天前
|
存储 弹性计算 人工智能
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
2025年9月24日,阿里云弹性计算团队多位产品、技术专家及服务器团队技术专家共同在【2025云栖大会】现场带来了《通用计算产品发布与行业实践》的专场论坛,本论坛聚焦弹性计算多款通用算力产品发布。同时,ECS云服务器安全能力、资源售卖模式、计算AI助手等用户体验关键环节也宣布升级,让用云更简单、更智能。海尔三翼鸟云服务负责人刘建锋先生作为特邀嘉宾,莅临现场分享了关于阿里云ECS g9i推动AIoT平台的场景落地实践。
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾