SpringMVC 请求与响应处理详解

news2025/3/29 13:45:25

引言

在 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 应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2322238.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【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接…

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;用于存放模板文件和资源文件。目录结构如下&#…

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

文章目录 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规划对于减少…

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

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

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

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

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

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

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[…

3.25-2request库

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

Docker-Volume数据卷详讲

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

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

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

Redisson 实现分布式锁简单解析

目录 Redisson 实现分布式锁业务方法&#xff1a;加锁逻辑LockUtil 工具类锁余额方法&#xff1a;工具类代码枚举代码 RedisUtil 工具类tryLock 方法及重载【分布式锁具体实现】Supplier 函数式接口调用分析 Redisson 实现分布式锁 业务方法&#xff1a; 如图&#xff0c;简单…

信源的分类及数学模型

信源的分类及数学模型 按照信源发出的时间和消息分布分为离散信源和连续信源 按照信源发出符号之间的关系分为无记忆信源和有记忆信源 单符号离散信源&#xff08;一维离散信源&#xff09; 信源输出的消息数有限或可数&#xff0c;且每次只输出符号集的一个消息 样本空间&…

LVS NAT模式实现三台RS的轮询访问

节点规划: 配置RS&#xff1a; RS1-RS3的网关配置均为 192.168.163.8 配置RS1&#xff1a; [rootlocalhost ~]# hostnamectl hostname rs1 [rootlocalhost ~]# nmcli c modify ens160 ipv4.method manual ipv4.addresses 192.168.163.7/24 ipv4.gateway 192.168.163.8 conne…