SpringMVC学习之基础

108 阅读3分钟

SpringMVC

首先给一个在找学习资料的时候看到的一个大佬的博客,写的让人看着很舒服

先贴出来:www.cnblogs.com/tanghaorong…

后续有其他引用较多的地方就贴在后面

概念

常见的一个解释:SpringMVC是基于MVC模式Java实现的请求驱动?的轻量级Web框架。

个人的一个理解,Spring是简化Java业务代码开发的一个框架,SpringMVC是简化Java项目中处理Http请求的框架(这里我理解的比较短浅,应该也能处理其他请求)。

MVC模式

MVC模式是一种针对于软件开发框架的思想,不是什么具体的框架或代码实现。将软件系统中的业务逻辑、数据处理、页面显示三部分抽取为三个相对独立的、解耦合的模块。MVC中三个模块如下:

image.png

MVC的优点:

  • 解耦合:只用关心本层的代码,只要保证输入输出不变,Controller就不用管其他两层。
  • 重用性高:一份相同的业务逻辑代码返回的数据,页面的展示可以是不同的等等。
  • 可维护性高:各个模块可以独立修改,维护时牵扯的面就少了很多。

SpringMVC的执行流程/请求处理的流程

这里给出一个经典的图形,最开始的出处就不知道了

image.png

那么配套这个经典图形所展示的流程,有11点流程介绍:

image.png

由上图中的执行流程不难看到SpringMVC中有几个核心的组件:

image.png

流程中的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

www.cnblogs.com/tanghaorong…

转发与重定向

转发在返回值前加forward,重定向在返回值前加redirect。

return "forward:tologin"; 与 return "redirect:tologin";

转发与重定向的区别

image.png

其他问题

SpringMVC优点

image.png

SpringMVC的四种返回值类型

  • ModelAndView:视图和数据合并在一起
  • void
  • Sring
  • JSON

SpringMVC和Structs2的区别

image.png