您现在的位置是:首页 > 技术教程 正文

Spring Web MVC入门(5)

admin 阅读: 2024-04-01
后台-插件-广告管理-内容页头部广告(手机)

响应

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

返回静态页面

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

html代码如下:

  1. html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Titletitle>
  6. head>
  7. <body>
  8. Hello, Spring MVC,我是index页面.
  9. body>
  10. html>

后台代码如下:

  1. @RestController
  2. public class IndexController {
  3. @RequestMapping("/index")
  4. public Object index() {
  5. //返回index.html
  6. return "/index.html";
  7. }
  8. }

运行结果: 

 

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

我们需要把@RestController 改为 @Controller

正确代码如下: 

  1. @Controller
  2. public class IndexController {
  3. @RequestMapping("/index")
  4. public Object index() {
  5. //返回index.html
  6. return "/index.html";
  7. }
  8. }

再次运行得到结果:

 

发现页面正确展示了.

@RestController和@Controller的关系

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

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

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

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

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

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

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

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

返回数据@ResponseBody

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

  1. @Controller
  2. @ResponseBody
  3. public class IndexController {
  4. @RequestMapping("/index")
  5. public Object index() {
  6. //返回index.html
  7. return "/index.html";
  8. }
  9. }

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

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

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

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

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

  1. @Controller
  2. public class IndexController {
  3. @RequestMapping("/index")
  4. public Object index() {
  5. //返回index.html
  6. return "/index.html";
  7. }
  8. @RequestMapping("/returnData")
  9. @ResponseBody
  10. public String returnData() {
  11. return "该方法返回数据";
  12. }
  13. }

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

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

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

返回HTML代码片段

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

  1. @RequestMapping("/returnHtml")
  2. @ResponseBody
  3. public String returnHtml() {
  4. return "

    hello HTML~

    "
    ;
  5. }

运行结果:

 

通过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

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

  1. @RequestMapping("/returnJson")
  2. @ResponseBody
  3. public HashMap returnJson() {
  4. HashMap map = new HashMap<>();
  5. map.put("Java", "Java value");
  6. map.put("MySQL", "MySQL value");
  7. map.put("Redis", "Redis value");
  8. return map;
  9. }

运行结果:

 

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

 

设置状态码

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

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

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

运行结果:

 

通过Fiddler观察设置的结果:

 

设置Header

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

这些信息通过@RequestMapping注解的属性来实现.

先来看@RequestMapping的源码:

 

  1. @Target({ElementType.TYPE, ElementType.METHOD})
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. @Mapping
  5. @Reflective({ControllerMappingReflectiveProcessor.class})
  6. public @interface RequestMapping {
  7. String name() default "";
  8. @AliasFor("path")
  9. String[] value() default {};
  10. @AliasFor("value")
  11. String[] path() default {};
  12. RequestMethod[] method() default {};
  13. String[] params() default {};
  14. String[] headers() default {};
  15. String[] consumes() default {};
  16. String[] produces() default {};
  17. }

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.

  1. @RequestMapping(value = "/returnJson2", produces = "application/json")
  2. @ResponseBody
  3. public String returnJson2() {
  4. return "{\"sucess\":true}";
  5. }

运行结果:

Fidder抓包结果:

 

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

设置其他Header

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

  1. @RequestMapping("/setHeader")
  2. @ResponseBody
  3. public String setHeader(HttpServletResponse response) {
  4. response.setHeader("MyHeader", "MyHeaderValue");
  5. return "设置Header成功";
  6. }

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

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

 

 

 

 

 

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索
排行榜