Spring Web MVC入门(5)

响应

在我们前面的代码例子中, 都已经设置了响应数据Http响应结果可以是数据, 也可以是静态页面, 也可以针对响应设置状态码, Header信息等.

返回静态页面

创建前端页面index.html(注意路径)

html代码如下:

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

后台代码如下:

@RestController
public class IndexController {@RequestMapping("/index")public Object index() {//返回index.htmlreturn "/index.html";}
}

运行结果: 

 

结果却发现, 页面未正确返回, http响应把"/index.html"当作http响应正文的数据. 那么Spring MVC如何才能识别出来index.html是一个静态页面, 并进行返回呢?

我们需要把@RestController 改为 @Controller

正确代码如下: 

@Controller
public class IndexController {@RequestMapping("/index")public Object index() {//返回index.htmlreturn "/index.html";}
}

再次运行得到结果:

 

发现页面正确展示了.

@RestController和@Controller的关系

我们之前讲过了MVC模式, 后端会返回视图, 这是早期时的概念

随着互联网的发展, 目前项目流行"前后端分离模式" , Java主要是用来做后端项目的开发, 所以就不再处理前端相关内容了.

MVC的概念也逐渐发生了变化, View不再返回视图, 而是返回显示视图时所需要的数据. 

所以前面的@RestController其实是返回的数据, 是作为一个复合注解.

@RestController = @Controller(默认返回视图) + @ResponseBody(返回数据).

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

@ResponseBody: 定义返回的数据为非视图, 返回一个text/html信息. 它既可以修饰类, 又可以修饰方法. (修饰类时:表示当前类的所有方法, 全部返回数据, 和@Controller可以合并为@RestController; 修饰方法时, 表示当前方法返回数据).

如果想返回视图的话, 只需要把@ResponseBody去掉就可以了, 也就是@Controller.

返回数据@ResponseBody

上面我们讲到, @ResponseBody表示返回数据.

@Controller
@ResponseBody
public class IndexController {@RequestMapping("/index")public Object index() {//返回index.htmlreturn "/index.html";}
}

加上@ResponseBody注解, 该方法就会把"/index.html"当作一个数据返回给前端.

@ResponseBody既是类注解, 又是方法注解

如果作用在类上, 表示该类的所有方法, 返回的就是数据, 如果作用在方法上, 表示该方法返回的就是数据.

当你在一个类中既想让一些方法返回视图, 又想让一些方法返回数据, 那么就可以给类加@Controller注解, 给想返回数据的方法加上@ResponseBody注解, 返回视图的方法不处理即可. 

同样, 如果类上有@RestController注解时:表示所有方法上添加了@ResponseBody注解, 也就是当前类下所有方法返回值作为响应数据.

@Controller
public class IndexController {@RequestMapping("/index")public Object index() {//返回index.htmlreturn "/index.html";}@RequestMapping("/returnData")@ResponseBodypublic String returnData() {return "该方法返回数据";}
}

多个注解时, 没有先后顺序, 先写哪个都可以. 

如果给第二个方法去掉@Responsebody, 程序就会报404错误.

因为程序会认为返回的应该是视图, 就会根据内容去查找文件, 但是文件查找不到, 路径不存在, 就报404. 

返回HTML代码片段

后端返回数据的时候, 如果数据中有HTML代码, 也会被浏览器解析.

    @RequestMapping("/returnHtml")@ResponseBodypublic String returnHtml() {return "<h1>hello HTML~</h1>";}

运行结果:

 

通过Fiddler观察结果, Content-Type为 text/html.

响应中的Content-Type常见取值有以下几种:

text/html:body数据格式是HTML

text/css:body数据格式是CSS

application/javascript:body数据格式是JavaScript

application/json:body数据格式是JSON. 

返回JSON

Spring MVC也可以返回JSON

后端方法返回结果为对象.

    @RequestMapping("/returnJson")@ResponseBodypublic HashMap<String, String> returnJson() {HashMap<String, String> map = new HashMap<>();map.put("Java", "Java value");map.put("MySQL", "MySQL value");map.put("Redis", "Redis value");return map;}

运行结果:

 

通过Fiddler观察响应结果, Content-Type为application/json.

 

设置状态码

Spring MVC会根据我们方法的返回结果自动设置响应状态码, 程序员也可以手动指定状态码.

通过Spring MVC的内置对象HttpServletResponse提供的方法来进行设置.

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

运行结果:

 

通过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值, 才能让该方法处理请求.

设置Content-Type

我们通过设置produces属性的值, 设置响应的报头Content-Type.

    @RequestMapping(value = "/returnJson2", produces = "application/json")@ResponseBodypublic String returnJson2() {return "{\"sucess\":true}";}

运行结果:

Fidder抓包结果:

 

如果不设置produces, 方法返回的结果为String时, Spring MVC默认返回类型, 是text/html. 

设置其他Header

设置其它Header的话, 需使用Spring MVC内置对象HttpServletResponse提供的方法来进行设置. 

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

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

运行成功后查看Fidder抓包结果:

 

 

 

 

 

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

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

相关文章

刷新金融知识库,与时代并进!社科院与杜兰大学金融管理硕士项目为职场注入新活力

在这个日新月异的时代&#xff0c;金融行业的变革如同翻涌的浪潮&#xff0c;不断冲刷着我们的知识体系。为了应对这一挑战&#xff0c;我们需要不断更新自己的金融知识库&#xff0c;掌握最新的行业动态和前沿理论。而社科院与杜兰大学联合推出的金融管理硕士项目&#xff0c;…

推荐系统中常用评价指标及其实现

推荐系统中常用评价指标及其实现 定义 0 符号系统 符号含义备注K, kTop-K 推荐中的 K 值, 比如 Top-5 表示给每个用户推荐 5 个物品 U U U用户总数量 I I I物品总数量 u u u代指一个用户 i i i代指一个物品 R ( u ) \mathcal{R}(u) R(u)给用户 u u u 推荐的物品列表 T ( u …

腾讯云服务器如何购买省钱?2024年优惠券和优惠活动整理

腾讯云代金券领取渠道有哪些&#xff1f;腾讯云官网可以领取、官方媒体账号可以领取代金券、完成任务可以领取代金券&#xff0c;大家也可以在腾讯云百科蹲守代金券&#xff0c;因为腾讯云代金券领取渠道比较分散&#xff0c;腾讯云百科txybk.com专注汇总优惠代金券领取页面&am…

Windows 10中打开控制面板的13种方法,总有一种适合你

前言 虽然有传言称微软将取消控制面板,但它不会那么快消失。一些重要的设置仅在Windows 10的经典控制面板中找得到,它们不在设置应用程序中。本文有13种方法可以打开控制面板。 搜索开始菜单 你可以使用“开始”菜单的搜索功能搜索PC上的任何应用程序。在任务栏左侧的搜索…

设计模式|工厂模式

文章目录 1. 工厂模式的三种实现2. 简单工厂模式和工厂方法模式示例3. 抽象工厂模式示例4. 工厂模式与多态的关系5. 工程模式与策略模式的关系6. 面试中可能遇到的问题6.1 **工厂模式的概念是什么&#xff1f;**6.2 **工厂模式解决了什么问题&#xff1f;**6.3 **工厂模式的优点…

Redis如何设置键的生存时间或过期时间

键的生存时间或过期时间 概述。 通过EXPIRE命令或者PEXIPIRE命令&#xff0c;客户端可以以秒或者毫秒精度为数据库中的某个键设置生存时间(Time To Live,TTL)&#xff0c;在经过指定的秒数或者毫秒数之后&#xff0c;服务器就会自动删除生存时间为0的键: 127.0.0.1:6379>…

策略模式实战

项目推荐最近开发完成的项目中使用到了策略模式&#xff0c;实现多种支付方式&#xff0c;避免了后期支付方式if-else代码的冗余&#xff0c;也有利于后期支付的一个扩展。同时这个项目非常适合于做毕设&#xff0c;想了解这个项目的同学可以联系我QQ&#xff1a;3808898981 前…

Python学习:注释和运算符

python 注释 在Python中&#xff0c;注释用于在代码中添加解释、说明或者提醒&#xff0c;但并不会被解释器执行。Python中的注释以#开头&#xff0c;直到行末为止。下面是关于Python注释的详细解释和举例&#xff1a; 单行注释&#xff1a;使用#符号在行的开头添加注释&…

【MySQL】图形化界面工具DataGrip安装&配置&使用

前言 大家好吖&#xff0c;欢迎来到 YY 滴MySQL系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C Linux的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…

NVIDIA Chat with RTX教程使用以及CUDA和CUDNN

基本环境安装&#xff1a;CUDA12.1CUDNNcudnn-windows-x86_64-8.9.7.29_cuda12-archive 1、CUDA下载 CUDA官方安装教程: https://docs.nvidia.com/cuda/cuda-installation-guide-microsoft-windows/index.html CUDA Toolkit的下载: CUDA Toolkit 12.1 Downloads | NVIDIA Dev…

vue3封装对话框el-dialog组件

实现逻辑&#xff1a; 1、引入对话框组件&#xff1b; 2、对话框组件中定义一个方法&#xff0c;通过defineExpose({})暴漏出去&#xff1b; 3、组件使用&#xff0c;并用ref绑定&#xff1b; 4、点新增和编辑的时候&#xff0c;通过ref调用对话框暴漏出来的方法&#xff0c;并…

【数据可视化】Echarts中的其它图表

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 前言2. 绘制散点图2.1 绘制基本散点图2.2 绘制两个序列的散点图2.3 绘制带涟漪特效的散点图 3. 绘制气泡图3.1 绘制标准气泡图3.2 绘制各国人均寿命与GDP气泡图3.3 绘制城市A、城市B、城市C三个城市空气污染指数气…

塑料工厂5G智能制造数字孪生可视化平台,推进塑料行业数字化转型

塑料工厂5G智能制造数字孪生可视化平台&#xff0c;推进塑料行业数字化转型。塑料制造行业作为重要的工业领域&#xff0c;亟需借助这一平台实现产业升级与转型&#xff0c;以适应市场的变化和提高生产效率。传统的塑料制造过程往往存在生产效率低下、资源浪费、环境污染等问题…

突发!OpenAI服务异常!!!

2024/3/20傍晚7点&#xff0c;笔者的朋友在使用OpenAI时&#xff0c;页面提示服务异常&#xff0c;由此引发了我的深思&#xff1a;人工智能的脆弱性与未来的挑战 2024年3月20日&#xff0c;傍晚7点&#xff0c;一个普通的周二&#xff0c;我的朋友在尝试使用OpenAI时&#xf…

方案开发行业迎来新数字化转型新浪潮

着科技的不断发展和市场需求的日益增长&#xff0c;方案开发行业正迎来新一轮的创新浪潮。数字化转型已成为该行业的关键词&#xff0c;各大企业纷纷加大研发投入&#xff0c;以期在激烈的市场竞争中脱颖而出。 近年来&#xff0c;方案开发行业在范围内取得了显著的发展。根据…

从初学者到专家:Java枚举的完整指南

1.枚举的概念 在Java中&#xff0c;枚举是一种特殊的数据类型&#xff0c;用于定义一组有限的命名常量。枚举提供了一种更直观、更可读的方式来表示一组相关的常量&#xff0c;并且可以为这些常量绑定其他数据或行为。 背景&#xff1a;枚举是在JDK1.5以后引入的。 主要用途…

【JavaScript】JavaScript 程序流程控制 ② ( 循环流程控制 | 循环要素 - 循环体 / 循环终止条件 | for 循环语法结构 )

文章目录 一、JavaScript 程序流程控制 - 循环流程控制1、循环流程控制2、循环要素 - 循环体 / 循环终止条件3、for 循环语法结构 - 循环控制变量 / 循环终止条件 / 操作表达式4、for 循环 完整代码示例 一、JavaScript 程序流程控制 - 循环流程控制 1、循环流程控制 在 程序开…

杰发科技AC7801——Keil编译的Hex大小如何计算

编译结果是Keil里面前三个数据的总和&#xff1a; 即CodeRoDataRWData的总和。 通过ATCLinkTool工具查看内存&#xff0c;发现最后一个字节正好是5328 注意读内存数据时候需要强转成32位&#xff0c;加1000的 增加1024的地址只需要加256即可

关于paper中的一些硬件知识

一. OS中的event Information in event traces from software systems can help developers with performance analysis, debugging and troubleshooting 1.事件的概念 已知软件系统中的event能够帮助开发者对系统进行性能分析、调试以及定位&#xff0c;那我们应该仔细考虑…

突破图神经网络技术瓶颈!新阶段3大创新方向大幅提高模型性能

针对传统的图神经网络在处理非结构化数据、捕捉高阶关系等方面的局限性&#xff0c;研究者们提出了众多优化方案。 这其中&#xff0c;超图神经网络、几何图神经网络、动态图神经网络作为GNN发展的前沿方向&#xff0c;不仅提供了更加丰富和灵活的方法来处理各种复杂的图数据&…