SpringMVC (二)请求处理

目录

章节简介

[一 请求处理(初级)](#一 请求处理(初级))

eg:请求头

[二 请求处理(进阶)](#二 请求处理(进阶))

eg:请求体

[三 获取请求头](#三 获取请求头)

[四 获取Cookie](#四 获取Cookie)

[五 级联封装](#五 级联封装)

[六 使用@RequestBoby封装JSON对象](#六 使用@RequestBoby封装JSON对象)

[七 文件的上传](#七 文件的上传)

[八 获取整个请求 HttpEntity](#八 获取整个请求 HttpEntity)

[九 原生请求](#九 原生请求)


Spring MVC 是 Spring 框架中的一个核心模块,专门用于构建 灵活、松耦合的 Web 应用程序 。它基于经典的 MVC(Model-View-Controller)设计模式,但通过 Spring 的依赖注入(DI)和面向切面(AOP)等特性,简化了开发流程,提高了代码的可维护性。

与传统 Servlet/JSP 对比

特性 Spring MVC 传统 Servlet/JSP
耦合性 低(基于接口和注解) 高(直接依赖 Servlet API)
配置 注解驱动,简化 XML/Java 配置 需手动配置 web.xml
测试 易于单元测试(Mock 框架支持) 测试复杂(依赖容器)
扩展性 模块化设计,易于扩展 扩展需手动管理
功能集成 无缝集成 Spring 生态(如安全、事务) 需自行整合其他库

复习巩固前言JSON

图示:

章节简介

一 请求处理(初级)

eg:请求头

1 处理请求参数

前端代码:

java 复制代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>信息提交表单</title>
</head>
<body>
<h3>信息采集</h3>
<!-- 指定提交地址为 /handle02  表单数据会附加在 URL 参数中-->
<form action="/handle02" method="get">
    <fieldset>
        <legend>主要信息</legend>
        <label for="account1">账户:</label>
        <input type="text" id="account1" name="account" value="" maxlength="10"><br>
        <label>密码:<input type="password" id="password1" name="pw" maxlength="9"></label><br>
        <label>性别:
            <input type="radio" name="gender" id="gender1" value="male" checked> 男
            <input type="radio" name="gender" value="female"> 女
        </label><br>
        <label>爱好:
            <input type="text" id="hobby" name="hobby">
            <input type="checkbox" name="hobby" value="smoke"> 抽烟
            <input type="checkbox" name="hobby" value="drink"> 喝酒
            <input type="checkbox" name="hobby" value="perm"> 烫头
        </label><br>
    </fieldset>
    其他补充信息:<br>
    <textarea name="other" cols="25" rows="2"></textarea><br>
    籍贯:
    <select name="place">
        <option value="鲁">山东省</option>
        <option value="皖">安徽省</option>
        <option value="粤">广东省</option>
        <option value="京" selected>北京市</option>
        <option value="苏">江苏省</option>
    </select><br>
    <input type="hidden" name="hid" value="hahahahahahaha">
    <input type="submit" value="确认">
    <input type="reset" value="重置">
</form>
</body>
</html>

请求方法类:

java 复制代码
package org.example.spring04mvc.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class RequestTestController {

    @RequestMapping("/handle01")
    public String handleRequest(
            @RequestParam String account,
            @RequestParam String pw,
            @RequestParam String gender,
            @RequestParam List<String> hobby,
            @RequestParam(required = false) String other,
            @RequestParam String place,
            @RequestParam String hid
    ) {
        System.out.println("Account: " + account);
        System.out.println("Password: " + pw);
        System.out.println("Gender: " + gender);
        System.out.println("Hobbies: " + hobby);
        System.out.println("Place: " + place); // 自动处理URL编码(如"京")
        if (other != null) {
            System.out.println("Other: " + other);
        }
        System.out.println("隐藏信息: " + hid);
        return "表单上传成功!";
    }


}

Sprig项目启动页面展示

个人控制台与浏览器展示:

二 请求处理(进阶)

eg:请求体

前端代码:

java 复制代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>信息提交表单</title>
</head>
<body>
<h3>信息采集</h3>
<!-- 指定提交地址为 /handle02 表单数据会通过 HTTP 请求体(Body) 发送到服务器。 -->
<form action="/handle02" method="post">
    <fieldset>
        <legend>主要信息</legend>
        <label for="account1">账户:</label>
        <input type="text" id="account1" name="account" value="" maxlength="10"><br>
        <label>密码:<input type="password" id="password1" name="pw" maxlength="9"></label><br>
        <label>性别:
            <input type="radio" name="gender" id="gender1" value="male" checked> 男
            <input type="radio" name="gender" value="female"> 女
        </label><br>
        <label>爱好:
            <input type="text" id="hobby" name="hobby">
            <input type="checkbox" name="hobby" value="smoke"> 抽烟
            <input type="checkbox" name="hobby" value="drink"> 喝酒
            <input type="checkbox" name="hobby" value="perm"> 烫头
        </label><br>
    </fieldset>
    其他补充信息:<br>
    <textarea name="other" cols="25" rows="2"></textarea><br>
    籍贯:
    <select name="place">
        <option value="鲁">山东省</option>
        <option value="皖">安徽省</option>
        <option value="粤">广东省</option>
        <option value="京" selected>北京市</option>
        <option value="苏">江苏省</option>
    </select><br>
    <input type="hidden" name="hid" value="hahahahahahaha">
    <input type="submit" value="确认">
    <input type="reset" value="重置">
</form>
</body>
</html>

封装:(可能由于版本问题@Data使用出错)

java 复制代码
package org.example.spring04mvc.bean;

import lombok.Data;

@Data
public class emailUsers {
    // 账号指定默认值
    private String account="zhangsan";
    private String pw;
    private String gender;
    private String hid;
    private String place;
    private String other;
    private String[] hobby;


}

指定:

java 复制代码
package org.example.spring04mvc.controller;

import org.example.spring04mvc.bean.emailUsers;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
public class RequestTestController {

    @RequestMapping("/handle01")
    public String handleRequest(
            @RequestParam String account,
            @RequestParam String pw,
            @RequestParam String gender,
            @RequestParam List<String> hobby,
            @RequestParam(required = false) String other,
            @RequestParam String place,
            @RequestParam String hid
    ) {
        System.out.println("Account: " + account);
        System.out.println("Password: " + pw);
        System.out.println("Gender: " + gender);
        System.out.println("Hobbies: " + hobby);
        System.out.println("Place: " + place); // 自动处理URL编码(如"京")
        if (other != null) {
            System.out.println("Other: " + other);
        }
        System.out.println("隐藏信息: " + hid);
        return "表单上传成功!";
    }
    @RequestMapping("/handle02")
    public String handleRequest02(emailUsers emailUser){
        System.out.println(emailUser);
        return "表单上传成功!";
    }

}

运行结果:

三 获取请求头

java 复制代码
    @RequestMapping("/handle03")
    public String handleRequest03(@RequestHeader(value = "Host",defaultValue = "localhost") String host) {
        System.out.println(host);
        return "Ok" + host;
    }

四 获取Cookie

java 复制代码
    @RequestMapping("/handle04")
    public String handleRequest04(@CookieValue(value = "JSESSIONID",defaultValue = "") String sessionId) {
        System.out.println(sessionId);
        return "Ok" + sessionId;
    }

五 级联封装

六 使用@RequestBoby封装JSON对象

代码实现:

java 复制代码
    //测试接收JSON数据,获取请求体json的数据,自动转为对象
    @RequestMapping("/handle06")
    public String handleRequest06(@RequestBody emailUsers emailUser) {
        System.out.println(emailUser);
        return "OK";
    }
java 复制代码
    //将JSON对象以字符串接收
    @RequestMapping("/handle07")
    public String handleRequest07(@RequestBody String json) {
        System.out.println(json);
        return "OK";
    }

七 文件的上传

java 复制代码
    //接收文件上传表单
    @RequestMapping("/handle08")
    public String handleRequest08(emailUsers emailUser,
                                  @RequestParam("file") MultipartFile f1,
                                  @RequestParam("file2") MultipartFile[] f2) throws IOException {
        // 1获取原始文件名
        String originalFilename = f1.getOriginalFilename();
        // 2获取文件大小
        long size = f1.getSize();
        // 3获取文件流
        InputStream inputStream = f1.getInputStream();
        // 4文件保存
        f1.transferTo(new File("D:\\" + originalFilename));
        System.out.println(emailUser);
        return "OK";
    }

更改部分参数

八 获取整个请求 HttpEntity

HttpEntity 是 Spring Framework 中用于表示 HTTP 请求或响应实体 的核心类,它封装了 HTTP 消息的 头部(Headers)正文(Body),常用于客户端和服务端之间的数据交互。以下是其核心特性和用法:


1. 核心功能

  • 封装数据 :包含 HTTP 消息的 body(如 JSON、XML、表单数据)和 headers(如 Content-TypeAuthorization)。

  • 支持泛型HttpEntity<T> 允许指定正文内容的类型(如 Stringbyte[]Map 或自定义对象)。

  • 不可变性 :创建后不可修改,若需变更需通过 HttpEntity 的构建方法生成新实例。

java 复制代码
    // HttpEntity 封装请求头请求体,把整个请求拿过来封装
    @RequestMapping("/handle09")
    public String handleRequest09(HttpEntity<String> httpEntity){
        //拿到请求头
        HttpHeaders headers = httpEntity.getHeaders();
        //拿到请求体
        String body = httpEntity.getBody();

        return "OK";
    }

九 原生请求

java 复制代码
    //使用原生API
    @RequestMapping("/handle10")
    public String handleRequest10(HttpServletRequest request) throws IOException {
        //拿到请求头
        Enumeration<String> headerNames = request.getHeaderNames();
        //拿到请求体
        String body = request.getReader().readLine();

        return "OK";
    }
相关推荐
小杨40420 分钟前
springboot框架项目应用实践六(参数校验validation基础)
spring boot·后端·架构
java技术小馆1 小时前
责任链模式如何减少模块之间的耦合
java·数据库·设计模式·责任链模式
大溪地C1 小时前
Spring Boot3整合Knife4j(4.5.0)
java·数据库·spring boot
Java&Develop1 小时前
java项目springboot 项目启动不了解决方案
java·开发语言·spring boot
飞奔的马里奥2 小时前
30天学习Java第四天——JVM规范
java·jvm·学习
₁ ₀ ₂ ₄2 小时前
深入理解 Reactor Netty 线程配置及启动命令设置
java·开发语言
花千树-0102 小时前
J-LangChain - Agent - 编排一个 ReAct + Function Call 反应链
java·gpt·langchain·prompt·github·aigc·ai编程
m0_663234012 小时前
springboot3整合knife4j详细版,包会!(不带swagger2玩)
java
neo_Ggx233 小时前
Spring上下文工具类
java·后端·spring
圈圈编码3 小时前
SpringBoot 自动配置原理
java·spring boot·spring