SpringMVC
首先给一个在找学习资料的时候看到的一个大佬的博客,写的让人看着很舒服
先贴出来:www.cnblogs.com/tanghaorong…
后续有其他引用较多的地方就贴在后面
概念
常见的一个解释:SpringMVC是基于MVC模式Java实现的请求驱动?的轻量级Web框架。
个人的一个理解,Spring是简化Java业务代码开发的一个框架,SpringMVC是简化Java项目中处理Http请求的框架(这里我理解的比较短浅,应该也能处理其他请求)。
MVC模式
MVC模式是一种针对于软件开发框架的思想,不是什么具体的框架或代码实现。将软件系统中的业务逻辑、数据处理、页面显示三部分抽取为三个相对独立的、解耦合的模块。MVC中三个模块如下:
MVC的优点:
- 解耦合:只用关心本层的代码,只要保证输入输出不变,Controller就不用管其他两层。
- 重用性高:一份相同的业务逻辑代码返回的数据,页面的展示可以是不同的等等。
- 可维护性高:各个模块可以独立修改,维护时牵扯的面就少了很多。
SpringMVC的执行流程/请求处理的流程
这里给出一个经典的图形,最开始的出处就不知道了
那么配套这个经典图形所展示的流程,有11点流程介绍:
由上图中的执行流程不难看到SpringMVC中有几个核心的组件:
流程中的7~10步,由SpringMVC框架来解析和返回视图对象,我想现在应该是用的不多。现在大一点的项目都是前后端分离的,前端视图有专门的页面和开发框架,最常用的两种应该是React和Vue。所以现在SpringMVC只要得到需要返回的数据,以Json格式的字符串返回给前端,或者音视频图像数据以流的形式返回给前端,应该就可以了。
SpringMVC在开发中的使用
SpringMVC中的注解
- @Controller:控制器的注解,可以用@RestController代替
- @RestController:
- 控制器是单例模式的,单例模式在多线程并发访问(写操作)时有线程安全问题。解决方案是在控制器里面不能写可变状态量,如果需要使用这些可变状态,可以使用ThreadLocal机制解决,为每个线程单独生成一份变量副本,独立操作,互不影响。
- @RequestMapping:属性有value、method、params、headers、consumes、produces
- @GetMapping:属性有value、required、defaultValue
- @PostMapping
- @RequestBody
- @RequestParam
- @PathVariable
- @Validated
- @Valid
- @ResponseBody
- 表示该方法的返回值不管是什么类型,都会返回JSON格式的数据,比如Object、List等特殊对象。
- 加入@ResponseBody注解就能返回JSON格式数据的原因是:SpringMVC提供的HttpMessageConverter自动转为JSON ,如果使用了Jackson或者Gson,不需要额外配置就可以自动返回JSON了,因为框架帮我们提供了对应的HttpMessageConverter ,如果使用了Alibaba的Fastjson的话,则需要自己手动提供一个相应的 HttpMessageConverter的实例。
- @ControllerAdvice
- @ExceptionHandler
Servlet与Session
session与cookie:www.cnblogs.com/ityouknow/p…
SpringMVC提供对cookie-session机制的支持:
(1)基于HttpSession的支持:blog.csdn.net/qq_34292044…
Config与Interceptor
转发与重定向
转发在返回值前加forward,重定向在返回值前加redirect。
return "forward:tologin"; 与 return "redirect:tologin";
转发与重定向的区别
其他问题
SpringMVC优点
SpringMVC的四种返回值类型
- ModelAndView:视图和数据合并在一起
- void
- Sring
- JSON