什么是Spring Web MVC?
定义:Spring Web MVC是基于Servlet构建的原始Web框架,从一开始就包含在Spring框架中.它的正式名称"Spring Web MVC"来自其源模块的名称(Spring-webmvc),但是它通常被称为"Spring MVC".
什么是Servlet?
Servlet是一种实现动态页面的技术.准确地来讲Servlet是一套Java Web开发的规范,或者是一套Java Web开发的技术标准.只有规范并不能做任何事情,必须要有人来实现它.所谓实现Servlet规范,就是真正编写代码去实现Servlet规范提到的各种功能,包括类,方法,属性等.
从定义中可以得到一个关键信息: Spring Web MVC是一个Web框架. 之后我们简称为:Spring MVC
然而想真正搞清楚什么是Spring MVC, 我们首先要搞懂MVC是什么.
MVC定义
MVC是Model View Controller的缩写,它是软件工程中的一种软件架构设计模式,它把软件系统分为模型,视图和控制器三个基本部分.
View(视图):指在应用程序中专门与浏览器进行交互,展示数据的资源.
Model(模型):是应用程序中的主体部分,用来处理程序中数据逻辑的部分.
Controller(控制器): 可以理解为一个分发器,用来决定对于视图发来的请求,需要用哪一个模型来处理, 以及处理完后需要跳回到哪个视图.即用来连接视图和模型.
比如去饭店吃饭
客户进店之后,服务员来接待客户点餐,客户点完餐之后,把客户菜单交给前厅.前厅根据客户菜单给后厨下达命令.后厨负责做饭,做完之后,再根据菜单告诉服务员,这是X号餐桌客人的饭.
在这个过程中
服务员就是View(视图),负责接待客户,帮助客户点餐,以及给顾客端饭.
前厅就是Controller(控制器),根据用户的点餐情况,来选择给哪个后厨下达命令.
后厨就是Model(模型),根据前厅的要求来完成客户的用餐需求.
什么是Spring MVC
MVC是一种架构设计模式,也是一种思想,而Spring MVC是对MVC思想的具体实现.除此之外,Spring MVC还是一个Web框架.
总结来说, Spring MVC是一个实现了Web模式的MVC框架.
所以Spring MVC主要的关注有两个点: 1.MVC; 2.Web框架.
Spring boot和Spring MVC之间的关系:
Spring Boot是实现Spring MVC的一种方式.
Spring Boot可以添加很多依赖,借助这些依赖实现不同的功能.Spring Boot通过添加Spring Web MVC框架,来实现Web功能.
比如:厨房可以用来做饭,但真实实现做饭功能的是火及各种做饭的相关食材和工具.
厨房就好比Spring Boot,厨房可以装柜子,实现收纳功能,装燃气灶等,实现做饭功能.
做饭这个事,就是MVC,在几千年前,有火有食材就可以做饭.
不过Spring在实现MVC时,也结合自身项目的特点,做了一点改变,相对而言,使用这个图更合适:
不过核心没有变
比如上面的例子中,去饭店吃饭.一些饭店是前厅负责接待客户,帮助客户点餐,也就是Controller来负责接收用户的请求.
学习Spring MVC
既然是Web框架,那么当在浏览器中输入url之后,我们的Spring MVC就可以感知到用户的请求,并给予响应.(我们学习Spring MVC,重点也就是学习如何通过浏览器和用户程序进行交互).
主要分以下几个方面:
1.建立连接:将用户(浏览器)和Java程序连接起来,也就是访问一个地址能够调用到我们的Spring程序.
2.请求:用户请求的时候会带一些参数,在程序中要想办法获取到参数,所以请求这块主要是获取到参数的功能.
3.响应:执行业务逻辑之后,要把程序执行的结果返回给用户,也就是响应.
比如用户去银行存款
1.建立连接:去柜台
2.请求:带着银行卡,身份证去存款.
3.响应:银行返回一张存折.
对于Spring MVC来说,掌握了以上三个功能就相当于掌握了Spring MVC.
建立连接
在Spring MVC中使用@RequestMapping 来实现URL路由映射,也就是浏览器连接程序的作用.
创建一个UserController类,实现用户通过浏览器和程序的交互,具体实现的代码如下:
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
//路由器规则注册
@RequestMapping("/sayHi")
public String sayHi() {
return "hello, Spring MVC";
}
}
方法名和路径名称无需一致.
接下来访问:http://127.0.0.1:8080/sayHi,就可以看到程序返回的程序了.
@RequestMapping注解介绍
@RequestMapping是SpringMapping 是Spring Web MVC应用程序中最常被用到的注解之一,它是用来注册接口的路由映射的.
表示服务收到请求时,路径为/sayHi的请求就会调用sayHi这个方法的代码.
路由映射:当用户访问一个URL时,将用户的请求对应到应用程序中某个类的某个方法的过程就叫做路由映射.
既然@RequestMapping已经可以达到我们的目的了,我们为什么还要加@RestController呢?
我们把@RestController去掉,再来访问一次:
可以看到,程序报了404,找不到页面.
这就是@RestController起到的作用
一个项目中,会有很多类,每个类可能有很多的方法,Spring程序怎么知道要执行哪个方法呢?
Spring会对所有的类进行扫描,如果类加了注解@RestController, Spring才会去看这个类里面的方法有没有加@RequestMapping这个注解,当然它的作用不止这一点,咱们先用.
@RequestMapping使用
@RequestMapping即可修饰类,也可以修饰方法,当修饰类和方法时,访问的地址是类路径 + 方法路径.
@RequestMapping标识一个类:设置映射请求的请求路径的初始信息.
@RequestMapping标识一个方法:设置映射请求路径的具体信息.
@RequestMapping("/user")
@RequestController
public class UserController {
@RequestMapping("/sayHi")
public String sayHi() {
return "Hello, Spring MVC";
}
}
访问地址:http://127.0.0.1:8080/user/sayHI
注意:@RequestMapping的URL路径最前面加不加 / (斜杠)都可以,Spring程序启动时,会进行判断,如果前面没有加 / , Spring就会加上一个 / .
访问之后仍然是可以正常响应的. (通常情况下,我们都会加上 / )
@RequestMapping的路径也可以是多层路径,最终访问时,依然是类路径 + 方法路径.
@RequestMapping("/user/m1")
@RequestController
public class UserController {
@RequestMapping("/say/hi")
public String sayHi() {
return "Hello, Spring MVC";
}
}
访问路径:http://127.0.0.1:8080/user/m1/say/hi
@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="/request/hello" method="post">
<input type="submit" value="发送请求">
</form>
</body>
</html>
访问方式为http://127.0.0.1:8080/test.html
从运行结果可以看出:@RequestMapping既支持Get请求,又支持Post请求.同理,也支持其它的请求方式.