Spring Web MVC入门(3)——响应

目录

一、返回静态页面

@RestController 和 @Controller之间的关联和区别

二、返回数据@ResponseBody

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

三、返回HTML代码片段

响应中的Content-Type常见的取值:

四、返回JSON

五、设置状态码

六、设置Header

1、设置Content-Type

2、设置其他Header


一、返回静态页面

        创建前端页面,要创建路径的路径如下:

        

        前端代码:

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

        后端代码:

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

        浏览器访问:http:127.0.0.1:8080/res/index ,页面如下:

        

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

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

        浏览器再访问一次:http:127.0.0.1:8080/res/index ,页面如下:

        

        就是我们想要的页面了。

@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 返回的是视图


二、返回数据@ResponseBody

        上面说到,@ResponseBody 表示返回数据,代码如下:

@Controller
@RequestMapping("/res")
public class ResponseController {
    @ResponseBody
    @RequestMapping("/index")
    public String index() {
        return "/index.html";
    }
}

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

        

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

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

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

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

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

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

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

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

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

        多个注解修饰 类 / 方法,没有先后顺序,谁先谁后都行,

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

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

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

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

        在访问一下:http:127.0.0.1:8080/res/returnData ,页面如下:

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


三、返回HTML代码片段

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

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

        浏览器访问:http:127.0.0.1:8080/res/returnHtml ,页面如下:

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

响应中的Content-Type常见的取值:

1、text / htmlbody数据格式是 HTML

2、text / cssbody数据格式是 CSS

3、application / Javascriptbody数据格式是 JavaScript

4、application / jsonbody数据格式是 JSON

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

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


四、返回JSON

        Spring MVC也可以返回JSON,后端方法返回结果为对象(下面使用Hash对象),代码如下:

    @ResponseBody
    @RequestMapping("/returnJson")
    public HashMap<String, String> returnJson() {
        HashMap<String, String> map = new HashMap<>();
        map.put("key1", "value1");
        map.put("key2", "value2");
        map.put("key3", "value3");
        return map;
    }

        浏览器访问:http:127.0.0.1:8080/res/returnJson ,页面如下:

        

        使用fiddler抓包观察:


五、设置状态码

        Spring MVC会根据我们方法的返回结果自动设置响应状态码,程序员也可以手动指定状态码,通过Spring MVC的内置对象HttpServletResponse提供的方法来进行设置

        代码如下:

    @ResponseBody
    @RequestMapping("/setStatus")
    public String setStatus(HttpServletResponse response) {
        response.setStatus(418);
        return "设置状态码成功";
    }

        浏览器访问:http:127.0.0.1:8080/res/setStatus ,页面如下:

        

        可以看到,状态码并不影响页面的展示

        通过fiddler抓包看看,如图:


六、设置Header

        Http响应报头也会向客户端传递一些附加信息,比如服务程序的名称,请求的资源已移动到新地址等,如:Content-Type、Local等。

        这些信息通过@RequestMapping注解的属性来实现,如下是@RequestMapping的源码

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
@Reflective({ControllerMappingReflectiveProcessor.class})
public @interface RequestMapping {
    String name() default "";

    @AliasFor("path")
    String[] value() default {};

    @AliasFor("value")
    String[] path() default {};

    RequestMethod[] method() default {};

    String[] params() default {};

    String[] headers() default {};

    String[] consumes() default {};

    String[] produces() default {};
}

(1)value指定映射的URL

(2)method指定请求的method类型,如GET,POST等

(3)consumes指定处理请求(request)的提交内容类型(Content-Type),例如application/json,text/html等

(4)produces指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回

(5)Params指定request中必须包含某些参数时,才让该方法处理

(6)headers指定request中必须包含某些指定的header值,才让该方法处理请求

        了解即可,更多说明参考:Mapping Requests :: Spring Framework

1、设置Content-Type

        通过设置produces属性的值,可以设置响应的报头Content-Type,代码如下:

    @ResponseBody
    @RequestMapping(value = "/setContentType", produces = "application/json")
    public String returnJson2() {
        return "{\"ok\":1}";
    }

        浏览器访问:http:127.0.0.1:8080/res/setContentType ,页面如下:

        

        通过Postman测试,页面如下:

        

        可以看到Postman识别出来了响应的报头Content-Type是JSON。

        通过fiddler抓包观察:

        也是JSON格式,如果不进行设置produces,方法返回结果为String时,Spring MVC默认返回的text/html。

        设置返回类型时,也可以同步设置响应编码,代码如下:

  @ResponseBody
    @RequestMapping(value = "/setContentType", produces = "application/json;charset=utf-8")
    public String returnJson2() {
        return "{\"ok\":1}";
    }

        fiddler抓包结果:

2、设置其他Header

        设置其他Header的话,需要使用 Spring MVC的内置对象HttpServletResponse提供的方法来进行设置。代码如下:

    @ResponseBody
    @RequestMapping("/setHeader")
    public String setHeader(HttpServletResponse response) {
        response.setHeader("MyHeader", "MyHeaderValue");
        return "设置成功";
    }

void setHeader(String name, String value) 设置一个带有给定的名称和值的header。如果name已经存在,则覆盖旧的值

        浏览器访问:http:127.0.0.1:8080/res/setHeader ,页面如下:

        

        通过Postman抓包,如图:

        确实设置成功了。


都看到这了,点个赞再走吧,谢谢谢谢谢

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024李卜常识开天斧

2024年&#xff0c;李卜常识开天斧课程以其独特的魅力吸引了众多学子。这门课程如同开天辟地的神斧&#xff0c;帮助我们打开常识知识的大门&#xff0c;引领我们走进一个全新的学习世界。在李卜老师的悉心指导下&#xff0c;我们逐渐掌握了各种常识知识&#xff0c;拓宽了视野…

leaftjs+turfjs+idw纯前端实现等值面绘图+九段线

最近有个绘制等值面图的需求。我们一般的实现路径是&#xff1a; 1.后台绘图&#xff0c;用surfer绘制好&#xff0c;给前端调用叠加到地图。 2.后台用python绘图&#xff0c;绘制好给前端调用&#xff0c;叠加到地图。 3.后台进行插值计算、地图裁剪、最终生成geojson文件或…

VS2019配合QT5.9开发IRayAT430相机SDK

环境配置 VS2019 QT5.9 编译器版本 MSVC2017_64添加系统环境变量&#xff08;完毕后重启电脑&#xff09; 从VS2019中下载Qt插件 从VS2019中添加单个编译组件 上述操作完成后用VS打开工程文件&#xff0c;工程文件地址 &#xff1a; C:\Users\86173\Desktop\IRCNETSDK_W…

初识 Linux

一、基础命令 0、 ls cd cat pwd 当前工作目录 find -name 测试.py 查找文件 grep "学院" 测试.py 查找字符串 "学院" 在文件 测试.py 中位置&#xff0c;输出所在的 行 1、重定向器 echo "Hello Kali Linux!" > Hello 创建 文件 Hel…

openssl3.2 - exp - 使用默认的函数宏,在release版中也会引入__FILE__

文章目录 openssl3.2 - exp - 使用默认的函数宏&#xff0c;在release版中也会引入__FILE__概述笔记验证是否__FILE__在release版下也能用&#xff1f;将openssl编译成release版的&#xff0c;看看CRYPTO_free()是否只需要一个参数就行&#xff1f;将工程中的openssl相关的库换…

stream中的foreach,allMatch,noneMatch,anyMatch的基本使用

1.1foreach遍历集合元素 1.2anyMatch()的使用 结论:上边使用foreach循环遍历和使用anyMatch()的作用相同 2.allMatch() 2.1初级使用 2.2进级使用 3.noneMatch()使用

Python 实现视频去抖动技术

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 视频去抖动是视频处理中的一项重要技术&#xff0c;它可以有效地减少视频中由于相机震动或手…

华为matebook 14安装ubuntu双系统

一、准备u盘 首先格式化u盘(选择FAT32) 二、确认电脑类型 键盘按下win+r(win:开始键/也就是Windows的标志那个键),在输入框内输入msinfo32后,回车确认 确定自己电脑 硬盘 的类型: 在显示屏下方的搜索框内搜索“计算机管理” 点击进入后,再点击左边列表内的“磁…

拉普拉斯IPO:荣获国家级专精特新和国家级制造业单项冠军殊荣

近期&#xff0c;拉普拉斯荣获国家级专精特新和国家级制造业单项冠军的殊荣&#xff0c;这无疑是对其在技术和发展方面的肯定。这些荣誉证明了拉普拉斯在光伏行业的卓越表现和持续创新&#xff0c;以及其在国内制造业中的领先地位&#xff0c;进一步彰显了拉普拉斯在技术研发和…

智慧浪潮下的产业园区:洞察智慧化转型如何打造高效、绿色、安全的新园区

目录 一、引言 二、智慧化转型的内涵与价值 三、打造高效园区的智慧化策略 1、建设智能化基础设施 2、推广智能化应用 3、构建智慧化服务平台 四、实现绿色园区的智慧化途径 1、推动绿色能源应用 2、实施绿色建筑设计 3、加强环境监测与治理 五、保障园区安全的智慧…

【办公类-22-14】周计划系列(5-6)“周计划-06 19周的周计划教案合并打印PDF(最终打印版))

背景需求&#xff1a; 花了十周&#xff0c;终于把周计划教案的文字都写满、加粗、节日替换了。为了便于打印&#xff0c;我把19周的周计划教案全部合并在一起PDF。制作打印用PDF 思路 1、周计划是单独打印一张&#xff0c;因此要在第2页插入空白页&#xff0c; 2、教案有3页…

[计算机效率] 截图工具:FastStone Capture

3.19 截图工具&#xff1a;FastStone Capture FastStone Capture是一款功能强大的屏幕捕捉软件&#xff0c;体积小巧、功能强大&#xff0c;不但具有常规截图等功能&#xff0c;更有从扫描器获取图像&#xff0c;和将图像转换为PDF文档等功能。 截屏功能&#xff1a;支持全屏截…

【Python数据库】MongoDB

文章目录 [toc]数据插入数据查询数据更新数据删除 个人主页&#xff1a;丷从心 系列专栏&#xff1a;Python数据库 学习指南&#xff1a;Python学习指南 数据插入 from pymongo import MongoClientdef insert_data():mongo_client MongoClient(hostlocalhost, port27017)co…

Git变更账户、查看账户

1、变更账户 &#xff08;1&#xff09;修改当前文件夹用户 git config user.name “新用户名” git config user.email “新邮箱” &#xff08;2&#xff09;修改全局git用户 git config - -global user.name “新用户名” git config - -global user.email “新邮箱”…

计算机网络——初识网络

一、局域网与广域网 1.局域网&#xff08;LAN&#xff09; 局域网&#xff1a;即Local Area Network&#xff0c;简称LAN。Local即标识了局域⽹是本地&#xff0c;局部组建的⼀种私有⽹络。局域⽹内的主机之间能⽅便的进⾏⽹络通信&#xff0c;⼜称为内⽹&#xff1b;局域⽹和…

【c++】----STL简介string

目录 1. 什么是STL 2. STL的版本 3. STL的六大组件 4.STL的缺陷 5.string类 1. 为什么学习string类&#xff1f; 6.string类的常用接口说明&#xff08;下面我们只讲解最常用的接口&#xff09; 1.string 常见构造 2.string类的遍历 iterator 迭代器遍历 &#xff08;…

前端开发攻略---模拟后端接口返回数据,教你三种方式实现滚动到底部加载更多数据

1、演示 2、方式一&#xff1a;手动监听滚动事件 原理&#xff1a; 手动监听滚动事件的原理是通过添加滚动事件监听器&#xff0c;当页面滚动时触发相应的回调函数&#xff0c;检测页面是否已经滚动到底部&#xff0c;从而触发加载更多数据的逻辑。 优点&#xff1a; 1、相对简…

理解ROS2的动作

​ 1. 创建一个动作 目标&#xff1a; 在ROS 2软件包中定义一个动作。 1.1 新建包 设置一个 workspace 并创建一个名为 action_tutorials_interfaces 的包&#xff1a; mkdir -p ros2_ws/src #you can reuse existing workspace with this naming convention cd ros2_ws/s…

HTTPS证书申请:相关流程及注意事项

HTTPS证书&#xff08;即HTTPS证书、服务器证书&#xff09;是实现网络通信安全的重要技术产品&#xff0c;它为网站提供HTTPS加密和服务器身份验证的功能。HTTPS证书申请有那些流程&#xff1f;如何快速完成HTTPS证书申请&#xff1f;有哪些注意事项&#xff1f;本文将以沃通H…

Meta Llama 3 性能提升与推理服务部署

利用 NVIDIA TensorRT-LLM 和 NVIDIA Triton 推理服务器提升 Meta Llama 3 性能 我们很高兴地宣布 NVIDIA TensorRT-LLM 支持 Meta Llama 3 系列模型&#xff0c;从而加速和优化您的 LLM 推理性能。 您可以通过浏览器用户界面立即试用 Llama 3 8B 和 Llama 3 70B&#xff08;该…