一、什么是Spring MVC
在spring官网的定义中,spring MVC的描述是:
Spring web mvc是基于Servlet API的原始web框架,从一开始就包含在 Spring web框架中。
总结:
- Spring MVC是一个web框架。
- Spring MVC基于servlet。
二、什么是MVC
MVC(model,view,controller)是一种应用程序设计模式,包含了model,view,controller三个模块。
- model:用来处理应用程序数据逻辑的部分,通常负责数据库操作。
- view:用来处理数据显示的部分,
- controller:用来处理用户交互的部分,通常控制器负责从视图读取数据,控制用户输入。
Spring MVC就是对MVC的一种实现,但是MVC的view模块已经过时了,现在流行的前后端分离,后端只负责返回数据格式,不再去渲染页面。view让前后端有耦合了。
三、如何使用Spring MVC
因为Spring MVC是一个web框架,所以它的主要功能还是和前端进行交互。现在将与前端交互分为四个阶段来介绍Spring MVC的使用,四个阶段为:创建项目,建立连接,获取参数,返回响应。
- 创建项目
要使用Spring MVC首先肯定是要先创建一个引入了Spring MVC依赖的项目。创建方法有两个:- 创建一个maven项目,然后手动添加Spring MVC依赖。
- 创建一个Spring Boot项目,然后直接选择Spring web依赖添加,自动添加依赖。
由于Spring MVC的依赖很多,所以手动添加的门槛很高,必须要记得所有的依赖名称,以及相互之间的版本适配。
而使用 Spring Boot自动添加,就只需要选中 Spring web框架添加可以自动添加依赖了。这也体现了Spring Boot框架快速集成多个框架的优点。
Spring Boot添加web框架。
-
建立连接
创建好Spring MVC项目的并建立连接的基础就是,要在前端发送请求时有对应的响应类。创建响应类要有两个注解:
- 类注解(一般是Controller),要将这个类的对象托管给Spring 容器,这样才能在有访问请求的时候迅速做出响应。
- @RequestMapping,路由注解,指定当前类或者方法的路径,与前端请求建立连接。
配置好RequestMapping之后,就能通过RequestMapping中的参数作为url中路径来访问服务器了。 - @RequestMapping还能设置method参数去设置http请求的哪些method能访问到当前响应方法。默认不设置时,代表了所有的method都能访问到当前的响应方法。
设置method属性就要将路径的value也显示的指定了。并且method属性只能设置几个特定的方法值,这几个值在RequestMethod这个枚举中,可以直接调用。
下方就设置了这个路由只能是get方法才能访问到。
通过查看@RequestMapping源码
可以发现method属性的接受对象也是一个枚举,所以可以指定多个能查询的方法。
- 指定方法的路由注解
除了上面的设置参数来指定可以访问的方法之外,用@PostMapping,@GetMapping,@DeleteMapping等路由注解指定路由地址,这些路由注解指定了对应的方法。
-
接收参数
-
URL中的key=value传递参数,后端接收前端发送的参数只能通过在响应类的响应方法中设置合适的参数来接受。
-
单个参数,url中只有一个键值对,并且参数名键值对的键值一一对应。
-
单个对象,url中有多个键值对,并且这些键值对同属于一个对象,后端自定义一个类,这个类的属性和属性名和前端发送的键值对参数一一对应。
-
多个参数,url中有多个键值对,但是这些键值对不同属一个对象,后端响应方法就设置多个参数,保证参数名一一对应。
建议:接收参数的类型都用包装类,不要用基本参数类型,比如整数就用Integer不用int,因为如果http中没传参数时,integer就会默认初始化成null,但是int类型直接就是一个报错
-
-
参数的重命名
当前端传递的参数和后端接收的参数名不匹配的时候,就需要在后端使用@RequestParam中的value来重命名参数。
@RequestParam有两个特点:
- 重命名之后,只能使用重命名的名字传参,不能使用原名
- 默认情况下,重命名的参数是必须传的,如果不传直接就是报错。
可以通过设置@RequestParam的required参数设置是否必须传,默认required为true。
-
body部分的json格式传参
json格式的参数虽然也是一个对象,但是不能再单单使用对象参数在方法中接受参数了,还需要在参数前面加上@RequestBody注解
可以看出,使用了@RequestBody注解的Student参数从body中正确的获得了json对象,并且可以再后面跟上一个参数来获取url中传递的键值对参数。
- 使用url路径来传参
使用url路径传参有两个步骤:
1.将RequestMapping中的路径参数中的参数用{}包起来,路径名就是参数名
2.接收路径名参数的方法参数要用@PathVariable修饰,表示接受的参数是路径参数。@PathVariable修饰的参数也可以通过name进行重命名并且参数也是必传。
URL传参有两个优点
- 因为这个参数是在路径里面的,所以在搜索引擎的抓取效率会更高,如果传递的参数是一个可能会被搜索的关键词,建议用这种方式传递
- url传参没有?key=value这一套,更加的简洁
-
接收文件参数
前端传文件也是通过键值对的方式传递,所以后端还是要先根据key值获取文件。
获取文件参数的方法的接受参数必须是MultipartFile类对象,并且要用@RequestPart注解去命名这个对象。
接收到文件参数之后还要几个步骤才能将文件保存到本地。
- 在本地创建一个文件。这个文件的名字必须唯一,且后缀名要和前端传的文件一致。
名字唯一可以通过UUID对象的randomUUID方法获取一个当前时间戳唯一的名称,后缀名可以通过MultipartFile对象的getOriginFilename参数去获取到源文件的名称,然后通过截取字符串获取到源文件的后缀。 - 将前端传来的文件数据写入创建的文件中。
使用MultipartFile类对象的transferTo方法将文件的数据传送给新创建的File对象newFile。
-
获取Cookie,@CookieValue
@CookieValue修饰的默认必须传
-
获取header,@RequestHeader("header键值")
-
设置session和获取session
- 设置session时,没有注解可以使用,还是和servlet时创建session的方法一样,获取Request,然后调用getsession方法,将sessionid以cookie的形式返回。
- 获取session时可以使用注解了,准确的说,是获取httpSession中的某个Attritubute键值对,这个注解为@SessionAttribute(Attribute的键值),这个注解修饰的对象就是返回的键值对中的值
-
获取一个静态页面
- 返回一个静态页面,直接返回/+这个静态页面的名称的字符串就可以
必须要加/,不加/就是代表这个index.html是在当前目录下找的,但是静态也面都是在根目录static下的,根目录static在url直接访问静态页面时,直接使用域名:port/ 就代表访问的static目录了
- 返回一个静态页面,直接返回/+这个静态页面的名称的字符串就可以
-
四、请求重定向和请求转发
请求转发其实就是上面访问静态页面的方式,上面返回的字符串前面少了forward:,请求重定向就是redirect:路径,默认省略前面的直接输路径就是请求转发。
请求转发:就是服务器端直接就将对应的页面返回给浏览器了。
请求重定向:将对应的资源的url返回给浏览器,浏览器改变访问的url,再发一个http请求才获取到这个资源。
注解总结:
@RequestMapping,@PostMapping等:路由注解
@RequestBody:修饰方法参数的对象类型.表示接受的json格式的对象。
@RequestParam:修饰方法参数的别名,默认为必须传参。
@RequestPart:修饰文件参数MultipartFile对象,给对象命名。
@CookieValue:修饰方法参数,表示接收的cookie。
@RequestHeader:修饰方法参数,表示接收的是Header