1. MVC
MVC 是 Model View Controller 的缩写,它是软件⼯程中的⼀种软件架构设计模式,它把软件系统分为模型、视图和控制器三个基本部分。
View (视图): 指在应⽤程序中专⻔⽤来与浏览器进⾏交互,展⽰数据的资源.
Model (模型): 是应⽤程序的主体部分,⽤来处理程序中数据逻辑的部分.
Controller(控制器):可以理解为⼀个分发器,⽤来决定对于视图发来的请求,需要⽤哪⼀个模型来处理,以及处理完后需要跳回到哪⼀个视图。即⽤来连接视图和模型。
2. Spring MVC
Spring MVC 是对 MVC 思想的具体实现,此外 Spring MVC 还是一个 web 框架,所以说 Spring MVC 是一个实现了 MVC 模式的 web 框架
3. 项目创建
Spring MVC 项目的创建和上次的 Spring Boot 项目的步骤一样
3.1. 建立连接
在 Spring MVC 中使用 @RequestMapping
来实现 URL 路由的映射,也就是浏览器链接程序的作用
@RequestMapping
是用来注册接口的路由映射的,表示服务器收到请求时,映射的“/hello”路径就会调用 hello 的方法,路径的名称也可以随便写,不用和方法名保持一致
public class HelloController { "/hello") ( public String hello(){ return "hello spring"; } }
运行程序之后,然后在浏览器中输入 http://127.0.0.1:8080/hello 就能访问了
@RestController
标识了这是一个控制器类,一个项目中会有很多类和方法,Spring 会对所有的类进行扫描,如果添加了 @RestController
注解,才会去访问这个类中有没有 @RequestMapping
注解,如果把 @RestController
去掉再访问就会访问不到这个路径
@RequestMapping
既可以修饰类,也可以修饰方法,当修饰类和方法时,访问的路径是类路径 + 方法路径,如果不加类路径还是会找不到页面
@RequestMapping 标识⼀个类:设置映射请求的请求路径的初始信息。
@RequestMapping 标识⼀个⽅法:设置映射请求请求路径的具体信息。
"/user") ( public class HelloController { "/hello") ( public String hello(){ return "hello spring"; } }
3.2. 请求
@RequestMapping
同时支持 post 请求和 get 请求
"/v1") (public String method(){ return "v1"; }
使用 postman 发送 get 请求和 post 请求都可以得到响应
可以通过设置来只支持 get 请求或者使用 @GetMapping
来限制只支持 get 请求
value = "/v2",method = RequestMethod.GET) (public String method1(){ return "v2"; } "/v3") (public String method2(){ return "v3"; }
无论是 v2 还是 v3 都已经不支持 post 请求了
同理,如果设置为只支持 post 请求或者使用 @PostMapping
就不会支持 get 请求了
value = "/v4",method = RequestMethod.POST) (public String method3(){ return "v4"; } "v5") (public String method4(){ return "v5"; }
在上面的方式中,无论是通过设置 @RequestMapping
的方式还是直接使用 @PostMapping
,@GetMapping
注解的方式都可以
4. 传递参数
4.1. 传递单个参数
接收单个参数,直接在方法中加入参数即可
"/param") ( public class ParamController { "/m1") ( public String method1(String name){ return "接收到参数name: " + name; } }
在传递参数的时候,代码中的参数名称需要和请求的参数名称是一致的
如果传入的参数是整形呢,整数的话是可以用 Integer 和 int 来表示的,下面来演示一下
"/m2") (public String method2(Integer age){ return "接收到参数age: " + age; } "/m3") (public String method3(int age){ return "接收到参数age: " + age; }
那么他们的区别是什么呢?
接下来试着不传参,发现 int 定义的参数是直接报错了,Integer 定义的是可以接受 null 的
并且无论是 int 还是 Integer,传入的参数一定要对应,否则也会报错