Spring MVC 请求与响应

目录

一、Spring MVC 请求

1.1 请求映射核心注解:@RequestMapping

1.1.1 作用范围

1.1.2 属性详解

1.2 请求参数绑定机制

1.2.1 绑定规则

1.2.2 特殊场景处理

二、Spring MVC 响应

2.1 视图返回机制

2.1.1 String类型返回

2.1.2 ModelAndView对象

2.2 JSON数据响应

2.2.1 基础配置

2.2.2 对象序列化

2.2.3 集合序列化

2.3 重定向与转发

2.3.1 Spring MVC实现

2.3.2 Servlet API实现

2.4 文件上传与下载

2.4.1 上传配置  

2.4.2 控制器实现

2.4.3 文件下载

2.5 异常处理机制

2.5.1 全局异常处理器

2.5.2 注解式异常处理

2.6 AJAX交互支持

2.6.1 前端调用

2.6.2 后端配置

关键总结


        Spring MVC作为Java企业级开发的主流框架,其核心在于优雅的请求映射与响应处理机制。本文将基于实战角度,系统梳理Spring MVC的请求处理、参数绑定、响应方式及异常处理等核心知识点。

一、Spring MVC 请求

1.1 请求映射核心注解:@RequestMapping

1.1.1 作用范围

  • 级别:定义一级访问目录
  • 方法级别:定义二级访问目录

1.1.2 属性详解

属性说明示例
path/value定义请求路径@RequestMapping(path="/delete")
method指定HTTP方法@RequestMapping(method=RequestMethod.POST)
params请求参数限制@RequestMapping(params="type=admin")
@Controller
@RequestMapping(path = "/role") // 一级请求路径
public class RoleController {/*** /role/save* method="当前方法允许请求方式能访问"* params="请求路径上传参数"* @return*/@RequestMapping(path = "/save",method = {RequestMethod.GET})public String save(){System.out.println("保存角色...");return "suc";}@RequestMapping(value = "/delete")public String delete(){System.out.println("删除角色...");return "suc";}
}

1.2 请求参数绑定机制

1.2.1 绑定规则

  • 基本类型:参数名与表单name属性一致
<input type="text" name="username">
public String save(String username) { ... }
  • 实体对象:自动映射到JavaBean属性
<input type="text" name="account.balance">
public class User {private Account account; // 包含嵌套对象// getter/setter
}
  • 集合类型:使用索引访问
<input type="text" name="accounts[0].balance">
public class User {private List<Account> accounts;
}

1.2.2 特殊场景处理

// 使用@RequestParam显式映射
@RequestMapping("/search")
public String search(@RequestParam("keyword") String searchKey) { ... }// 处理可选参数
@RequestParam(value="page", required=false, defaultValue="1")

二、Spring MVC 响应

2.1 视图返回机制

        Spring MVC通过多种方式实现视图渲染,以下是常见响应方式:

2.1.1 String类型返回

  • 特点
    • 简单易用,自动转义HTML特殊字符
    • 支持JSP、Thymeleaf等模板引擎路径
  • 示例
@Controller
@RequestMapping("/user")
public class UserController {@RequestMapping("/profile")public String showProfile() {return "user/profile"; // 返回JSP页面}@RequestMapping("/data")public String returnRawHtml() {return "<h1>Hello ${username}</h1>"; // 直接返回HTML(需启用mvc:annotation-driven)}
}

2.1.2 ModelAndView对象

  • 适用场景
    • 需要显式传递模型数据
    • 混合使用字符串和对象响应
  • 示例
@RequestMapping("/search")
public ModelAndView searchUsers(String keyword) {List<User> users = userService.search(keyword);ModelAndView mv = new ModelAndView();mv.addObject("users", users);      // 模型数据mv.setViewName("user/list");      // 视图路径mv.addObject("keyword", keyword); // 附加数据return mv;
}

2.2 JSON数据响应

        现代Web应用中,JSON是前后端数据交互的主流格式。Spring MVC通过@ResponseBody注解实现自动序列化。

2.2.1 基础配置

        在pom.xml添加Jackson依赖:

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

2.2.2 对象序列化

@RequestMapping("/user/json")
public @ResponseBody User getUser() {User user = new User();user.setUsername("jack");user.setAge(25);return user;
}

        响应内容:

{"username":"jack","age":25}

2.2.3 集合序列化

@RequestMapping("/users/json")
public @ResponseBody List<User> getAllUsers() {return userService.getAll();
}

        响应内容:

[{"username":"jack","age":25},{"username":"alice","age":30}
]

2.2.4 自定义JSON格式

         使用@JsonFormat控制日期、货币等格式:

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;

2.3 重定向与转发

2.3.1 Spring MVC实现

  • 重定向:客户端发起新请求
    @RequestMapping("/old/path")
    public String redirect() {return "redirect:/new/path";
    }
  • 转发:服务器端内部跳转
    @RequestMapping("/A")
    public String forward() {return "forward:/B";
    }

2.3.2 Servlet API实现

@RequestMapping("/download")
public void downloadFile(HttpServletRequest request, HttpServletResponse response) throws IOException {// 设置下载头response.setContentType("application/octet-stream");response.setHeader("Content-Disposition", "attachment; filename=report.pdf");// 写入文件内容try (InputStream in = new FileInputStream("reports/report.pdf");OutputStream out = response.getOutputStream()) {byte[] buffer = new byte[4096];int bytesRead;while ((bytesRead = in.read(buffer)) != -1) {out.write(buffer, 0, bytesRead);}}
}

2.4 文件上传与下载

2.4.1 上传配置  

         在spring-mvc.xml中配置多部件解析器:

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><property name="maxUploadSize" value="10485760"/> <!-- 10MB -->
</bean>

2.4.2 控制器实现

@RequestMapping(value="/upload", method=RequestMethod.POST)
public @ResponseBody Map<String, String> uploadFile(@RequestParam("file") MultipartFile file) {String uploadPath = "/uploads/";File dir = new File(uploadPath);if (!dir.exists()) dir.mkdirs();try {file.transferTo(new File(uploadPath + file.getOriginalFilename()));return Collections.singletonMap("status", "success");} catch (IOException e) {return Collections.singletonMap("error", "上传失败");}
}

2.4.3 文件下载

@RequestMapping("/download/{filename}")
public void downloadFile(@PathVariable String filename, HttpServletRequest request, HttpServletResponse response) throws IOException {String realPath = request.getSession().getServletContext().getRealPath("/uploads/" + filename);File file = new File(realPath);response.setContentType("application/pdf");response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(filename, "UTF-8"));try (FileInputStream fis = new FileInputStream(file);BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream())) {byte[] buffer = new byte[1024];int len;while ((len = fis.read(buffer)) > 0) {bos.write(buffer, 0, len);}}
}

2.5 异常处理机制

2.5.1 全局异常处理器

        实现HandlerExceptionResolver接口:

public class GlobalExceptionHandler implements HandlerExceptionResolver {@Overridepublic ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) {ModelAndView mv = new ModelAndView();mv.addObject("error", e.getMessage());mv.setViewName("error.jsp");return mv;}
}

        配置:

<bean id="exceptionResolver" class="com.example.GlobalExceptionHandler"/>

2.5.2 注解式异常处理

        使用@ControllerAdvice@ExceptionHandler

@ControllerAdvice
public class ExceptionAdvice {@ExceptionHandler(UserNotFoundException.class)public ResponseEntity<String> handleUserNotFound(UserNotFoundException e) {return ResponseEntity.status(HttpStatus.NOT_FOUND).body(e.getMessage());}
}

2.6 AJAX交互支持

2.6.1 前端调用

$.ajax({url: '/api/user/123',type: 'GET',dataType: 'json',success: function(user) {console.log('用户名:', user.username);$('#userInfo').html('<p>年龄: ' + user.age + '</p>');},error: function(xhr) {alert('请求失败: ' + xhr.statusText);}
});

2.6.2 后端配置

        确保控制器方法返回JSON格式数据:

@RequestMapping("/api/user/{id}")
public @ResponseBody User getUserById(@PathVariable Long id) {return userService.findById(id);
}

关键总结

响应类型适用场景优点缺点
视图返回传统Web页面渲染支持模板引擎、SEO友好不适合API接口
JSON响应前后端分离架构轻量级、跨平台兼容性好需处理JSON序列化/反序列化
重定向页面跳转、旧版URL兼容客户端发起新请求SEO不友好
文件操作文件上传/下载直接流式处理需要复杂配置
异常处理全局错误统一管理提升系统健壮性需要额外配置处理器

        通过灵活组合这些响应机制,开发者可以构建出高效、可维护的Spring MVC应用。对于现代SPA(单页应用),推荐主要使用JSON响应配合AJAX交互;而对于传统企业级应用,则更适合视图返回+重定向的混合模式。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring-security原理与应用系列:核心过滤器

目录 运行机制 WebSecurity SecurityFilterChain SecurityFilterChains FilterChainProxy VirtualFilterChain 内部结构 类图 FilterChainProxy FilterChain VirtualFilterChain 小结 紧接上一篇文章&#xff0c;这一篇我们来看看FilterChainProxy类的运行机制及内…

Android之卡片式滑动

文章目录 前言一、效果图二、实现步骤1.主界面xml2.自定义的viewpage3.卡片接口类4.阴影和缩放变化类5.卡片adapter6.卡片adapter的xml7.style8.CardItem9.activity实现10.指示器drawable 总结 前言 对于这个需求&#xff0c;之前的项目也有做过&#xff0c;但是过于赶项目就没…

字典树与01trie

字典树简介 当我们通过字典查一个字或单词的时候&#xff0c;我们会通过前缀或关键字的来快速定位一个字的位置&#xff0c;进行快速查找。 字典树就是类似字典中索引表的一种数据结构&#xff0c;能够帮助我们快速定位一个字符串的位置。 字典树是一种存储字符串的数据结构…

基于SpringBoot的电影售票系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

R语言机器学习算法实战系列(二十二)特征选择之递归特征消除(REF)算法

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍原理步骤教程数据下载加载R包导入数据数据预处理数据分割Recursive Feature Elimination运行RFE过程选择重要特征基于重要特征构建随机森林模型混淆矩阵评估模型AUC曲线刻画模型在训…

日事清甘特图制作工具:一键生成,精准管理项目周期

在工作中&#xff0c;我们很多岗位都经常需要对项目进度进行追踪&#xff0c; 例如人事经理需要要追踪招聘进度或员工培训计划&#xff0c;项目经理负责监督项目的各个阶段以保证按计划执行&#xff0c;软件研发经理则需确保功能迭代的及时交付&#xff0c;而市场经理负责监控…

vue 加载动态效果,自行封装组件

背景&#xff1a; 在项目开发中&#xff0c;会请求接口&#xff0c;就会遇到加载中、加载成功、加载失败、和加载成功但暂无数据等情况。就自行封装了一个加载组件。采用vue3elementsetup组合式写法。 实现效果&#xff1a; 封装组件&#xff1a; //封装组件 <template>…

SQLark SQL编辑器秘籍,编写高效SQL查询

SQLark 是一款功能强大的数据库开发和管理工具&#xff0c;用于快速查询、创建和管理不同类型的数据库系统&#xff0c;支持达梦、Oracle 和 MySQL 数据库。SQLark内置的 SQL 编辑器&#xff0c;基于语法解析&#xff0c;集成智能提示、实时语法检查及语法高亮等功能&#xff0…

Flutter项目之table页面实现

目录&#xff1a; 1、首页页面index.dart&#xff08;首页table页面&#xff09; 1、首页页面 效果图&#xff1a; index.dart&#xff08;首页table页面&#xff09; import package:flutter/material.dart; import package:flutter_haoke/pages/home/info/index.dart; impo…

【学习笔记】卷积网络简介及原理探析

作者选择了由 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville 三位大佬撰写的《Deep Learning》(人工智能领域的经典教程&#xff0c;深度学习领域研究生必读教材),开始深度学习领域学习&#xff0c;深入全面的理解深度学习的理论知识。 之前的文章参考下面的链接&#xf…

【北京迅为】iTOP-RK3568开发板鸿蒙OpenHarmony系统南向驱动开发实操-HDF驱动配置UART

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

【蓝桥杯每日一题】3.25

&#x1f3dd;️专栏&#xff1a; 【蓝桥杯备篇】 &#x1f305;主页&#xff1a; f狐o狸x “OJ超时不是终点&#xff0c;是算法在提醒你该优化时间复杂度了&#xff01;” 目录 3.25 差分数组 一、一维差分 题目链接&#xff1a; 题目描述&#xff1a; 解题思路&#xff1a;…

穿透Session 0隔离

1、前言 在 Windows XP 和 Windows Server 2003 之前&#xff0c;用户和服务会共享同一个会话&#xff0c;而这个会话是由第一个登录到控制台的用户来启动的&#xff0c;该会话就称为Session 0。 而从Windows Vista 开始&#xff0c;Windows 采取了会话隔离的措施&#xff0c;…

大模型思维链COT:Chain-of-Thought Prompting Elicits Reasoningin Large Language Models

一、TL&#xff1b;DR 探索了COT&#xff08;chain-of-thought prompting&#xff09;通过一系列的中间推理步骤来显著的提升了LLM的复杂推理能力在三个大型语言模型上的实验表明&#xff0c;思维链提示能够提升模型在一系列算术、常识和符号推理任务上的表现解释了一下为什么…

颠覆传统:SaaS 品牌如何通过 SEO 策略引爆市场!

SaaS 商业模式提供了令人难以置信的可扩展性和盈利能力——但前提是与正确的营销增长策略相结合。 SaaS 品牌知道&#xff0c;托管基于云的应用程序的成本会随着用户量的增加而降低&#xff0c;因此必须专注于订阅者的快速增长&#xff0c;以保持竞争力并降低成本。 许多 CMO…

大模型训练 | 智能体知识库 资源收集之心理咨询问答数据集

最近我一直在研究AI大模型相关的内容&#xff0c;想着从现在开始慢慢收集各种各样的资源&#xff0c;万一以后需要训练大模型的时候可以用到&#xff0c;或者自己以后也许会需要。今天我想介绍一组“心理咨询问答数据集”产品&#xff0c;包含9414条心理咨询问答数据&#xff0…

vivado 创建生成时钟

创建生成时钟 生成时钟源自另一个现有时钟 &#xff08;主时钟&#xff09;。通常用来描述由逻辑块在主时钟上执行的波形变换。由于生成时钟的定义 取决于主时钟特性&#xff0c;因此必须首先定义主时钟。要明确定义生成时钟&#xff0c;必须使用 create_generated_clock 命…

数据清洗:基于python抽取jsonl文件数据字段

基于python抽取目录下所有“jsonl”格式文件。遍历文件内某个字段进行抽取并合并。 import os import json import time from tqdm import tqdm # 需要先安装&#xff1a;pip install tqdmdef process_files():# 设置目录路径dir_path r"D:\daku\关键词识别\1623-00000…

《TCP/IP网络编程》学习笔记 | Chapter 22:重叠 I/O 模型

《TCP/IP网络编程》学习笔记 | Chapter 22&#xff1a;重叠 I/O 模型 《TCP/IP网络编程》学习笔记 | Chapter 22&#xff1a;重叠 I/O 模型理解重叠 I/O 模型重叠 I/O本章讨论的重叠 I/O 的重点不在于 I/O 创建重叠 I/O 套接字执行重叠 I/O 的 WSASend 函数进行重叠 I/O 的 WSA…