1.Spring Web MVC简介
Spring Web MVC 我们通常简称为Spring MVC,它是一个基于MVC的web开发框架。从Spring 5.0开始,Spring引入了响应式的web框架Spring WebFlux,它们在使用的编程模型上保持高度的
Spring Web MVC是基于Servlet API构建,Spring Web MVC的Servlet实现为DispatcherServlet,它使用了一个Spring容器(WebApplicationContext),从而让Servlet和Spring容器结合在一起。
基于Spring Boot的Spring MVC应用内嵌了Servlet容器,我们可以直接运行Spring Boot开发的Web应用。在Web应用下Spring Boot为我们自动新建了一个类型为AnnotationConfigServletWebServerApplicationContext的Spring IoC容器。
2. 用Spring Boot学习Web MVC
我们新建应用作为本章的演示:
Group:top.wisely
Arifact:learning-spring-mvc
Dependencies:Spring Web Starter、Lombok
2.1 核心注解
Spring MVC的核心注解
- @Controller:首先它组合了@Component注解,被注解的类是一个Bean;它是一个控制器。
- @RequestMapping:将web请求路径映射到被注解的类或者方法上;
@Controller@RequestMapping("/demo")public class DemoController { @RequestMapping("/hello") @ResponseBody public String hello(){ return "Hello World !!!"; }}
我们启动应用,用Postman访问http://localhost:8080/demo/hello。
2.2 RESTful服务
REST是Representational State Transfer(表述性状态传递)的缩写,是目前基于Http的Web服务中最常用的一种架构。遵循REST架构规范的Web服务称之为RESTfu Web服务。它区别于以方法调用为导向的web服务(SOAP),强调基于网络资源的Web服务。本书将关注和提供RESTful服务,现代的应用的客户端可能是Android、IOS或者浏览器等,而基于浏览器的应用也会和服务端剥离,所以我们将不讨论MVC的Model和View部分。
当我们访问RESTful的网络资源时候,将得到如JSON、XML或HTMl格式的数据返回。一次完整的Web交互由两部分组成:
- 请求:代表客户端向服务端发送的一次HTTP web请求。可由RequestEntity(HttpEntity的子类)来访问请求的所有内容
- header为元数据信息,也可由@RequestHeader注解来获取;
- 内容类型:请求头信息里有一项重要的属性叫内容类型(Content-Type),它指定body请求体的媒体类型(如:application/json),我们可使用@RestController的consumes属性来限制控制器方法支持的内容类型。
- Accept:客户端可接受的返回媒体类型,如:Accept:application/json,text/html,客户端若不设置则默认为:Accept:*/*,我们可以使用@RestController的produces属性来限制控制器方法支持的返回媒体类型。在默认情况下,意味着客户端接受所有的返回媒体类型。
- body为请求体数据,也可由由@RequestBody注解来获取;
- 参数数据:URL路径上的数据:请求参数@RequestParam、路径变量@PathVariable等。
- 请求方法:GET、POST、HEAD、OPTIONS、PUT、PATCH、DELETE和TRACE
- 返回:response,由status、header和body组成,可由ResponseEntity(同样是HttpEntity的子类,封装了公共的header和body部分)来设置
- header为元数据信息;
- 内容类型:返回头中也有内容类型(Content-Type),它指定返回体body的媒体类型(如:application/json)
- body为返回数据,也可由@ResponseBody来设置;
- status状态信息,也可由@ResponseStatus来设置。状态主要有下面分类:
- 1xx:信息反馈
- 2xx:成功反馈
- 3xx:重定向
- 4xx:客户端导致的错误
- 5xx:服务端导致的错误
Spring MVC给我们提供了@RestController用来开发RESTful Web服务,它组合了@Controller和@ResponseBody,意味着返回通过返回体来返回数据。
Spring MVC还针对不同的Http动作来定制语义化的@RequestMapping,我们先了解RESTful服务支持的HTTP请求方法:
- GET:从返回体重获取资源。使用@GetMapping等同于@RequestMapping(method = RequestMethod.GET)
- POST:通过请求体创建新的资源。使用@PostMapping等同于@RequestMapping(method = RequestMethod.POST)
- PUT:通过请求体替换资源,若过不存在资源则创建。使用@PutMapping等同于@RequestMapping(method = RequestMethod.PUT)
- PATCH:通过请求体更新资源,若不存在资源可以创建。使用@PatchMapping等同于@RequestMapping(method = RequestMethod.PATCH)
- DELETE:删除资源。使用@DeleteMapping等同于@RequestMapping(method = RequestMethod.DELETE)