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

SpringMVC 请求与响应处理详解

引言

在 Java Web 开发中,SpringMVC 作为 Spring 框架的重要模块,提供了强大的请求和响应处理机制。本文将深入探讨 SpringMVC 中请求和响应的处理方式,结合实际案例,帮助开发者更好地理解和应用这些功能。

一、SpringMVC 请求处理

1. RequestMapping 注解

RequestMapping 注解用于建立请求 URL 和处理方法之间的映射关系,可以作用在类或方法上。

  • 作用在类上:作为一级请求路径。

  • 作用在方法上:作为二级请求路径。

@Controller
@RequestMapping("/user")
public class UserController {@RequestMapping("/save")public String save() {return "success";}
}

访问路径为:http://localhost:8080/项目名/user/save

属性说明
  • path/value:指定请求路径的 URL。

  • method:指定允许的 HTTP 请求方法,如 RequestMethod.GET、RequestMethod.POST。

  • params:指定请求参数的条件。

@RequestMapping(value = "/save", method = RequestMethod.POST, params = "age=18")
public String save(@RequestParam("age") int age) {// 处理逻辑
}

2. 请求参数绑定

SpringMVC 支持多种类型的数据绑定,包括基本数据类型、字符串、实体类和集合类型。

基本数据类型和字符串

表单提交的参数名称需与方法参数名称一致。

@RequestMapping("/save")
public String save(String username, Integer age) {System.out.println("Username: " + username + ", Age: " + age);return "success";
}

对应的表单:

<form action="/user/save" method="post"><input type="text" name="username"><input type="text" name="age"><input type="submit" value="Submit">
</form>

预览

实体类绑定

表单参数名称需与实体类属性名称一致。

public class User {private String username;private Integer age;// getter 和 setter
}@RequestMapping("/save1")
public String save1(User user) {System.out.println(user);return "success";
}

对应的表单:

<form action="/user/save1" method="post"><input type="text" name="username"><input type="text" name="age"><input type="submit" value="Submit">
</form>

预览

集合类型绑定

支持 List 和 Map 类型的参数绑定。

@RequestMapping("/save2")
public String save2(@RequestParam("users") List<User> users) {System.out.println(users);return "success";
}

对应的表单:

<form action="/user/save2" method="post"><input type="text" name="users[0].username"><input type="text" name="users[0].age"><input type="text" name="users[1].username"><input type="text" name="users[1].age"><input type="submit" value="Submit">
</form>

预览

3. 使用 Servlet API

在控制器中可以直接使用 HttpServletRequest 和 HttpServletResponse 对象。

@RequestMapping("/save3")
public String save3(HttpServletRequest request, HttpServletResponse response) {String username = request.getParameter("username");int age = Integer.parseInt(request.getParameter("age"));System.out.println("Username: " + username + ", Age: " + age);return "success";
}

4. RequestParam 注解

用于绑定请求参数到方法参数。

@RequestMapping("/save4")
public String save4(@RequestParam("username") String name, @RequestParam("age") int age) {System.out.println("Username: " + name + ", Age: " + age);return "success";
}

二、SpringMVC 响应处理

1. 使用 ModelAndView

通过 ModelAndView 对象返回视图和模型数据。

@RequestMapping("/save5")
public ModelAndView save5() {ModelAndView modelAndView = new ModelAndView();modelAndView.addObject("msg", "保存成功");modelAndView.setViewName("result");return modelAndView;
}

对应的视图 result.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Result</title>
</head>
<body>
<h1 th:text="${msg}"></h1>
</body>
</html>

预览

2. 使用 Servlet API 进行输出

直接通过 HttpServletResponse 输出内容。

@RequestMapping("/save6")
public void save6(HttpServletResponse response) throws IOException {response.getWriter().println("保存成功");
}

3. 重定向与转发

请求转发

请求转发 本身是一种服务器端行为   浏览器的地址栏不发生变化 从始至终都是一个请求 request信息在servlet当中是共享的 只能在网站内部资源之间进行转发

@RequestMapping("/test1")
public String test1() {return "forward:/otherPage";
}
请求重定向

重定向  本身是一种客户端行为  地址栏是发生改变的  浏览器会发起两次请求 request域当中的信息是不共享的  可以访问网站外部资源

@RequestMapping("/test2")
public String test2() {return "redirect:/otherPage";
}

4. 返回 JSON 数据

使用 @ResponseBody 注解将 Java 对象转换为 JSON 响应。

@RequestMapping("/find")
@ResponseBody
public User find() {return new User("张三", 25, '男');
}

需要引入 Jackson 相关依赖:

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.0</version>
</dependency>

三、总结

本文详细介绍了 SpringMVC 中请求和响应的处理方式,包括 RequestMapping 注解的使用、参数绑定、Servlet API 的应用、重定向与转发、JSON 响应、文件上传下载以及异常处理等内容。通过这些技术点的讲解和示例,开发者可以更高效地使用 SpringMVC 构建功能完善的 Web 应用。

相关文章:

SpringMVC 请求与响应处理详解

引言 在 Java Web 开发中&#xff0c;SpringMVC 作为 Spring 框架的重要模块&#xff0c;提供了强大的请求和响应处理机制。本文将深入探讨 SpringMVC 中请求和响应的处理方式&#xff0c;结合实际案例&#xff0c;帮助开发者更好地理解和应用这些功能。 一、SpringMVC 请求处…...

【python】requests 爬虫高效获取游戏皮肤图

1. 引言 在当今的数字时代&#xff0c;游戏已经成为许多人生活中不可或缺的一部分。而游戏中的皮肤&#xff0c;作为玩家个性化表达的重要方式&#xff0c;更是受到了广泛的关注和喜爱。然而&#xff0c;对于许多玩家来说&#xff0c;获取游戏皮肤往往需要花费大量的时间和精力…...

(UI自动化测试web端)第二篇:元素定位的方法_css定位之ID选择器

看代码里的【find_element_by_css_selector( )】( )里的表达式怎么写&#xff1f; 文章介绍了第一种写法id选择器&#xff0c;其实XPath元素定位要比CSS好用&#xff0c;原因是CSS无法使用下标&#xff08;工作当中也是常用的xpath&#xff09;&#xff0c;但CSS定位速度比XPat…...

23种设计模式-代理(Proxy)设计模式

代理设计模式 &#x1f6a9;什么是代理设计模式&#xff1f;&#x1f6a9;代理设计模式的特点&#x1f6a9;代理设计模式的结构&#x1f6a9;代理设计模式的优缺点&#x1f6a9;代理设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是代理设计模式…...

【react18】react项目使用mock模拟后台接口

前后端分离项目&#xff0c;后端还没有接口的时候&#xff0c;前端可以使用mockjs的技术实行假数据的模拟。这里使用的是mock的库msw实现这个业务. MSW msw是mock的工具&#xff0c;官网地址是在这里 使用步骤 1.安装msw npm install mswlatest --save-dev2.新建存放mock接…...

Excel新增的函数

常用函数 XLOOKUP 1、普通查找 2、屏蔽错误值 3、横向查找 4、通配符查找 ?:代表任意单个字符 *:代表任意多个字符 5、反向查找 6、多条件查找 7、查找多列数据 8、查找最后一个 IFS MINIFS MAXIFS 文本函数 TEXTSPLIT、TEXTJOIN、CONCAT、 TEXTBEFORE、TEXTAFT…...

Windows下VSCode的安装

前言 VSCode的安装看起来平平无奇&#xff0c;但也不是轻轻松松的。笔者将最新的Windows下安装VSCode&#xff0c;以及运行最简单的C程序的过程记录下来&#xff0c;供后续的自己和大家参考。 一、官网下载安装包 Visual Studio Code - Code Editing. Redefined 二、安装 直接…...

django入门教程之templates和static资源【五】

使用app01子应用举例说明模板的使用。templates官方文档。 templates完整流程认知 第一步&#xff0c;在settings.py中注册app01子应用。 第二步&#xff0c;在app01目录下&#xff0c;新建templates和static目录&#xff0c;用于存放模板文件和资源文件。目录结构如下&#…...

Vue 中directive的钩子函数(bind、inserted 等)的作用及使用场景

大白话Vue 中directive的钩子函数&#xff08;bind、inserted 等&#xff09;的作用及使用场景。 在 Vue 里&#xff0c;指令&#xff08;directive&#xff09;是个超实用的东西&#xff0c;它能让你在不改动组件逻辑的情况下&#xff0c;给 HTML 元素添加一些特殊的行为。Vu…...

【区块链安全 | 第一篇】密码学原理

文章目录 1.哈希函数1.1 哈希函数的性质1.2 常见哈希算法1.3 Merkle Tree&#xff08;默克尔树&#xff09;1.4 HMAC&#xff08;哈希消息认证码&#xff09; 2. 公钥密码学2.1 对称加密 vs 非对称加密2.2 RSA 算法2.3 ECC&#xff08;椭圆曲线密码学&#xff09;2.4 Diffie-He…...

Linux安装MySQL数据库并使用C语言进行数据库开发

目录 一、前言 二、安装VMware运行Ubuntu 1.安装VMware 2.使用VMware打开Ubuntu 三、配置VMware使用网卡 1.添加NAT网卡 四、Linux下安装MySQL数据库 五、安装MySQL开发库 六、演示代码 sql_connect.c sql_connect.h main.c中数据库相关代码 结尾 一、前言 由于最…...

2024年MathorCup数学建模A题移动通信网络中PCI规划问题解题全过程文档加程序

2024年第十四届MathorCup高校数学建模挑战赛 A题 移动通信网络中PCI规划问题 原题再现&#xff1a; 物理小区识别码(PCI)规划是移动通信网络中下行链路层上&#xff0c;对各覆盖小区编号进行合理配置&#xff0c;以避免PCI冲突、PCI混淆以及PCI模3干扰等现象。PCI规划对于减少…...

伯努利分布和二项分布学习笔记

目录 1. 伯努利分布1.1定义1.2概率质量函数1.3数学期望与方差1.4应用示例 2. 二项分布2.1定义2.1概率质量函数2.2数学期望与方差2.3性质与图形 3. 伯努利分布与二项分布的关系4. 总结 1. 伯努利分布 伯努利分布&#xff08;Bernoulli Distribution&#xff09;&#xff0c;又称…...

Redis实战常用二、缓存的使用

一、什么是缓存 在实际开发中,系统需要"避震器"&#xff0c;防止过高的数据访问猛冲系统,导致其操作线程无法及时处理信息而瘫痪. 这在实际开发中对企业讲,对产品口碑,用户评价都是致命的。所以企业非常重视缓存技术; 缓存(Cache)&#xff1a;就是数据交换的缓冲区&…...

G口服务器和普通服务器之间的区别

今天小编主要来为大家介绍一下G口服务器和普通服务器之间的区别&#xff01; 首先&#xff0c;从硬件配置上看&#xff0c;普通服务器通常都会配备中央处理器、内存和硬盘等基本的硬件配置&#xff0c;能够适用于各种应用程序和服务&#xff1b;G口服务器除了基础的硬件配置还增…...

通过国内源在Ubuntu20.0.4安装repo

国内三大免费源&#xff1a; 清华大学&#xff1a;清华大学开源软件镜像站 | Tsinghua Open Source Mirror中国科技大学&#xff1a;USTC Open Source Software Mirror阿里云&#xff1a;阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 repo只在清华源网站里搜到&#xff1a;…...

多维动态规划 力扣hot100热门面试算法题 面试基础 核心思路 背题

多维动态规划 不同路径 https://leetcode.cn/problems/unique-paths/ 核心思路 比较简单 f[i][j] f[i - 1][j] f[i][j - 1] ; 示例代码 class Solution {public int uniquePaths(int n, int m) {int[][] f new int[n][m];for (int i 0; i < n; i)f[i][0] 1;for…...

《Java到Go的平滑转型指南》

文章目录 **文章摘要****核心主题****关键内容提炼****决策者行动清单****核心结论** **第一章&#xff1a;转型决策&#xff1a;为什么要从Java转向Go&#xff1f;****1.1 性能对比&#xff1a;GC机制与并发模型差异****GC机制对比****并发模型基准测试** **1.2 开发效率&…...

【软件测试】:软件测试实战

1. ⾃动化实施步骤 1.1 编写web测试⽤例 1.2 ⾃动化测试脚本开发 common public class AutotestUtils {public static EdgeDriver driver;// 创建驱动对象public static EdgeDriver createDriver(){// 驱动对象已经创建好了 / 没有创建if( driver null){driver new EdgeDr…...

SpringMVC 请求处理

SpringMVC 请求处理深度解析&#xff1a;从原理到企业级应用实践 一、架构演进与核心组件协同 1.1 从传统Servlet到前端控制器模式 SpringMVC采用前端控制器架构模式&#xff0c;通过DispatcherServlet统一处理请求&#xff0c;相比传统Servlet的分散处理方式&#xff0c;实…...

unittest自动化测试实战

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 为什么要学习unittest 按照测试阶段来划分&#xff0c;可以将测试分为单元测试、集成测试、系统测试和验收测试。单元测试是指对软件中的最小可测试单元在与程…...

leetcode3.无重复字符的最长字串

采用滑动窗口方法 class Solution { public:int lengthOfLongestSubstring(string s) {int ns.size();if(n0)return 0;int result0;unordered_set<char> set;set.insert(s[0]);for(int i0,j0;i<n;i){while(j1<n&&set.find(s[j1])set.end()){set.insert(s[…...

Android Compose 框架派生状态(derivedStateOf、rememberCoroutineScope)深入剖析(十五)

一、引言 在 Android 开发领域&#xff0c;高效的状态管理对于构建响应式、高性能的应用程序至关重要&#xff0c;在 Jetpack Compose 中&#xff0c;derivedStateOf 和 rememberCoroutineScope 这两个与派生状态相关的特性在状态管理方面发挥着关键作用。派生状态允许我们根据…...

3.25-2request库

request库 一、介绍request库 &#xff08;1&#xff09;requests是用python语言编写的简单易用的http库&#xff0c;用来做接口测试的库&#xff1b; &#xff08;2&#xff09;接口测试自动化库有哪些&#xff1f; requests、urllib 、urllib2、urllib3、 httplib 等&…...

《破解老龄化的智能密钥:机器人四维战略与未来养老生态》

一、引言&#xff1a;老龄化社会与智能机器人的必然性 全球老龄化趋势与老年人核心需求&#xff08;健康管理、生活辅助、心理陪伴、安全保障&#xff09; 全球正面临着严峻的老龄化挑战。根据联合国发布的数据&#xff0c;全球60岁及以上人口数量在过去几十年中持续增长&…...

Docker-Volume数据卷详讲

Docker数据卷-Volume 一&#xff1a;Volume是什么&#xff0c;用来做什么的 当删除docker容器时&#xff0c;容器内部的文件就会跟随容器所销毁&#xff0c;在生产环境中我们需要将数据持久化保存&#xff0c;就催生了将容器内部的数据保存在宿主机的需求&#xff0c;volume …...

SpringMVC 配置

一、MVC 模式简介 在软件开发的广袤天地中&#xff0c;MVC 模式宛如一座明亮的灯塔&#xff0c;指引着开发者构建高效、可维护的应用程序。Spring MVC 作为基于 Spring 框架的重要 web 开发模块&#xff0c;更是将 MVC 模式的优势发挥得淋漓尽致&#xff0c;堪称 Servlet 的强…...

Python 3.8 Requests 爬虫教程(2025最新版)

遵守网站的爬虫规则、避免爬取敏感信息、保护个人隐私&#xff01; 一、环境配置与基础验证 # 验证 Python 版本&#xff08;需 ≥3.8&#xff09; import sys print(sys.version) # 应输出类似 3.8.12 的信息# 安装 requests 库&#xff08;若未安装&#xff09; # 命令行执…...

蓝桥杯备考之 最长上升子序列问题(挖地雷)

这道题其实就是正常的最长上升子序列问题&#xff0c;但是我们还要把最优方案输出出来&#xff0c;我们可以用个pre数组来维护就行了&#xff0c;每当我们更新以i为结尾的最长子序列&#xff0c;如果i是接在1到i-1某个点后面的话就把前面的点存到pre里面 最后我们把pre倒着打印…...

华为OD机试2025A卷 - 游戏分组/王者荣耀(Java Python JS C++ C )

最新华为OD机试 真题目录:点击查看目录 华为OD面试真题精选:点击立即查看 题目描述 2020年题: 英雄联盟是一款十分火热的对战类游戏。每一场对战有10位玩家参与,分为两组,每组5人。每位玩家都有一个战斗力,代表着这位玩家的厉害程度。为了对战尽可能精彩,我们需要…...