欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 维修 > Spring Web MVC入门(下)

Spring Web MVC入门(下)

2025/5/17 21:48:18 来源:https://blog.csdn.net/2202_76101487/article/details/141170948  浏览:    关键词:Spring Web MVC入门(下)

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。

1.4 返回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;}

        浏览器访问之后,页面如下所示:

 

        使用fidller抓包如下所示:

        由此可见返回的数据格式是json类型;

1.5 设置状态码

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

        代码如下:

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

        访问浏览器页面显示如下:

 

        

        可以看到,虽然我们设置的状态码是418,但是我们的页面依旧显示了出来,所以由此可得状态码并不影响页面的展示。

        通过fiddler抓包看看,如图:

        由此可知,我们的状态码设置成功了;

1.6 设置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值,才让该方法处理请求

1.6.1 设置Content-Type

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

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

 

        只返回数据提交类型为json格式的数据才能够返回;

        可以看到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\":101}";}

fidller抓包如下所示: 

1.6.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已经存在,则覆盖旧的值。

         fidller抓包如下所示: 

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

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

电子签名:上嘉路

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com