当前位置: 首页 > article >正文

springmvc的获取请求数据

在使用 SpringMVC 开发 web 应用时,我们经常需要从用户的请求中获取数据。不管是表单提交、查询参数,还是路径上的数据,SpringMVC 都为我们提供了简单而强大的方式来获取这些数据。

1. 使用 @RequestParam 获取查询参数

  1. 基本使用:
    RequestParam注解作用:将请求参数与方法上的形参映射。
    最常见的情况就是获取请求路径中的查询参数,比如 ?name=Grace&age=25。在 SpringMVC 中,可以使用 @RequestParam 注解来轻松获取这些参数:
@RequestMapping("/greet")
public String greet(@RequestParam("name") String name, @RequestParam("age") int age) {
    System.out.println("Name: " + name);
    System.out.println("Age: " + age);
    return "greeting";
}

对于@RequestParam注解来说,属性有value和name,这两个属性的作用相同,都是用来指定提交数据的name。

  1. RequestParam注解的defaultValue属性
    @RequestParam 允许你指定参数的名称,如果这个参数是必需的,你可以省略其他配置。你还可以为它指定默认值,以防请求中缺少该参数:
@RequestParam(value = "country", defaultValue = "Unknown") String country
  1. RequestParam注解的required属性

required属性用来设置该方法参数是否为必须的。默认情况下,这个参数为true,表示方法参数是必需的。如果请求中缺少对应的参数,则会抛出异常。 可以将其设置为false,false表示不是必须的,如果请求中缺少对应的参数,则方法的参数为null。

测试,修改register方法,如下:


@RequestMapping("/greet")
public String greet(@RequestParam("name") String name, @RequestParam("age") int age,
@RequestParam(value = "girlfrind" required = "false") String girlfrind) {
    System.out.println("Name: " + name);
    System.out.println("Age: " + age);
    System.out.println("girlfrind: " + girlfrind);
    return "greeting";
}

如果一个参数被设置为不是必需的,当没有提交对应的请求参数时,形参默认值null

2. 依靠控制器方法上的形参名来接收

@RequestParam 这个注解是可以省略的,如果方法形参的名字和提交数据时的name相同,则 @RequestParam 可以省略。

但有一个前提:如果你采用的是Spring6+版本,你需要在pom.xml文件中指定编译参数’-parameter’,配置如下:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.12.1</version>
            <configuration>
                <source>21</source>
                <target>21</target>
                <compilerArgs>
                    <arg>-parameters</arg>
                </compilerArgs>
            </configuration>
        </plugin>
    </plugins>
</build>

注意:如果你使用的是Spring5的版本,以上的配置是不需要的。

Controller中的方法只需要这样写:形参的名字必须和提交的数据的name一致!!!!!
form表单

<form th:action="@{/user/reg}" method="get">
    用户名:<input type="text" name="username"><br>
    密码:<input type="password" name="password"><br>
    性别:
    男 <input type="radio" name="sex" value="1"><input type="radio" name="sex" value="0">
    <br>
    爱好:
    抽烟 <input type="checkbox" name="hobby" value="smoke">
    喝酒 <input type="checkbox" name="hobby" value="drink">
    烫头 <input type="checkbox" name="hobby" value="perm">
    <br>
    简介:<textarea rows="10" cols="60" name="intro"></textarea><br>
    <input type="submit" value="注册">
</form>
    @PostMapping("/user/reg")
            public String register(String username, String password, String sex, String hobby, String intro){
        System.out.println(username);
        System.out.println(password);
        System.out.println(sex);
        System.out.println(hobby);
        System.out.println(intro);
        return "testPage";
        }

另外,还有一点,对于提交的hobby数据,也可以采用String来接收,不一定使用数组方式

3.使用POJO类/JavaBean接收请求参数

以上方式大家可以看到,当提交的数据非常多时,方法的形参个数会非常多,这不是很好的设计。在SpringMVC中也可以使用POJO类/JavaBean来接收请求参数。不过有一个非常重要的要求:POJO类的属性名必须和请求参数的参数名保持一致。提供以下的JavaBean:


public class User {
    private Long id;
    private String username;
    private String password;
    private String sex;
    private String[] hobby;
    private String intro;

    public User() {
    }

    public User(Long id, String username, String password, String sex, String[] hobby, String intro) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.sex = sex;
        this.hobby = hobby;
        this.intro = intro;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long 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 String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String[] getHobby() {
        return hobby;
    }

    public void setHobby(String[] hobby) {
        this.hobby = hobby;
    }

    public String getIntro() {
        return intro;
    }

    public void setIntro(String intro) {
        this.intro = intro;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", sex='" + sex + '\'' +
                ", hobby=" + Arrays.toString(hobby) +
                ", intro='" + intro + '\'' +
                '}';
    }
}

在控制器方法的形参位置上使用javabean来接收请求参数:

@PostMapping("/register")
public String register(User user){
    System.out.println(user);
    return "success";
}

底层的实现原理:反射机制。先获取请求参数的名字,因为请求参数的名字就是JavaBean的属性名,通过这种方式给对应的属性赋值究其根本就是找到其Set方法

4. 使用 HttpServletRequest 手动获取请求数据

当然,有时你可能需要更底层的操作,这时候可以使用 HttpServletRequest,它让你可以直接获取所有请求信息:

@RequestMapping("/info")
public String getInfo(HttpServletRequest request) {
    String name = request.getParameter("name");
    System.out.println("Name: " + name);
    return "infoPage";
}

在SpringMVC当中,一个Controller类中的方法参数上如果有HttpServletRequest,SpringMVC会自动将当前请求对象传递给这个参数,因此我们可以通过这个参数来获取请求提交的数据。
这种方式虽然灵活,但相比于注解的方法,需要写更多的代码,所以不推荐作为首选。

CookieValue注解

该注解的作用:将请求提交的Cookie数据映射到方法形参
同样是有三个属性:value、required、defaultValue

前端页面中编写发送cookie的代码:

<script type="text/javascript">
    function sendCookie(){
        document.cookie = "id=123456789; expires=Thu, 18 Dec 2025 12:00:00 UTC; path=/";
        document.location = "/springmvc/register";
    }
</script>
<button onclick="sendCookie()">向服务器端发送Cookie</button>

后端UserController代码:

    @GetMapping("/user/reg")
    public String register(User user,
                           @RequestHeader(value="Referer", required = false, defaultValue = "")
                           String referer,
                           @CookieValue(value="id", required = false, defaultValue = "")
                           String id){
        System.out.println(user);
        System.out.println(referer);
        System.out.println("客户端提交过来的Cookie: " + id);
        return "testPage";
    }

http://www.kler.cn/a/501044.html

相关文章:

  • Linux web渗透攻防
  • 微服务的配置共享
  • 一键整理背包界面功能
  • 网络传输层TCP协议
  • Cline(原Claude Dev)开源的IDE AI插件,如何搭配OpenRouter实现cursor功能,Cline怎么使用
  • 2024年度漏洞态势分析报告,需要访问自取即可!(PDF版本)
  • containerd系统分析(五)-网络分析
  • 判断两个字符串是不是旋转字符串
  • 《探索鸿蒙Next上开发人工智能游戏应用的技术难点》
  • 【MySQL】NOT IN需要外部套一层SELECT
  • Linux 发行版介绍与对比:Red Hat、Ubuntu、Kylin、Debian
  • 百度视频搜索架构演进
  • Open FPV VTX开源之第一次出图
  • 【面试题】技术场景 4、负责项目时遇到的棘手问题及解决方法
  • 【mysql】约束的基本使用
  • 《跟我学Spring Boot开发》系列文章索引❤(2025.01.09更新)
  • ollama教程(window系统)
  • element plus 使用 el-tree 组件设置默认选中和获取所有选中节点id
  • Q_OBJECT宏报错的问题
  • Liunx-搭建安装VSOMEIP环境教程 执行 运行VSOMEIP示例demo
  • 网络安全-防火墙
  • DolphinScheduler自身容错导致的服务器持续崩溃重大问题的排查与解决
  • 第41章 使用 Docker Compose 进行容器迁移的技术指南及优势
  • 二十三种设计模式-原型模式
  • 深度学习张量的秩、轴和形状
  • HarmonyOS鸿蒙开发 弹窗及加载中指示器HUD功能实现