Spring Web MVC入门(下)

news2024/9/22 8:04:37

1. 响应

1.1 返回静态页面

        创建前端页面,如下图所示:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Index页面</title>
</head>
<body>
    Hello,Spring MVC,我是Index⻚⾯
</body>
</html>

后端代码如下:

@RestController
@RequestMapping("/user")
public class ResponseController {
    @RequestMapping("/index")
    public String index() {
        return "/index.html";
    }

访问结果如下结果:

        我们发现,直接返回了一个字符串,那么就说明Spring MVC没有识别我们返回的是一个前端页面,那么怎么让它识别出来是 /index.html 文件,而不是字符串呢?就需要把注解@RestController改为@Controller,正确代码如下:

@Controller
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/index")
    public String index() {
        return "/index.html";
    }
}

访问127.0.0.1:8080/user/index,我们可以得到我们想要的页面,如下所示:

1.1.1  @RestController 和 @Controller

        下面来讲解一下@RestController 和 @Controller之间的关联和区别 

         之前所说的MVC模式中后端会返回视图,这是早期的概念,但随着互联网的发展,项目流行 “前后端分离” 模式,Java主要用来做后端项目,所以也就不再处理前端相关的内容了。

        如上图,MVC也随之发生改变,View不再返回视图,而是返回显示视图所需要的数据,所以前面使用的@RestController返回的就是数据。 

@RestController = @Controller + @ResponseBody

@Controller:定义了一个控制器,Spring框架启动时加载,把这个对象交给Spring管理。

@ResponseBody:定义返回数据格式为非视图,返回一个text / html信息。

源码如下:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
    @AliasFor(
        annotation = Controller.class
    )
    String value() default "";
}

         故此可知: @RestController 或 (@Controller + @ResponseBody)注解返回的是前端所需要的数据,@Controller 返回的是视图

1.2 返回数据 @ResponseBody

        @ResponseBody 表示返回数据,代码如下:

@Controller
@RequestMapping("/user")
public class UserController {
  @ResponseBody
   @RequestMapping("/index1")
   public String index1() {
       return "/index.html";
     }

}

        因为加上了@ResponseBody注解,所以index方法就会把 “/index.html” 当做一个数据返回给前端,浏览器页面如下:

@ResponseBody作用在类和方法的情况说明:

        @ResponseBody作用在类上,表示该类上的所有方法,返回的都是数据。

        @ResponseBody作用在方法上,表面该方法返回的是数据。

1、也就是说明在类上添加注解@ResponseBody,相当于该类上所有的方法都添加了注解@ResponseBody。

2、因为@RestController = @Controller + @ResponseBody,所以如果类上添加了注解@RestController,相当于该类的所有方法都添加了注解@RestController。

3、如果一个类里面,既要返回数据,又要返回视图,那么就使用注解@Controller添加在该类上,然后需要返回数据的方法添加注解@ResponseBody,返回视图的方法就不同管它。

         一个方法是返回视图,一个方法是返回数据,代码如下:

@Controller
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/index")
    public String index() {
        return "/index.html";
    }

    @ResponseBody
    @RequestMapping("returnData")
    public String returnData() {
        return "该方法返回数据";
    }

}

        浏览器分别访问http:127.0.0.1:8080/user/index 和http:127.0.0.1:8080/user/returnData,页面分别如下: 

         如果returnData方法删去注解@ResponseBody,代码如下:

 @RequestMapping("returnData")
    public String returnData() {
        return "该方法返回数据";
    }

        访问结果如下:

         404错误码,因为该类是注解@Controller修饰的,访问该类的方法默认返回的是视图,程序就会认为需要返回视图(returnData方法没加@ResponseBody注解),然后根据内容进行查找文件,但查询不到,也就是路径不存在,所以报错404。         

1.3 返回HTML代码片段

        后端返回数据时,如果数据有HTML代码,也会被浏览器解析,代码如下:

 @ResponseBody
    @RequestMapping("/reml")
    public String returnHtml() {
        return "<h1> Hello, HTML</h1>";
    }

        访问结果如下:

         通过fiddler观察Content-Type,如图:

响应中的Content-Type常见的取值:
1、text / html:body数据格式是 HTML。

2、text / css:body数据格式是 CSS。

3、application / Javascript:body数据格式是 JavaScript。

4、application / json:body数据格式是 JSON。

如果请求的是js文件,Spring MVC会自动设置Content-Type为 application / Javascript。

如果请求是css文件,Spring MVC会自动设置Content-Type为 text / css。

ps:本次的内容就到这里了,如果对你有所帮助的话,就请一键三连哦!!!

本文的封面来自:bilibili苏杉杉的pv,侵权删 url:https://www.bilibili.com/video/BV1vo4y167eh/?spm_id_from=333.999.0.0&vd_source=866da5be2ef0ddd213b053523da53138
————————————————

电子签名:上嘉路

 

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

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

相关文章

利用栈去实现队列

利用栈实现队列 今天我们利用两个栈去实现队列&#xff08;因为是用c去实现队列没有c中的库函数所以我们要先手搓一个栈再去使用&#xff09; 没有实现的去看我的这篇文章&#xff1a;利用顺序表对栈的实现-CSDN博客 回顾一下特性&#xff1a;栈----先进后出、后进先出&…

我常用的几个傻瓜式爬虫工具,收藏!

爬虫类工具主要两种&#xff0c;一种是编程语言第三方库&#xff0c;比如Python的scrapy、selenium等&#xff0c;需要有一定的代码基础&#xff0c;一种是图形化的web或桌面应用&#xff0c;比如Web Scraper、后羿采集器、八爪鱼采集器、WebHarvy等&#xff0c;接近于傻瓜式操…

汇量科技Mintegral发布全新产品矩阵:助力广告主高效增长与变现

近期&#xff0c;汇量科技旗下程序化互动式广告平台Mintegral正式推出全新产品命名&#xff0c;期望通过简洁明确的产品名称&#xff0c;更好地传达Mintegral的品牌理念&#xff0c;使客户与平台的每一次接触都更加直接高效。 Mintegral AppGrowth(原Mintegral Self-Service Pl…

【idea】 已经commit还没push怎么修改commit信息?

前言&#xff1a; 有时候填写commit信息时手快确认了&#xff0c;要push时发现信息有误&#xff0c;此时想重新更改信息。 此方法适用于在idea里commit了的&#xff0c;且还未push。 &#xff08;u1s1&#xff0c;用idea来推送真的又快又方便&#xff0c;自此之后再也没碰过小乌…

Leetcode面试经典150题-112.路径总和

解法都在代码里&#xff0c;不懂就留言或者私信 超级简单的题&#xff0c;不过有隐形的坑 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.v…

算法定制与双光谱技术融合:提升巡检车入侵检测系统效能

一、应用背景 在当今数字化和信息化时代&#xff0c;算法已经成为企业提高效率、优化决策的重要工具。随着大数据、人工智能技术的迅速发展&#xff0c;客户对算法的需求呈现出爆发式增长。这种需求不仅体现在数量上&#xff0c;更体现在质量上&#xff0c;尤其是对算法定制化…

Dav_笔记13:SQL Access Advisor 之 1 Summary

SQL Access Advisor概述 SAA Summary 在调整数据库以实现复杂的数据密集型查询的最佳性能时&#xff0c;物化视图&#xff0c;分区和索引是必不可少的。 SQL Access Advisor通过为给定工作负载推荐适当的物化视图集&#xff0c;物化视图日志&#xff0c;分区和索引&#xff0c;…

macOS Sequoia 15 beta 5 (24A5309e) Boot ISO 原版可引导镜像下载

macOS Sequoia 15 beta 5 (24A5309e) Boot ISO 原版可引导镜像下载 iPhone 镜像、Safari 浏览器重大更新、备受瞩目的游戏和 Apple Intelligence 等众多全新功能令 Mac 使用体验再升级 请访问原文链接&#xff1a;https://sysin.org/blog/macOS-Sequoia-boot-iso/&#xff0c…

基于JAVA的外来人口管理系统设计与实现,源码、部署+讲解

摘 要 在新型冠状病毒性肺炎流行的背景下&#xff0c;我国数亿流动人口应该受到高度关注和保护。并让这一易感染人群离开成为“受害者传染源”的双重风险&#xff0c;的确是一项关键而富有挑战性的任务。因此&#xff0c;本毕业设计是以规模复杂的外来人口及居民群体为典例&am…

UI-无限循环列表

无限循环列表 创建 在任意节点上&#xff0c;添加Scroller&#xff0c;ScrollView组件&#xff0c;和RectMask2D组件&#xff1a; 其中列表的大小&#xff0c;依赖Rect的大小。 界面参数介绍 ViewPort&#xff1a;视口大小 SrollDirction:滚动方向 MovementType&#xff1a…

go语言后端开发学习(五)——如何在项目中使用Viper来配置环境

前言 在之前的文章中我们就介绍过用go-ini来读取配置文件,但是当时我们在介绍时说了他只能读取.ini格式的配置文件所以局限性较大,这里我们介绍一个适用范围更大的配置管理第三方库——Viper。 什么是Viper Viper是适用于Go应用程序&#xff08;包括Twelve-Factor App&#…

算法-差分, 二维前缀和, 离散化

文章目录 本节提要1. 一维差分1.1 一维差分原理分析1.2 一维差分例题应用 2. 等差数列差分2.1 等差数列差分原理分析 3. 二维前缀和3.1 二维前缀和原理分析3.2 二维前缀和例题应用 本节提要 本节的主要目标是一维差分的总结, 包括一维差分, 一维等差数列差分; 二维差分和二维前…

唐诡探案外传-MySQL误操作之“寻凶”

序幕&#xff1a;字符集被修改之谜 立秋后的第一天下午&#xff0c;太阳仍不知疲倦地炙烤着大地&#xff0c;办公室内的中央空调不停歇地鼓吹着冷风。某办公楼内&#xff0c;IT部门的阿祖被同事急匆匆地找来&#xff0c;说是系统出现了奇怪的bug&#xff0c;追查之下发现测试环…

搭建高可用OpenStack(Queen版)集群(十二)之启动一个实例

一、搭建高可用OpenStack&#xff08;Queen版&#xff09;集群之启动一个实例 创建实例之前&#xff0c;首先要创建虚拟网络 一、创建网络 建议命令行和web管理协同进行配置&#xff0c;这样不容易出错 在控制节点执行 1、创建公有网络部分 1、在命令行执行 . admin-openrc ne…

【SQL】平均售价

目录 题目 分析 代码 题目 表&#xff1a;Prices ------------------------ | Column Name | Type | ------------------------ | product_id | int | | start_date | date | | end_date | date | | price | int | ---------------…

技术研究:Redis 数据结构与 I/O 模型

数据结构 Redis之所以“快”&#xff0c;一方面因为它是内存数据库&#xff0c;所有操作都在内存上完成&#xff0c;内存的访问速度本来就快。另一方面则是因为高效的数据结构&#xff0c;使得操作键值效率较高。总体来说&#xff0c;Redis使用了一个用来保存每个Key/Value的全…

【Story】如何高效记录并整理编程学习笔记?

目录 一、为何笔记在编程学习中如此重要&#xff1f;1.1 知识的捕捉1.2 理解和消化1.3 知识的复习1.4 知识的分享 二、建立高效的笔记系统2.1 确定笔记的目标2.2 选择合适的工具2.3 笔记的结构化2.4 记录有效的内容2.5 定期回顾和更新 三、保持笔记条理性的技巧3.1 使用一致的格…

【数据结构】堆排序与TOP-K问题

&#x1f308;个人主页&#xff1a;Yui_ &#x1f308;Linux专栏&#xff1a;Linux &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;数据结构专栏&#xff1a;数据结构 文章目录 1.堆排序1.1 建堆1.2 利用堆删除思想来进行排序1.3 堆排序的时间复杂度 2.TOP-K问…

Uniapp之微信小程序计算器

UI仿的iOS手机计算器&#xff0c;基本功能已经实现&#xff0c;如下效果图 具体使用可以参考微信小程序&#xff1a;日常记一记--我的---计算器 第一步&#xff1a;UI界面设计 1&#xff0c;strClass模块是计算过程代码展示 2&#xff0c;result-view模块是结果展示 3&#xff…

嵌入式学习---DAY24:进程--二

一、exec函数族----启动一个新程序 用fork创建子进程后执行的是和父进程相同的程序&#xff08;但有可能执行不同的代码分支&#xff09;&#xff0c; 子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时&#xff0c;该进程的 用户空间代码和数据完全被…