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.rhkb.cn/news/280355.html

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

相关文章

window下安装并使用nvm(含卸载node、卸载nvm、全局安装npm)

window下安装并使用nvm&#xff08;含卸载node、卸载nvm、全局安装npm&#xff09; 一、卸载node二、安装nvm三、配置路径和下载源四、使用nvm安装node五、nvm常用命令六、卸载nvm七、全局安装npm、cnpm八、遇到的问题 nvm 全名 node.js version management&#xff0c;顾名思义…

PyTorch 深度学习(GPT 重译)(二)

四、使用张量表示真实世界数据 本章内容包括 将现实世界的数据表示为 PyTorch 张量 处理各种数据类型 从文件加载数据 将数据转换为张量 塑造张量&#xff0c;使其可以作为神经网络模型的输入 在上一章中&#xff0c;我们了解到张量是 PyTorch 中数据的构建块。神经网络…

列表的循环遍历

列表的遍历 - while循环 既然数据容器可以存储多个元素&#xff0c;那么&#xff0c;就会有需求从容器内依次取出元素进行操作。 将容器内的元素依次取出进行处理的行为&#xff0c;称之为&#xff1a;遍历&#xff0c;迭代 如何遍历列表的元素呢&#xff1f; 可以使用前面…

阿里云轻量应用服务器和ECS服务器有啥区别?2024年整理对比表

阿里云服务器ECS和轻量应用服务器有什么区别&#xff1f;轻量和ECS优缺点对比&#xff0c;云服务器ECS是明星级云产品&#xff0c;适合企业专业级的使用场景&#xff0c;轻量应用服务器是在ECS的基础上推出的轻量级云服务器&#xff0c;适合个人开发者单机应用访问量不高的网站…

kubesphere all in one部署Jenkins提示1 Insufficient cpu

原因 devops 至少一个cpu&#xff08;1000m&#xff09;&#xff0c;但是其他资源已经占用了很多cpu CPU 资源以 CPU 单位度量。Kubernetes 中的一个 CPU 等同于&#xff1a; 1 个 AWS vCPU 1 个 GCP核心 1 个 Azure vCore 裸机上具有超线程能力的英特尔处理器上的 1 个超线程…

优雅的 Markdown

Markdown浅尝 一、勾选框 注意[]前后都要有空格 - [x] 干的漂亮 - [x] 吃饭 - [x] 写代码 - [ ] 睡觉 干的漂亮 吃饭 写代码 睡觉 二、列表 #无序列列表 * 换成 - 也行 * 你 * 你好 * 你好呀 - 你很好啊 你你好你好呀你很好啊 #有序列表 . 后面有个空格 1. 我 2. 是我 3.…

【Jenkins】data stream error|Error cloning remote repo ‘origin‘ 错误解决【亲测有效】

错误构建日志 17:39:09 ERROR: Error cloning remote repo origin 17:39:09 hudson.plugins.git.GitException: Command "git fetch --tags --progress http://domain/xxx.git refs/heads/*:refs/remotes/origin/*" returned status code 128: 17:39:09 stdout: 17…

CSS Module

CSS Module的作用&#xff1a;将CSS样式作用域限制在特定的组件范围内&#xff0c;以避免全局样式污染和命名冲突。 Vue中如何实现样式模块…

大数据开发--02.环境准备

一.准备三台linux虚拟机 1.分别取名node1,node2,node3 2.配置静态ip 这里以node1为例&#xff0c;配置静态ip地址&#xff0c;其他node2.node3一样 配置完成之后别忘记 systemctl restart network 3.在各自的/etc/hosts文件中编辑三个Ip地址 三台都要配置&#xff0c; 4.然…

express+mysql+vue,从零搭建一个商城管理系统16--收货地址(全国省市县名称和code列表)

提示&#xff1a;学习express&#xff0c;搭建管理系统 文章目录 前言一、新建config/area.js二、新建models/address.js三、新建dao/address.js四、新建routes/address.js五、添加地址六、查询用户地址列表总结 前言 需求&#xff1a;主要学习express&#xff0c;所以先写serv…

Kotlin runBlocking CoroutineScope synchronized简单死锁场景

Kotlin runBlocking CoroutineScope synchronized简单死锁场景 import kotlinx.coroutines.*fun main(args: Array<String>) {runBlocking {val lock1 Any()val lock2 Any()CoroutineScope(Dispatchers.IO).launch {repeat(10) {println("A-$it 申请 lock1...&quo…

C语言-----冒泡排序

今天&#xff0c;让我们来学习一下C语言中一个简单的排序算法------冒泡排序。 什么是冒泡排序呢&#xff1f; 冒泡排序是C语言中一个可以将一个数组的内容按照升序或者降序进行重新排列的算法。简单来说&#xff0c;是一种排序的思维。 冒泡排序的核心思想&#xff1a;让同…

Git原理与使用(一)

目录 前言 版本控制器 Linux下的Git的安装 Git的基本操作 创建Git本地仓库 配置Git 工作区、暂存区、版本库 添加与提交 查看.git文件 前言 我们可能要写多个文档对一个产品进行描述&#xff0c;但是一般情况下我们可能要写多个文档&#xff0c;比如&#xff1a; 初…

AD域的部署

一台win10客户端加入进域服务服务器&#xff0c;将客户端DNS指向域控服务器-查看&#xff0c;更改客户端计算机名并加入隶属于域中-shanxi.com-填写服务器账户和密码-重启客户端 计算机名、域和工作组设置 4/查看是否配置正确-此电脑-属性 首先我们打开服务器右击此电脑点击属…

Vue.js开发基础

单文件组件 使用Vite创建Vue项目后&#xff0c;目录结构中包含一些扩展名为.vue的文件&#xff0c;每个.vue文件都可用来定义一个单文件组件。Vue中的单文件组件是Vue组件的文件格式。每个单文件组件由模板、样式和逻辑3个部分构成。 运行结果&#xff1a; 1.模板 模板用于搭建…

Python greenlet的使用,gevent和猴子补丁

目录 greenlet 结果 gevent和猴子补丁 结果 gevent使用案例 注&#xff1a;代码有解释 greenlet #greenlet 完成协程任务,封装你的生成器 import timefrom greenlet import greenlet#在执行下面三个任务的时候&#xff0c;当前进程是开了三个线程 #sleep就相当于线程暂停…

利用colab部署chatglm

登录colab 创建新的notebook 选择notebook设置 选择GPU然后保存&#xff0c;需要选择GPU 克隆代码 !git clone https://github.com/THUDM/ChatGLM-6B.git切换到目录安装所需要的依赖 %cd /content/ChatGLM-6B %pwd !pip install -r requirements.txt安装所需要的依赖包 …

Java特性之设计模式【组合模式】

一、组合模式 概述 组合模式&#xff08;Composite Pattern&#xff09;&#xff0c;又叫部分整体模式&#xff0c;是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象&#xff0c;用来表示部分以及整体层次。这种类型的设计模式属于结构型模式&#x…

2024年腾讯云优惠券领取入口整理,共四个渠道领券

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

整合qq邮箱发送

目录 &#x1f32e;1.获取qq授权码 &#x1fad3;2.引入依赖 &#x1f9c8;3.配置mail信息 &#x1f95e;4.创建实现类 &#x1f956;5.测试 1.获取qq授权码 点击开启服务&#xff0c;发送信息获取授权码 2.引入依赖 <!--邮件--><dependency><groupId&…