Spring Web MVC
什么是Spring Web MVC
官⽅对于 Spring 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 类。
从上述定义我们可以得出⼀个信息: Spring Web MVC 是⼀个 Web 框架.
下⾯咱们简称之为: Spring MVC
然⽽要真正的理解什么是 Spring MVC?我们⾸先要搞清楚什么是 MVC?
MVC 定义
MVC 是 Model View Controller 的缩写,它是软件⼯程中的⼀种软件架构设计模式,它把软件系统分为模型、视图和控制器三个基本部分
- View(视图) 指在应⽤程序中专⻔⽤来与浏览器进⾏交互,展⽰数据的资源.
- Model(模型) 是应⽤程序的主体部分,⽤来处理程序中数据逻辑的部分.
- **Controller(控制器)**可以理解为⼀个分发器,⽤来决定对于视图发来的请求,需要⽤哪⼀个模型来处理,以及处理完后需要跳回到哪⼀个视图。即⽤来连接视图和模型
⽐如去饭店吃饭
客⼾进店之后, 服务员来接待客⼾点餐, 客⼾点完餐之后, 把客⼾菜单交给前厅, 前厅根据客⼾菜单给后厨下达命令. 后厨负责做饭, 做完之后, 再根据菜单告诉服务员, 这是X号餐桌客⼈的饭.
在这个过程中
服务员就是View(视图), 负责接待客⼾, 帮助客⼾点餐, 以及给顾客端饭
前厅就是Controller(控制器), 根据⽤⼾的点餐情况, 来选择给哪个后厨下达命令.
后厨就是Model(模型), 根据前厅的要求来完成客⼾的⽤餐需求
⽐如去公司⾯试
我们到了公司之后, HR会给我们安排会议室, 根据候选⼈去通知不同的部⻔来安排⾯试, ⾯试结束后, 由HR来告诉⾯试结果
在这个过程中
HR就是View(视图), 负责接待候选⼈, 并告知候选⼈⾯试结果
不同的部⻔, 就是Controller(控制器), HR根据候选⼈来选择对应的部⻔来进⾏⾯试
⾯试官, 就是Model层, 来处理⾯试这个事情.
什么是Spring MVC
MVC 是⼀种架构设计模式, 也⼀种思想, ⽽ Spring MVC 是对 MVC 思想的具体实现. 除此之外, Spring MVC还是⼀个Web框架.
总结来说,Spring MVC 是⼀个实现了 MVC 模式的 Web 框架.
所以, Spring MVC主要关注有两个点:
- MVC
- Web框架
Spring MVC 全称是 Spring Web MVC
其实, Spring MVC 我们在前⾯已经⽤过了, 在创建 Spring Boot 项⽬时,我们勾选的 Spring Web 框架,其实就是 Spring MVC 框架:
这个就是Spring MVC的依赖
Build web, including RESTful, applications using Spring MVC. Uses Apache Tomcat as the default embedded container.
这个是Spring Web下面那段话
前⾯创建的不是SpringBoot项⽬吗? 怎么⼜变成了Spring MVC项⽬? 他们之间到底有着什么样的关系?
SpringBoot是2014年发布的, Spring 是2004年发布的, 在2014年发布之前, 就不能⽤Spring实现MVC架构吗? 显然不是了.
Spring Boot 只是实现Spring MVC的其中⼀种⽅式⽽已.
Spring Boot 是创建 Spring MVC 的一种方式
Spring Boot 可以添加很多依赖, 借助这些依赖实现不同的功能. Spring Boot 通过添加Spring Web MVC框架, 来实现web功能
⽐如: 厨房可以⽤来做饭, 但真实实现做饭功能的是⽕以及各种做饭相关的⻝材和⼯具.
厨房就好⽐是SpringBoot, 厨房可以装柜⼦, 实现收纳功能, 装燃⽓灶等, 实现做饭功能.
做饭这个事, 就是MVC, 在⼏千年前, 有⽕有⻝材就可以实现做饭.
不过Spring在实现MVC时, 也结合⾃⾝项⽬的特点, 做了⼀些改变, 相对⽽⾔, 下⾯这个图或许更加合适⼀些
不过核⼼没变
⽐如上⾯的例⼦中, 去饭店吃饭. ⼀些饭店是前厅来负责接待客⼾, 帮助客⼾点餐, 也就是Controller来负责接收⽤⼾的请求.
去公司⾯试, 直接由⾯试官来接待候选⼈, 省去了HR中间的交接过程.
当前MVC的概念又发生了一些变化,后端开发人员不涉及前端页面的开发,所以没有View层
所以View层又有了一层新的解释,之前返回的是视图,现在返回的是视图所需要的数据
学习Spring MVC
既然是 Web 框架, 那么当⽤⼾在浏览器中输⼊了 url 之后,我们的 Spring MVC 项⽬就可以感知到⽤⼾的请求, 并给予响应.
咱们学习Spring MVC, 重点也就是学习如何通过浏览器和⽤⼾程序进⾏交互.
主要分以下三个⽅⾯:
-
建⽴连接(客户端和服务器):将⽤⼾(浏览器)和 Java 程序连接起来,也就是访问⼀个地址能够调⽤到我们的Spring 程序。
-
请求: ⽤⼾请求的时候会带⼀些参数,在程序中要想办法获取到参数, 所以请求这块主要是 获取参数的功能.
-
响应: 执⾏了业务逻辑之后,要把程序执⾏的结果返回给⽤⼾, 也就是响应.
⽐如⽤⼾去银⾏存款
- 建⽴连接: 去柜台
- 请求: 带着银⾏卡, ⾝份证去存款
- 响应: 银⾏返回⼀张存折.
对于 Spring MVC 来说,掌握了以上 3 个功能就相当于掌握了 Spring MVC.
1. 项目准备
Spring MVC 项⽬创建和 Spring Boot 创建项⽬相同,在创建的时候选择 Spring Web 就相当于创建了Spring MVC 的项⽬.
Spring MVC 使⽤ Spring Boot 的⽅式创建
创建项⽬时, 勾选上 Spring Web 模块即可,如下图所⽰:
2. 建立连接
在 Spring MVC 中使⽤ @RequestMapping
来实现 URL 路由映射 ,也就是浏览器连接程序的作⽤
@RequestMapping
是 Spring Web MVC 应⽤程序中最常被⽤到的注解之⼀,它是⽤来注册接⼝的路由映射的.
表⽰服务收到请求时, 路径为 /sayhi
的请求就会调⽤ sayhi
这个⽅法的代码.
@RequestMapping
可以修饰方法也可以修饰类
访问地址:类的路径+方法路径
如果没有类的路径就直接方法路径
@RequestMapping标识⼀个类:设置映射请求的请求路径的初始信息
@RequestMapping标识⼀个⽅法:设置映射请求请求路径的具体信息
我们先来看看代码怎么写
@RestController
public class HelloWorld {
@RequestMapping("/sayhi")
public String sayHi(){
return "hi,world";
}
@RequestMapping("/sayhello")
public String sayHello(){
return "hello,world";
}
}
这种没有类的路径就是这样的了http://127.0.0.1:8080/sayhi
@RequestMapping("/say")
@RestController
public class HelloWorld {
@RequestMapping("/sayhi")
public String sayHi(){
return "hi,world";
}
@RequestMapping("/sayhello")
public String sayHello(){
return "hello,world";
}
}
这种有类的路径就是这样的了http://127.0.0.1:8080/say/sayhello
这些路径也可以写多层,最终访问时, 依然是 类路径 + ⽅法路径
比如
@RequestMapping("/say/say/say")
注意:
@RequestMapping("/say/say/say")
最开头的
/
是可以省略的,但企业开发建议写上,最好是一直写上
@RequestMapping
的URL 路径最前⾯加不加 / (斜杠)都可以, Spring程序启动时, 会进⾏判断, 如果前⾯没有加/
, Spring会拼接上⼀个/
开发中建议加上类路径:
- 避免重复
- 方便查找代码
@RequestMapping
不仅支持GET
也支持POST
也还支持PUT
、DELETE
等等都支持
除非你这么写,通过method
属性限制,才是仅支持GET
这里相当于这个注解GetMapping
@RequestMapping(value="/sayhi",method = RequestMethod.GET)
public String sayHi(){
return "hi,world";
}
@GetMapping("/saybye")
public String sayBye(){
return "bye,world";
}
注意:这里如果写了
method
前面就一定要写value
,不然就报错了
@RestController
的作用是什么?⼀个项⽬中, 会有很多类, 每个类可能有很多的⽅法, Spring程序怎么知道要执⾏哪个⽅法呢?
Spring会对所有的类进⾏扫描, 如果类加了注解
@RestController
, Spring才会去看这个类⾥⾯的⽅法有没有加@RequestMapping
这个注解, 当然他的作⽤不⽌这⼀点, 咱们先⽤, 后⾯再详细讲。如果不用,当你输入
http://127.0.0.1:8080/sayhi
的时候,程序就会报404,找不到该页面