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

news/2024/10/22 11:09:06/

目录

一、返回静态页面

@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抓包,如图:

        确实设置成功了。


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


http://www.ppmy.cn/news/1442473.html

相关文章

第4篇:创建Nios II工程之Hello_World<三>

Q&#xff1a;接着我们再来完成Nios II软件工程设计部分。 A&#xff1a;从Quartus Tools选择Nios II Software Build Tools for Eclipse&#xff0c;打开Nios II SBT软件&#xff0c;Workspace指定到hello_world工程的software文件夹路径&#xff1b;再从File-->New-->…

java基础之类运行与双亲委派机制简介

一 类加载运行过程 通过java命令运行某个类的main函数来启动程序时&#xff0c;首先需要通过类加载器将主类加载到JVM中&#xff1b; 源码&#xff1a; package com.ddu.jvm;public class HelloWordHelper {public static void main(String[] args) {User user new User();…

Pow(x,n)——力扣

python&#xff08;快速幂&#xff09; 50. Pow(x, n) 已解答 中等 相关标签 相关企业 实现 pow(x, n) &#xff0c;即计算 x 的整数 n 次幂函数&#xff08;即&#xff0c;xn &#xff09;。 示例 1&#xff1a; 输入&#xff1a;x 2.00000, n 10 输出&#xff1a;10…

【深度学习】Dropout、DropPath

一、Dropout 1. 概念 Dropout 在训练阶段会让当前层每个神经元以drop_prob&#xff08; 0 ≤ drop_prob ≤ 1 0\leq\text{drop\_prob}\leq1 0≤drop_prob≤1&#xff09;的概率失活并停止工作&#xff0c;效果如下图。 在测试阶段不会进行Dropout。由于不同批次、不同样本的神…

Linux多进程(二)进程通信方式一 管道

管道的是进程间通信&#xff08;IPC - InterProcess Communication&#xff09;的一种方式&#xff0c;管道的本质其实就是内核中的一块内存(或者叫内核缓冲区)&#xff0c;这块缓冲区中的数据存储在一个环形队列中&#xff0c;因为管道在内核里边&#xff0c;因此我们不能直接…

牛客NC99 多叉树的直径【较难 深度优先 Java/Go/PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/a77b4f3d84bf4a7891519ffee9376df3 思路 核心就是树的最大直径(globalMax)一定是以某一个node为root最长的两个path-to-leaf. 就是普通dfs的同时算路径长度。时间: O(n), DFS一次 空间: O(n)参考答案Java impo…

如何使用 Internet Download Manager (IDM) 来加速和优化你的下载体验 IDM 6.41下载神器

在当今信息爆炸的时代&#xff0c;下载文件和媒体内容已成为我们日常生活的一部分。无论是工作学习还是娱乐休闲&#xff0c;我们都需要从互联网上下载各种资源。为了提高下载效率和确保文件完整性&#xff0c;选择一款优秀的下载管理软件至关重要。Internet Download Manager …

[docker] volume 补充 环境变量 参数

[docker] volume 补充 & 环境变量 & 参数 这里补充一下 volume 剩下的内容&#xff0c;以及添加参数(ARG) 和 环境变量 ENV 的内容 read only volumes ❯ docker run-p 3000:80--rm--name feedback-app-v feedback:/app/feedback-v "$(pwd):/app"-v /app/…