SpringMVC——数据传递的多种方式

本文详细介绍SpringMVC的多种传值方法,像URL路径、参数、表单、Session这些常见方式,以及字符串、JSON、Cookie 和 Header 传递等方法。

本文目录

    • [1. 通过URL路径传值](#1. 通过URL路径传值)
    • [2. 通过URL参数传值](#2. 通过URL参数传值)
    • [3. 通过表单传值](#3. 通过表单传值)
    • [4. 通过Session传值](#4. 通过Session传值)
    • [5. 通过 Cookie 传递](#5. 通过 Cookie 传递)
    • [6. JSON 传递](#6. JSON 传递)

1. 通过URL路径传值

这种方式是将参数直接放在 URL 的路径中,SpringMVC 可以通过 @PathVariable 注解来获取这些参数。

java 复制代码
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class PathVariableController {

    @RequestMapping("/user/{id}")
    @ResponseBody
    public String getUserById(@PathVariable("id") int id) {
        return "UserID: " + id;
    }
}

@PathVariable 注解用于绑定 URL 路径中的变量 id,并将其作为方法的参数传入。当访问 /user/1 时,id 的值就是 1。

2. 通过URL参数传值

这是最常见的传值方式,将参数以 key = value 的形式附加在URL后面,多个参数之间用 & 分隔。SpringMVC 可以通过 @RequestParam 注解来获取这些参数。

java 复制代码
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class RequestParamController {

    @RequestMapping("/search")
    @ResponseBody
    public String search(@RequestParam("keyword") String keyword) {
        return "keyword: " + keyword;
    }
}

@RequestParam 注解用于绑定UR 参数 keyword,并将其作为方法的参数传入。当访问 /search?keyword=java 时,keyword 的值就是 java

3. 通过表单传值

在 HTML 表单中填写数据,提交表单时,表单数据会被发送到服务器。SpringMVC可以通过 @ModelAttribute 注解将表单数据绑定到一个Java对象上。

java 复制代码
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

class User {
    private String name;
    private int age;

    // Getters and Setters
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

@Controller
public class ModelAttributeController {

    @RequestMapping("/register")
    @ResponseBody
    public String register(@ModelAttribute User user) {
        return "name: " + user.getName() + ", age: " + user.getAge();
    }
}

@ModelAttribute 注解将表单数据绑定到 User 对象上。表单中的 nameage 字段会自动映射到 User 对象的相应属性上。

4. 通过Session传值

通过 HttpSession 对象来实现数据在不同请求之间的传递。

java 复制代码
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

@Controller
public class SessionController {

    @RequestMapping("/setSession")
    @ResponseBody
    public String setSession(HttpServletRequest request) {
        HttpSession session = request.getSession();
        session.setAttribute("message", "Hello, Session!");
        return "Session attribute set.";
    }

    @RequestMapping("/getSession")
    @ResponseBody
    public String getSession(HttpServletRequest request) {
        HttpSession session = request.getSession();
        String message = (String) session.getAttribute("message");
        return "value: " + message;
    }
}

setSession 方法将一个字符串存储到 HttpSession 中,getSession 方法从 HttpSession 中获取该字符串。

可以在请求和响应中使用 Cookie 来传递数据。在 SpringMVC 中,可以使用 @CookieValue 注解获取请求中的 Cookie 值,也可以通过 HttpServletResponse 设置响应的 Cookie。

java 复制代码
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;

@Controller
public class CookieController {

    @RequestMapping("/setCookie")
    @ResponseBody
    public String setCookie(HttpServletResponse response) {
        Cookie cookie = new Cookie("userName", "John");
        cookie.setPath("/");
        response.addCookie(cookie);
        return "Cookie set.";
    }

    @RequestMapping("/getCookie")
    @ResponseBody
    public String getCookie(@CookieValue(value = "userName", defaultValue = "Unknown") String userName) {
        return "value: " + userName;
    }
}

6. JSON 传递

使用@RequestBody 注解,能接收JSON数据并将其转换为Java对象。

java 复制代码
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

class UserInfo {
    private String username;
    private int userAge;

    // Getters and Setters
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public int getUserAge() {
        return userAge;
    }

    public void setUserAge(int userAge) {
        this.userAge = userAge;
    }
}

@Controller
public class JsonPassingController {
    @RequestMapping(value = "/jsonPass", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
    @ResponseBody
    public String handleJson(@RequestBody UserInfo user) {
        return "user: " + user.getUsername() + ", age: " + user.getUserAge();
    }
}

使用 @RequestBody 注解把接收到的 JSON 数据映射到 UserInfo 对象,发送的 JSON 数据格式如 {"username": "John", "userAge": 25},就能把数据封装到 UserInfo 对象中。

|-----------------------------------------------------------------------------------------------------|--------------------|--------------------------------------------------------------------------------------------------|
| ← 上一篇 Java进阶------常用类及常用方法详解 | 记得点赞、关注、收藏哦! | 下一篇 Java进阶------数组超详细整理 → |

相关推荐
我是苏苏1 分钟前
C#基础:使用System.Speech.Synthesis离线播放/朗读文字内容
开发语言·c#
Patrick在香港15 分钟前
Python依赖管理从踩坑到选型:pip/poetry/uv四种方案全面实测
开发语言·python·数据分析·scikit-learn·ai编程·pip·uv
骇客野人16 分钟前
IntelliJ IDEA 菜单中英对照
java·ide·intellij-idea
我命由我1234516 分钟前
Kotlin 面向对象 - 枚举排序
android·java·开发语言·java-ee·kotlin·android studio·android-studio
程序喵大人19 分钟前
【C++进阶】STL容器与迭代器 - 10 把容器、迭代器和数据流串成一个小程序
开发语言·c++·容器·小程序·迭代器·stl
Sam_Deep_Thinking37 分钟前
用Java 17从0到1写一个mini版RPC,理解远程调用的本质
java·面试·rpc·程序员·系统架构
luj_176840 分钟前
随机性在算法与占卜中的共通原理
c语言·开发语言·c++·经验分享·算法
Lazionr1 小时前
vector初识——从动态数组到STL核心容器
开发语言·c++
AI视觉网奇1 小时前
glb读取颜色
开发语言·python
敲代码的嘎仔1 小时前
从零搭建微服务:Spring Cloud Alibaba 全家桶踩坑实录(Nacos + OpenFeign + Gateway + Sentinel)
java·spring boot·spring·spring cloud·微服务·gateway·sentinel