一.啥么是Spring Web MVC
Spring MVC是基于Servle API创建的原始的web框架,从一开始就包含在Spring框架中.它的正式名称为"Spring web MVC",但它通常被常委"Sping MVC"
什么是Servlet?
Servlet是一中实现动态页面的技术。准确的来说Servlet是一套Java Web来发的规范,或者说是一套Java Web开发的技术标准。只是规范并不能任何事情,必须要有人去实现它。所谓实现Servlet规范,就是真正编写代码去实现Servlet规范提到的各种功能,包括类,方法,属性等。
Servlet规范的产品包括Tomcau,Weblogic,Jetty,Jboss,WebSphere等,ta们都被称为"Servlet容器".Servlet容器用来管理程序员编写的Servlet类。
从上述定义我们可以得到一个信息: Spring Web MVC是一个Web框架。
二.MVC定义
MVC是 Model View Controller 的缩写,它是软件工程中的一种软件架构设计模式,它把软件系统分为模型,视图和控制器三个部分。

- **View(视图)**指在应用程序中专门用来与浏览器进行交互,展示数据的资源
- **Model(模型)**是应用程序的主体部分,用来处理程序中数据逻辑的部分
- **Controller(控制器)**可以理解为一个分发器,用来决定对试图发来的请求,需要用哪一个模型来处理,以及处理完成后需要跳回到哪一个始于。即用来连接视图和模型
三.什么是Spring MVC?
MVC是一种框架设计模式,也是一种设计思想,而Spring MVC是对MVC思想的具体实现.除此之外,Spring MVC还是一个Web框架.
总结来说,Spring MVC是一个实现了MVC模式的Web框架.

四.Spring MVC学习
学习Sping MVC,重点就是学习如何通过浏览器和用户程序进行交互的。
主要分为以下三个方面:
- 建立连接: 将用户(浏览器)和Java程序连接起来,也就是访问一个地址可以调用到我们的Spring程序.
- **请求:**用户请求的时候会带来一些参数,在程序中要想办法获取这些参数,所以请求这块主要是获取参数的功能。
- **响应:**执行了业务逻辑之后,要把程序执行的结果返回给用户
小提示:
url是Uniform Resource Locator(统一资源定位符) ,简单理解就是网页地址,也就是浏览器地址。
例如:
|-----------------------|
| https://www.baidu.com |这就是一个URL。
一个完整的URL一般由及部分组成:
|---------------------|
| 协议://域名:端口/路径?参数#锚点 |例如:
|---------------------------------------------------------------------------------------------------------------------------------------------|
| https://www.example.com:8080/user?id=123#top |拆开:
|----------------------|----|-----------|
| 部分 | 含义 | 示例 |
| https | 协议 | 使用https通信 |
| www.example.com:8080 | 域名 | 网站地址 |
| 8080 | 端口 | 服务器端口 |
| /user | 路径 | 访问哪个资源 |
| ?id=123 | 参数 | 给服务器传数据 |
| #top | 锚点 | 页面位置 |
五.建立连接
在Spring MVC中使用 @RequestMapping 来实现URL路由映射,也就是浏览器连接程序的作用。
@RequestMapping使用
@RequestMapping 即可以修饰类,也可以修饰方法,当修饰类和方法时,访问的地址是类路径+方法路径
简单使用:
java
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/hello")
public class HelloContorller {
@RequestMapping("/r1")
public String r1(){
return "hello Spring r1~";
}
}

注意:
@RequestingMapping的URL路径前面加不加/都可以,Spring程序启动时,会进行判断,如果前面没有/,Spring会拼接上一个/

java
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("hello")
public class HelloContorller {
@RequestMapping("/r1")
public String r1(){
return "hello Spring r1~";
}
@RequestMapping("r2")
public String r2(){
return "hello Spring r2";
}
}
@RequestMapping的URL路径也是可以多层路径,最终访问时,依旧是类名+方法名。

java
@RequestMapping("/r3/r4")
public String r3(){
return "hello Spring r3";
}
注意:
第一个/可以省略,第二个/不可以省略
第一个/省略
java
@RequestMapping("r3/r4")
public String r3(){
return "hello Spring r3";
}

第二个/省略

java
@RequestMapping("r3r4")
public String r3(){
return "hello Spring r3";
}
@ResquestMapping是GET还是POST请求?
用浏览器访问默认是GET请求

通过这个例子可以看出来@RequestMapping支持PoST请求

注意:
RequestMapping 不可以使用同一个名字,因为这样不知道请求哪个方法。
java
@RequestMapping("/r5")
public String r5(){
return "hello Spring r5";
}
@RequestMapping("/r5")
public String r6(){
return "hello Spring r5";
}
Caused by: java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'helloContorller' method
com.bit.springbootcsdndemofirst.HelloContorller#r6()
to { /hello/r5}: There is already 'helloContorller' bean method
com.bit.springbootcsdndemofirst.HelloContorller#r5() mapped.
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping$MappingRegistry.validateMethodMapping(AbstractHandlerMethodMapping.java:646) ~spring-webmvc-7.0.8.jar:7.0.8
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping$MappingRegistry.register(AbstractHandlerMethodMapping.java:606) ~spring-webmvc-7.0.8.jar:7.0.8
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.registerHandlerMethod(AbstractHandlerMethodMapping.java:327) ~spring-webmvc-7.0.8.jar:7.0.8
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.registerHandlerMethod(RequestMappingHandlerMapping.java:459) ~spring-webmvc-7.0.8.jar:7.0.8
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.registerHandlerMethod(RequestMappingHandlerMapping.java:80) ~spring-webmvc-7.0.8.jar:7.0.8
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lambdadetectHandlerMethods1(AbstractHandlerMethodMapping.java:294) ~spring-webmvc-7.0.8.jar:7.0.8
at java.base/java.util.LinkedHashMap.forEach(LinkedHashMap.java:721) ~na:na
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.detectHandlerMethods(AbstractHandlerMethodMapping.java:292) ~spring-webmvc-7.0.8.jar:7.0.8
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.processCandidateBean(AbstractHandlerMethodMapping.java:261) ~spring-webmvc-7.0.8.jar:7.0.8
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.initHandlerMethods(AbstractHandlerMethodMapping.java:220) ~spring-webmvc-7.0.8.jar:7.0.8
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.afterPropertiesSet(AbstractHandlerMethodMapping.java:208) ~spring-webmvc-7.0.8.jar:7.0.8
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.afterPropertiesSet(RequestMappingHandlerMapping.java:158) ~spring-webmvc-7.0.8.jar:7.0.8
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1862) ~spring-beans-7.0.8.jar:7.0.8
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1811) ~spring-beans-7.0.8.jar:7.0.8
... 18 common frames omitted
通过以上的例子可以说明@RequestMapping即支持GET请求有支持POST请求。
那么是否可以让@RequestMapping只支持GET 或 POST请求呢?
只支持GET请求
java
@RequestMapping(value = "/r5",method = RequestMethod.GET)
public String r5(){
return "hello Spring r5";
}

只支持POST请求

java
@RequestMapping(value = "/r6",method = RequestMethod.POST)
public String r6(){
return "hello Spring r6";
}
注意:@RequsetMapping不同类型的请求@RequetMapping中的value值可以重复.

@GetMapping("/r5")<=> @RequestMapping(value = "/r5",method = RequestMethod.GET)
@PostMapping("/r5")<=>@RequestMapping(value = "/r5",method = RequestMethod.POST)
六:传参介绍
1.普通传参,也就是通过查询字符串来传参
URL的格式如下:


其中,查询字符串就是请求的参数
2.form-data

3.x-www-form-urlencoded

4.raw

七.请求
++传参数的时候传参数的名字必须要和接受参数的名字要相同++
1.传一个参数
java
@PostMapping("/r7")
public String r7(String name){
return "得到的参数是:"+name;
}

2.传多个参数
java
@PostMapping("/r11")
public String r11(String name,String password){
return "得到的参数 name :"+name+" password: "+password;
}

3.传对象
java
public class Person {
private String name;
private String password;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", password='" + password + '\'' +
", age=" + age +
'}';
}
}
java
@PostMapping("/r14")
public String r14(Person person){
return "得到的参数是 Person:" +
person+
" person.name " +person.getName()+
" person.age "+person.getAge()+
" person.password "+person.getPassword();
}

4.传数组
java
@PostMapping("/r15")
public String r15(String[] names){
return "得到的参数是:"+ Arrays.toString(names);
}

5.传递集合
java
@PostMapping("/r16")
public String r16(@RequestParam List<Integer> nums){
return "得到的参数是 nums : "+nums;
}

@RequestParam主要用于接收:
- String
- Integer
- Double
- 简单类型
- 数组/List参数