- 学习常⻅的Spring Web MVC注解
- 掌握使⽤SpringMVC来完成基础的功能开发
- 了解MVC和三层架构的设计模式
- 掌握企业开发中的⼀些命名规范
一、 什么是 Spring Web MVC?
Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc),但它通常被称为"Spring MVC".
什么是Servlet呢?Servlet 是⼀种实现动态⻚⾯的技术. 准确来讲Servlet是⼀套 Java Web 开发的规范 ,或者说是⼀套 Java Web 开发的技术标准. 只有规范并不能做任何事情,必须要有⼈去实现它. 所谓实现 Servlet 规范,就是真正编写代码去实现 Servlet 规范提到的各种功能,包括类、⽅法、属性等.Servlet 规范是开放的,除了 Sun 公司,其它公司也可以实现 Servlet 规范,⽬前常⻅的实现了Servlet 规范的产品包括 Tomcat、Weblogic、Jetty、Jboss、WebSphere 等,它们都被称为"Servlet 容器". Servlet 容器⽤来管理程序员编写的 Servlet 类.
1.MVC 定义
MVC 是 Model View Controller 的缩写,它是软件⼯程中的⼀种软件架构设计模式,它把软件系统分为模型、视图和控制器三个基本部分

- View(视图) 指在应⽤程序中专⻔⽤来与浏览器进⾏交互,展⽰数据的资源.
- Model(模型) 是应⽤程序的主体部分,⽤来处理程序中数据逻辑的部分.
- Controller(控制器)可以理解为⼀个分发器,⽤来决定对于视图发来的请求,需要⽤哪⼀个模型来处理,以及处理完后需要跳回到哪⼀个视图。即⽤来连接视图和模型
⽐如去饭店吃饭客⼾进店之后, 服务员来接待客⼾点餐, 客⼾点完餐之后, 把客⼾菜单交给前厅, 前厅根据客⼾菜单给后厨下达命令. 后厨负责做饭, 做完之后, 再根据菜单告诉服务员, 这是X号餐桌客⼈的饭.在这个过程中
- 服务员就是View(视图), 负责接待客⼾, 帮助客⼾点餐, 以及给顾客端饭
- 前厅就是Controller(控制器), 根据⽤⼾的点餐情况, 来选择给哪个后厨下达命令.
- 后厨就是Model(模型), 根据前厅的要求来完成客⼾的⽤餐需求
⽐如去公司⾯试我们到了公司之后, HR会给我们安排会议室, 根据候选⼈去通知不同的部⻔来安排⾯试, ⾯试结束后, 由HR来告诉⾯试结果在这个过程中
- HR就是View(视图), 负责接待候选⼈, 并告知候选⼈⾯试结果
- 不同的部⻔, 就是Controller(控制器), HR根据候选⼈来选择对应的部⻔来进⾏⾯试
- ⾯试官, 就是Model层, 来处理⾯试这个事情.
2.什么是Spring MVC ?
MVC 是⼀种架构设计模式, 也是⼀种思想, ⽽ Spring MVC 是对 MVC 思想的具体实现. 除此之外, Spring MVC还是⼀个Web框架.
总结来说,Spring MVC 是⼀个实现了 MVC 模式的 Web 框架.
- MVC
- Web框架
Spring MVC 全称是 Spring Web MVC

可以看到,Spring Web的介绍是:
Build web, including RESTful, applications using Spring MVC. Uses Apache Tomcat as the default embedded container.
这时候可能大家就懵了, 前⾯创建的不是SpringBoot项⽬吗? 怎么⼜变成了Spring MVC项⽬? 他们之间到底有着什么样的关系?
SpringBoot是2014年发布的, Spring 是2004年发布的, 在2014年发布之前, 就不能⽤Spring实现MVC架构吗? 显然不是了.
Spring Boot 只是实现Spring MVC的其中⼀种⽅式⽽已.
Spring Boot 可以添加很多依赖, 借助这些依赖实现不同的功能.
Spring Boot 通过添加Spring Web MVC框架, 来实现web功能.
⽐如: 厨房可以⽤来做饭, 但真实实现做饭功能的是⽕以及各种做饭相关的⻝材和⼯具.
厨房就好⽐是SpringBoot, 厨房可以装柜⼦, 实现收纳功能, 装燃⽓灶等, 实现做饭功能.
做饭这个事, 就是MVC, 在⼏千年前, 有⽕有⻝材就可以实现做饭.
不过核⼼没变⽐如上⾯的例⼦中, 去饭店吃饭. ⼀些饭店是前厅来负责接待客⼾, 帮助客⼾点餐, 也就是Controller来负责接收⽤⼾的请求.去公司⾯试, 直接由⾯试官来接待候选⼈, 省去了HR中间的交接过程.
二、学习Spring MVC
- 建⽴连接:将⽤⼾(浏览器)和 Java 程序连接起来,也就是访问⼀个地址能够调⽤到我们的 Spring 程序。
- 请求: ⽤⼾请求的时候会带⼀些参数,在程序中要想办法获取到参数, 所以请求这块主要是 获取参数的功能.
- 响应: 执⾏了业务逻辑之后,要把程序执⾏的结果返回给⽤⼾, 也就是响应.
⽐如⽤⼾去银⾏存款
- 建⽴连接: 去柜台
- 请求: 带着银⾏卡, ⾝份证去存款
- 响应: 银⾏返回⼀张存折.
1. 项⽬准备
Spring MVC 使⽤ Spring Boot 的⽅式创建
2.建⽴连接
package com.springboot.demo;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@RequestMapping("/sayHi")
public String sayHi(){
return "hello,Spring";
}
}
接下来访问: http://127.0.0.1:8080/sayHi, 就可以看到程序返回的数据了
(1)@RequestMapping 注解介绍
既然 @RequestMapping 已经可以达到我们的⽬的了, 我们为什么还要加 @RestController呢?我们把 @RestController 去掉, 再来访问⼀次:
可以看到, 程序报了404, 找不到该⻚⾯.这就是 @RestController 起到的作⽤.⼀个项⽬中, 会有很多类, 每个类可能有很多的⽅法, Spring程序怎么知道要执⾏哪个⽅法呢?Spring会对所有的类进⾏扫描, 如果类加了注解@RestController, Spring才会去看这个类⾥⾯的⽅法有没有加 @RequestMapping 这个注解, 当然他的作⽤不⽌这⼀点, 咱们先⽤, 后⾯再详细讲
(2)@RequestMapping 使⽤
- @RequestMapping标识⼀个类:设置映射请求的请求路径的初始信息
- @RequestMapping标识⼀个⽅法:设置映射请求请求路径的具体信息
package com.springboot.demo;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/user")
@RestController
public class UserController {
@RequestMapping("/sayHi")
public String sayHi(){
return "hello,Spring";
}
}
- @RequestMapping 的URL 路径最前⾯加不加 / (斜杠)都可以, Spring程序启动时, 会进⾏判断, 如果前⾯没有加 / , Spring会拼接上⼀个 /,但通常情况下, 我们加上 /
@RequestMapping("user")
@RestController
public class UserController {
@RequestMapping("sayHi")
public String sayHi(){
return "hello,Spring MVC";
}
}
访问
http://127.0.0.1:8080/user/sayHi
, 依然可以正确响应.
- @RequestMapping 的URL路径也可以是多层路径, 最终访问时, 依然是 类路径 + ⽅法路径
@RequestMapping("/user/m1")
@RestController
public class UserController {
@RequestMapping("/say/hi")
public String sayHi(){
return "hello,Spring MVC";
}
}
访问路径: http://127.0.0.1:8080/user/m1/say/hi
建议都加上类路径,原因
- 可以方便路径定位,避免发生错误,即使方法名相同,只要类名不相同,路径也不相同
- 提高代码可读性
(3)@RequestMapping 是 GET 还是 POST 请求?
- GET请求:
- 浏览器发送的请求类型都是get, 通过以上案例, 可以看出来 @RequestMapping ⽀持get请求.
- POST 请求:
- 我们通过form表单来构造请求,创建test.html, html代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/user/sayHi" method="post">
<input type="submit" value="提交">
</form>
</body>
</html>

如上图, 访问链接为: http://127.0.0.1:8080/html/test.html
从运⾏结果可以看出: @RequestMapping 既⽀持Get请求, ⼜⽀持Post请求. 同理, 也⽀持其他的请求⽅式
指定GET/POST⽅法类型
方法1,指定方式
package com.springboot.demo;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/user")
@RestController
public class UserController {
//既支持get,又支持post请求
@RequestMapping("/sayHi")
public String sayHi(){
return "hi,Spring";
}
//只支持get请求
@RequestMapping(value = "/sayHello",method = RequestMethod.GET)
public String sayHello(){
return "hello,Spring";
}
//只支持POST请求
@RequestMapping(value = "/sayBye",method = RequestMethod.POST)
public String sayBye(){
return "Bye,Spring";
}
}
方法2,直接修改注解
注: