【Spring 篇】SpringMVC的数据响应:编织美妙的返回乐章

news2024/12/23 0:46:19

在这里插入图片描述

在Web开发的舞台上,数据响应就如同一场美妙的音乐演奏,而SpringMVC作为这场音乐的指挥者,如何优雅地将数据传递给前端,引发了无尽的思考和探索。本篇博客将带你走进SpringMVC的数据响应世界,解开其中的奥秘,感受这场编织美妙的返回乐章。

起舞的ModelAndView

在SpringMVC中,ModelAndView是一个神奇的对象,它承载着控制器方法的返回值,将模型数据和视图信息一同传递给前端。让我们通过一个简单的例子来感受一下ModelAndView的魅力。

@Controller
@RequestMapping("/music")
public class MusicController {

    @GetMapping("/play")
    public ModelAndView playMusic() {
        ModelAndView modelAndView = new ModelAndView("music-player");
        modelAndView.addObject("song", "Spring Symphony");
        return modelAndView;
    }
}

在这个例子中,playMusic方法返回一个ModelAndView对象,其中指定了视图名为"music-player",并通过addObject方法将音乐的信息传递给前端。接下来,我们需要在/WEB-INF/views目录下创建一个名为music-player.jsp的JSP页面,用于展示音乐信息。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Music Player</title>
</head>
<body>
    <h1>Now Playing: ${song}</h1>
</body>
</html>

在这个JSP页面中,${song}将会被替换为控制器传递过来的音乐信息。当用户访问/music/play时,将看到页面上显示着"Now Playing: Spring Symphony"的欢迎消息。

Model:数据的魔法师

在SpringMVC的数据传递中,Model起到了一个重要的角色,它是一个接口,代表了模型数据的容器。控制器方法的参数中使用Model,就可以向前端传递数据。

@Controller
@RequestMapping("/magician")
public class MagicianController {

    @GetMapping("/castSpell")
    public String castSpell(Model model) {
        model.addAttribute("magicWord", "Abracadabra!");
        return "magic-show";
    }
}

在这个例子中,castSpell方法的参数中使用了Model,通过addAttribute方法将"magicWord"属性和对应的值传递给前端。在/WEB-INF/views目录下创建一个名为magic-show.jsp的JSP页面,用于展示魔法词语。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Magic Show</title>
</head>
<body>
    <h1>Behold the magic: ${magicWord}</h1>
</body>
</html>

当用户访问/magician/castSpell时,页面将显示"Behold the magic: Abracadabra!"。

响应JSON:数据的轻盈旋律

除了传递HTML页面,SpringMVC还能轻松应对前后端分离的场景,以JSON的形式返回数据。JSON,即JavaScript Object Notation,是一种轻量级的数据交换格式,易于阅读和编写,也易于机器解析和生成。

@RestController
@RequestMapping("/api")
public class ApiController {

    @GetMapping("/getSong")
    public Map<String, String> getSong() {
        Map<String, String> songMap = new HashMap<>();
        songMap.put("songName", "Spring Serenade");
        return songMap;
    }
}

在这个例子中,ApiController使用了@RestController注解,表示这是一个RESTful风格的控制器,专门用于返回数据。getSong方法返回一个Map,其中包含了歌曲的信息。当用户访问/api/getSong时,将得到一个JSON格式的响应:

{
  "songName": "Spring Serenade"
}

响应状态码:音符的情感色彩

有时候,我们不仅需要返回数据,还需要传达一些特定的情感或状态信息。在HTTP协议中,状态码是一种常用的传递方式,SpringMVC也提供了简便的方式来设置响应状态码。

@RestController
@RequestMapping("/emotion")
public class EmotionController {

    @GetMapping("/express")
    public ResponseEntity<String> expressEmotion() {
        HttpHeaders headers = new HttpHeaders();
        headers.add("Express-Color", "Spring Green");
        return new ResponseEntity<>("Expressing happiness!", headers, HttpStatus.OK);
    }
}

在这个例子中,EmotionController返回了一个ResponseEntity对象,其中包含了响应的主体内容、头信息和状态码。用户访问/emotion/express时,将得到一个带有自定义头信息的HTTP 200 OK响应,响应内容为"Expressing happiness!"。

异常处理:和弦的优雅回响

在音乐的世界里,有时会出现一些不可避免的小插曲,而在编写Web应用程序时,处理异常也是不可或缺的一环。SpringMVC通过@ExceptionHandler注解提供了简单而强大的异常处理机制。

@Controller
@RequestMapping("/orchestra")
public class OrchestraController {

    @GetMapping("/playConcert")
    public String playConcert() {
        // 模拟异常
        throw new ConcertFailedException("Concert failed due to technical issues.");
    }

    @ExceptionHandler(ConcertFailedException.class)
    public ModelAndView handleConcertFailedException(ConcertFailedException ex) {
        ModelAndView modelAndView = new ModelAndView("concert-failed");
        modelAndView.addObject("errorMessage", ex.getMessage());
        return modelAndView;
    }
}

在这个例子中,playConcert方法模拟了一个音乐会中的异常,抛出了一个ConcertFailedException。而在同一个控制器中,通过@ExceptionHandler注解的handleConcertFailedException方法,对特定的异常进行处理。创建一个名为concert-failed.jsp的JSP页面,用于展示音乐会失败的信息。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Concert Failed</title>
</head>
<body>
    <h1>Oh no! The concert failed.</h1>
    <p>Error Message: ${errorMessage}</p>
</body>
</html>

当用户访问/orchestra/playConcert时,将得到一个页面,显示"Oh no! The concert failed.",并展示详细的错误信息。

静态资源:背景音乐的魔法

在Web应用中,除了动态生成的数据,还有一些静态资源,比如图片、样式表和JavaScript文件等。SpringMVC通过ResourceHandlerRegistry提供了方便的静态资源处理。

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/music-bg.mp3")
                .addResourceLocations("classpath:/static/music/")
                .setCachePeriod(3600)
                .resourceChain(true)
                .addResolver(new GzipResourceResolver())
                .addResolver(new PathResourceResolver());
    }
}

在这个例子中,通过addResourceHandlers方法配置了静态资源的处理,当用户访问/music-bg.mp3时,将从classpath中的/static/music/目录下寻找对应的音乐文件。这样,我们就能够在Web应用中添加一些背景音乐了。

跨域请求处理:音乐的跨界演奏

在现代Web开发中,跨域请求已成为常态。SpringMVC通过@CrossOrigin注解提供了简单的跨域请求处理方式。

@RestController
@RequestMapping("/cross-domain")
public class CrossDomainController {

    @GetMapping("/playMusic")
    @CrossOrigin(origins = "http://allowed-domain.com")
    public Map<String, String> playMusic() {
        Map<String, String> songMap = new HashMap<>();
        songMap.put("songName", "Cross-domain Symphony");
        return songMap;
    }
}

在这个例子中,通过@CrossOrigin注解,设置了允许访问的域名为"http://allowed-domain.com"。当该控制器方法被访问时,只有来自该域名的请求将被允许。

结语

SpringMVC的数据响应,就如同一场千变万化的音乐会,通过ModelAndViewModel、JSON、响应状态码、异常处理、静态资源处理、跨域请求处理等组件,为开发者提供了丰富而灵活的数据传递方式。在这个美妙的乐章中,每个组件都有其独特的声音,共同奏响了Web开发的交响曲。愿你在编写代码的过程中,能够更好地驾驭这些乐谱,创造出属于自己的音乐之美。在代码的海洋里,与数据的旋律共舞,愉悦前行。

作者信息

作者 : 繁依Fanyi
CSDN: https://techfanyi.blog.csdn.net
掘金:https://juejin.cn/user/4154386571867191

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

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

相关文章

class_5:在c++中一个类包含另一个类的对象叫做组合

#include <iostream> using namespace std;class Wheel{ public://成员数据string brand; //品牌int year; //年限//真正的成员函数void printWheelInfo(); //声明成员函数 };void Wheel::printWheelInfo() {cout<<"我的轮胎品牌是&#xff1a;"<…

JDBC PrepareStatement 的使用(附各种场景 demo)

在 Java 中&#xff0c;与关系型数据库进行交互是非常常见的任务之一。JDBC&#xff08;Java Database Connectivity&#xff09;是 Java 平台的一个标准 API&#xff0c;用于连接和操作各种关系型数据库。其中&#xff0c;PreparedStatement 是 JDBC 中的一个重要接口&#xf…

数据库多表查询练习题

二、多表查询 1. 创建 student 和 score 表 CREATE TABLE student ( id INT ( 10 ) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR ( 20 ) NOT NULL , sex VARCHAR ( 4 ) , birth YEAR , department VARCHAR ( 20 ) , address VARCHAR ( 50 ) ); 创建 s…

pytest pytest-cov生成代码覆盖率报告

pytest-cov 是一个用于 pytest 的插件&#xff0c;它可以生成代码覆盖率报告。代码覆盖率是一个度量&#xff0c;表示在测试过程中执行了代码的哪些部分。这是一个非常有用的工具&#xff0c;因为它可以帮助你理解你的测试是否全面&#xff0c;是否有遗漏的代码部分。 pytest-c…

电商物流查询:未来的发展方向

在电商日益繁荣的时代&#xff0c;物流信息查询不仅关乎消费者体验&#xff0c;更影响着电商运营的效率。快速、准确地追踪物流信息至关重要。本文将简述物流信息快速追踪的价值&#xff0c;并重点介绍固乔快递查询助手这一高效查询工具及其批量查询功能。 一、物流信息快速追踪…

RAG常见七大坑

论文题目&#xff1a;《Seven Failure Points When Engineering a Retrieval Augmented Generation System》 论文地址&#xff1a;https://arxiv.org/pdf/2401.05856.pdf 这篇论文主要探讨了构建检索增强生成系统&#xff08;Retrieval Augmented Generation, RAG&#xff09;…

Javaweb之SpringBootWeb案例员工管理分页查询的详细解析

3. 员工管理 完成了部门管理的功能开发之后&#xff0c;我们进入到下一环节员工管理功能的开发。 基于以上原型&#xff0c;我们可以把员工管理功能分为&#xff1a; 分页查询&#xff08;今天完成&#xff09; 带条件的分页查询&#xff08;今天完成&#xff09; 删除员工&…

【Leetcode 2707】字符串中的额外字符 —— 动态规划

2707. 字符串中的额外字符 给你一个下标从0开始的字符串s和一个单词字典dictionary。你需要将s分割成若干个互不重叠的子字符串&#xff0c;每个子字符串都在dictionary中出现过。s中可能会有一些额外的字符不在任何子字符串中。 请你采取最优策略分割s&#xff0c;使剩下的字…

HiDataPlus 3.3.2-005 搭建(个人的一点心得体会 x86 平台)

HDP 集群搭建 前置安装 yum -y install createrepo yum install -y lrzsz yum install -y wget yum install -y vim修改当前集群机器的主机名 hostnamectl set-hostname XXX​ 这里的 XXX 就是要设置的当前机器的主机名称。主机名称是集群唯一的&#xff0c;一定不要重复&am…

【栈】Leetcode 496 下一个更大元素I

【栈】Leetcode 496 下一个更大元素I 解法1 两个单调栈解法2 ---------------&#x1f388;&#x1f388;题目链接&#x1f388;&#x1f388;------------------- 解法1 两个单调栈 两个栈进行操作&#xff0c;一个栈用来遍历寻找&#xff0c;一个栈用来保留 将nums2中的元素…

c语言-数据类型(上)

目录 一、数据类型 二、常量与变量 常量&#xff1a; 变量&#xff1a; 三、进制&#xff08;八&#xff0c;十&#xff0c;十六&#xff09; 十进制&#xff1a; 八进制&#xff1a; 十六进制&#xff1a; 四、基本类型 1.整型常量&#xff1a; 2.整型变量&#xff…

Unet系列网络解析

Unet UNet最早发表在2015的MICCAI上&#xff0c;到2020年中旬的引用量已经超过了9700多次&#xff0c;估计现在都过万了&#xff0c;从这方面看足以见得其影响力。当然&#xff0c;UNet这个基本的网络结构有太多的改进型&#xff0c;应用范围已经远远超出了医学图像的范畴。我…

vector容器解决杨辉三角

一、题目描述 118. 杨辉三角 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2: 输入: numRo…

Arduino开发实例-手指心率传感器模块

手指心率传感器模块 文章目录 手指心率传感器模块1、手指心率传感器介绍2、硬件准备及接线3、代码实现1、手指心率传感器介绍 本次使用的心率传感器模块是为教育和娱乐目的而设计的,通过手指检测心血管脉搏波。 它使用 PPG (HRM-2511E) 探头进行数据传输。 该传感器使用红外线…

深度学习代码学习(一文真正看懂卷积层的代码定义)

一维卷积: 将n行3列升维到n行6列。&#xff08;原因&#xff1a;卷积核为6个&#xff09; *表示点乘 Linear线性层&#xff1a; &#xff08;通过矩阵计算改变输入输出特征向量的维度&#xff09; Pytorch nn.Linear的基本用法与原理详解-CSDN博客 pytorch初学笔记&#…

玩转硬件之Micro:bit的玩法(六)——扫地机器人

众所周知&#xff0c;扫地机器人&#xff0c;又称自动打扫机、智能吸尘、机器人吸尘器等&#xff0c;是智能家电的一种&#xff0c;能凭借人工智能&#xff0c;自动在房间内完成地板清理工作。一般采用刷扫和真空方式&#xff0c;将地面杂物先吸纳进入自身的垃圾收纳盒&#xf…

【DDR】基于Verilog的DDR控制器的简单实现(三)——读操作

上一节 【DDR】基于Verilog的DDR控制器的简单实现&#xff08;二&#xff09;——写操作 本文继续以美光(Micron&#xff09;公司生产的DDR3芯片MT41J512M8RH-093&#xff08;芯片手册&#xff09;为例&#xff0c;说明DDR芯片的读操作过程。下图为读操作指令格式&#xff08;…

Linux驱动(五)设备树

1、前言 设备树是一种描述硬件平台和设备的数据结构&#xff0c;它以一种结构化的方式描述了系统中的各种设备和资源&#xff0c;包括处理器、内存、外设和总线等。设备树通常用于嵌入式系统和嵌入式 Linux 系统中&#xff0c;它可以帮助操作系统内核在启动时自动识别硬件&…

记录一次git merge后发现有些文件不对的问题,排查过程

分支进行merge&#xff08;A merge到B&#xff09;之后&#xff0c;发现string.xml中有些字段的值没有merge过来&#xff0c;一开始还以为自己是自己merge错误&#xff0c;检查了一遍自己的merge操作没有问题。 那为啥没有merge过来呢&#xff1f;有一种可能是&#xff0c;merg…

软件测试|Python数据可视化神器——pyecharts教程(十三)

使用pyecharts绘制水球图 水球图是一种有趣而视觉吸引力的数据可视化方式&#xff0c;它可以用来展示进度或百分比等信息。这方面水球图和仪表图是类似的&#xff0c;但是水球图比仪表图更为炫酷一些。像一些资源占用率等指标都是使用水球图来展示的&#xff0c;作为绘图神器&…