Spring Web MVC(四)

Spring Web MVC


1 Spring MVC 响应

1.1 返回静态页面

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

html 代码:

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Index页面</title>
</head>
<body>
    Hello,Spring MVC,我是Index页面
</body>
</html>

后台代码:

java 复制代码
@RestController
public class IndexController {
    @RequestMapping("index")
    public Object index() {
        //返回index.html
        return "/index.html";
    }
}

运行结果:http://127.0.0.1:8080/index

页面未正确返回,http 响应把"/index.html"当做了 http 响应正文的数据。

如果把 @RestController 改成 @Controller,Spring MVC 就能识别 index.html 为一个静态页面,并进行返回

正确代码如下:

java 复制代码
@Controller
public class IndexController {
    @RequestMapping("index")
    public Object index() {
        //返回index.html
        return "/index.html";
    }
}

再次运行:http://127.0.0.1:8080/index

早期的后端会返回视图,但是随着互联网的发展,目前项目开发流行"前后分离"模式,Java 主要使用来做后端项目开发,所以也就不再处理前端相关的内容了。

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

@RestController = @Controller + @ResponseBody

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

@ResponseBody:定义返回的数据格式为非视图,返回一个 text/html 信息

@RestController源码:

java 复制代码
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
    @AliasFor(
        annotation = Controller.class
    )
    String value() default "";
}

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

1.2 返回数据 @ResponseBody

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

java 复制代码
@Controller
@ResponseBody
public class IndexController {
    @RequestMapping("index")
    public Object index() {
        //返回index.html
        return "/index.html";
    }
}

运行:http://127.0.0.1:8080/index

@ResponseBody 既是类注解,又是方法注解,如果作用在类上,表示该类的所有方法,返回的都是数据,如果作用在方法上,表示该方法返回的是数据

如果一个类的方法里,既有返回数据的,又有返回页面的,就把 @ResponseBody 注解添加到对应的方法上即可

java 复制代码
@Controller
public class IndexController {
    @RequestMapping("index")
    public Object index() {
        //返回index.html
        return "/index.html";
    }

    @RequestMapping("/returnData")
    @ResponseBody
    public String returnData() {
        return "该方法返回数据";
    }
}

响应结果:http://127.0.0.1:8080/returnData

如果去掉 @ResponseBody 注解,程序会报 404 错误,程序会认为需要返回是视图,根据内容去查找文件,但是查询不到,路径不存在,报 404

java 复制代码
@Controller
public class IndexController {
    @RequestMapping("index")
    public Object index() {
        //返回index.html
        return "/index.html";
    }

    @RequestMapping("/returnData")
    public String returnData() {
        return "该方法返回数据";
    }
}

1.3 返回 HTML 代码片段

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

java 复制代码
    @RequestMapping("/returnHtml")
    @ResponseBody
    public String returnHtml() {
        return "<h1>Hello,HTML~</h1>";
    }

运行程序,浏览器响应结果如下:http://127.0.0.1:8080/returnHtml

Content-Type 为 text/html

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

text/html:body 数据格式是 HTML

text/css:body 数据格式是 CSS

application/javascript:body 数据格式是 JavaScript

application/json:body 数据格式是 JSON

java 复制代码
    @RequestMapping("index2")
    public Object index2() {
        return "/a.js";
    }
    
    @RequestMapping("index3")
    public Object index3() {
        return "/b.css";
    }

1.4 返回 JSON

Spring MVC 也可以返回 JSON

后端方法返回结果为对象

java 复制代码
    @RequestMapping("/returnJson")
    @ResponseBody
    public 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;
    }

响应结果:http://127.0.0.1:8080/returnJson

Content-Type 为 application/json

1.5 设置状态码

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

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

java 复制代码
@RequestMapping("setStatus")
    @ResponseBody
    public String setStatus(HttpServletResponse response) {
        response.setStatus(401);
        return "设置状态码成功";
    }

响应结果:http://127.0.0.1:8080/setStatus

状态码不影响页面的展示

1.6 设置 Header

Http 响应报头也会向客户端传递一些附加信息,比如服务器的名称,请求的资源已移动到新地址等,如:Content-Type,Local等,这些信息通过 @RequestMapping 注解的属性来实现

@RequestMapping 的源码:

java 复制代码
@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 {};
}

value:指定映射 URL

method:指定请求的 method 类型,如 GET,POST等

consumes:指定处理请求(request)的提交内容类型(Content-Type),例如 application/json,text/html

produces:指定返回的内容类型,还可以同时设置返回值的字符编码

Param:指定 request 中必须包含某些参数值时,才让该方法处理

header:指定 request 中必须包含某些指定的 header 值,才能让该方法处理请求

1.6.1 设置 Content-Type

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

java 复制代码
@RequestMapping(value = "/returnJson2",produces = "application/json")
    @ResponseBody
    public String returnJson2() {
        return "{\"success\":true}";
    }

响应结果:http://127.0.0.1:8080/returnJson2

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

设置返回类型,也可以同步设置响应编码

设置其他 Header

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

java 复制代码
    @RequestMapping("/setHeader")
    @ResponseBody
    public String setHeader(HttpServletResponse response) {
        response.setHeader("MyHeader","MyHeaderValue");
        return "设置 Header 成功";
    }

响应结果:http://127.0.0.1:8080/setHeader

相关推荐
神舟之光2 分钟前
jwt权限控制简单总结(乡村意见簿-vue-express-mongdb)
前端·vue.js·express
铭毅天下13 分钟前
EasySearch Rules 规则语法速查手册
开发语言·前端·javascript·ecmascript
GISer_Jing25 分钟前
AI Agent操作系统架构师:Harness Engineer解析
前端·人工智能·ai·aigc
禾小西27 分钟前
Spring AI :Spring AI的介绍
java·人工智能·spring
英俊潇洒美少年33 分钟前
css中专门用来提升渲染性能、减少重排重绘的属性
前端·css
天若有情6731 小时前
前端HTML精讲01:别再乱 div 一把抓,吃透语义化标签才是进阶第一步
前端·html
Highcharts.js1 小时前
React 开发者的图表库生态:Highcharts React
前端·react.js·前端框架
阿部多瑞 ABU1 小时前
文明文化悖论
前端·人工智能·ai写作
钛态1 小时前
Flutter 三方库 react 泛前端核心范式框架鸿蒙原生层生态级双向超能适配:跨时空重塑响应式单向数据流拓扑与高度精密生命周期树引擎解耦视图渲染控制中枢(适配鸿蒙 HarmonyOS ohos)
前端·flutter·react.js
全栈前端老曹1 小时前
【前端地图】地图开发基础概念——地图服务类型(矢量图、卫星图、地形图)、WGS84 / GCJ-02 / BD09 坐标系、地图 SDK 简介
前端·javascript·地图·wgs84·gcj-02·bd09·地图sdk