尚硅谷-SpringMVC篇

學習鏈接:https://www.bilibili.com/video/BV1Ry4y1574R?p=97&vd_source=510ec700814c4e5dc4c4fda8f06c10e8

代碼地址:https://gitee.com/empirefree/SpringBoot-summarize/tree/尚硅谷-SpringMVC篇/

csdn csdn csdn csdn csdn


🔥1. 基本概念

1.1. 基本簡介

1.1.1 MVC

​ MVC是一種軟件架構思想

1. MODEL: 模型層,用於處理數據的javaBean,分2類
 	1. 實體類bean: Student,User類
 	2. 業務處理bean: Service, dao對象
2. View: html, jsp界面
3. Controller: 控制層,Servlet,用於接收和響應瀏覽器
1.1.2 SpringMVC
1.1.2.1 基本引用

​ Spring的子項目,基於原生Servlet,通過前端控制器DispatcherServlet對請求和響應進行統一處理

        // 需要導入springmvc的包,在springboot中spring-boot-starter-web內嵌了該包。另外也需要開啓組件掃描,@ComponentScan也提供了這個功能
		<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
        </dependency>
1.1.2.2 @RequestMapping
  1. value:定義路徑
  2. method: 默認支持get,post。定義請求方式

@GetMapping, @PostMapping, @PutMapping, @DeleteMapping

​ 也可以採用RestFul風格,使用 header,params

注:HttpServletRequest,HttpServletResponse原生servlet能請求、響應header,body中數據,SpringMVC中也存在類似的處理方法

1.1.2.3 請求參數
    /**
     * 跨域:瀏覽器不能攜帶http://域名:端口 這種其他域名下的cookie,ajax請求
     * 解決辦法:前後端都需要配置,後端配置CORS,就是前端攜帶上Access-Control-Allow-Origin
     *
     * CSRF攻擊:利用用戶之前登錄過網站的cookie。可以利用每次攜帶上token解決
     *
     */
@RequestParam(required = false, value = "12", defaultValue = "123")String id,
@RequestHeader(required = false, value = "13", defaultValue = "333")String name,
@CookieValue("JSESSIONID")String jessionid
1.1.3 RestFul

Rest: Representational state transfer。客戶端和服務端之間資源傳輸

1.1.4 HttpMessageConverter

​ 報文信息轉換器:請求報文和java對象的互相轉換

@RequestBody, RequestEntity, @ResponseBody @RestController ResponseEntity

1.1.4.1 @RequestBody

獲取請求體中入參。

1.1.4.2 RequestEntity

​ 可以獲取請求體和請求頭

1.1.4.3 @ResponseBody
1. 當修飾方法的時候表示返回是個數據success,沒有修飾方法的時候表示跳轉success界面,然後@RestController內置@ResponseBody,所以Controller層默認都是返回success。
2. SpringBoot-starter內置jackson包,所以不需要擔心json轉換問題
    @RequestMapping(
            value = {"/requestEntityTest", "/flatUser2"},
            method = {RequestMethod.GET, RequestMethod.POST}
    )
    public String requestEntityTest(RequestEntity<String> 
        return "success";
    }
1.1.4.4 @RestController

​ @Controller和@ResponseBody,簡化數據傳輸

1.1.4.5 ResponseEntity

實現下載功能,SpringMVC下載需要multipartResolver的bean文件上傳解析器,SpringBoot中MultipartAutoConfiguration配置引入了

1.1.5 攔截器
1.1.5.1 基本概念

原始過濾器:

​ 請求-> 過濾器-> 前端控制器DispatcherServlet-> controller層

攔截器:

​ 攔截器是用來攔截控制器方法的

多個攔截器就按照Bean注入順序:preHnadle順序,postHandle,AfterCompletion是逆序

1. prehandle在controller執行方法之前。
2. postHandle在controller執行方法之後
1. afterCompletion在ModelAndView渲染視圖完畢之後執行
1.1.6 異常處理器
1.1.6.1 基本概念

SpringMVC提供異常處理接口:HandlerExceptionResolver,該接口實現類如下

1. SimpleMappingExceptionResolver
1. DefaultHandlerExceptionResolver(默認)

就是@ControllerAdvice+ @ExceptionHandler實現

1.1.7 註解代替Web.xml

​ 1. Servlet3.0之後定義一個類實現抽象初始化方法就能代替web.xml(webInit),SpringBoot中已有

​ 2. 自定義配置類實現WebMvcConfigurer接口來實現各個功能(配置類,實現類)


1.2 執行流程

1.2.1 基本概念
1.2.1.1 基本組件
  1. DispatcherServlet: 前端控制器,統一處理請求和響應
  2. HandlerMapping:根據url,method找到handler
  3. Handler:就是Controller層
  4. HandlerAdapter:處理器適配器,上面handlerMapping找到後由HandlerAdapter來執行
  5. ViewResolver:視圖解析器,視圖解析成Thymeleaf
  6. View:就是展示視圖,返回前端代碼
1.2.1.2 DispatcherServlet初始化、服務、調用源碼(略)

​ 本質就是一個Servlet

1.2.1.3 SpringMVC執行流程
  1. 由DispatcherServlet接受用戶請求,查看URL是否存在

    1. 若不存在,則判斷是否有默認Servlet來請求靜態配置資源(就是看正常url找不到就看是不是訪問的靜態資源)
    <mvc:default-servlet-handler/>
    --SpringBoot中整合成了spring.mvc.static-path-pattern,也可以在配置類中注入bean實現
    
    1. 若配置了,就找,沒配置,返回前端控制器的404
    
  2. 若URL存在,先調用HnadlerMapping找到Handler和Handler攔截器,以HandlerExecution執行鏈對象返回

  3. 然後DisPatcherServlet找到合適的HandlerAdapter,先執行preHandle,再執行Controller方法

  4. Handler執行完成後,向DispatcherServlet返回ModelAndView對象

  5. 然後HttpmessageConveter進行數據格式返回,執行PostHandle對象,判斷是否有異常,執行HandlerException

  6. 渲染完畢後執行攔截器的afterCompletion方法

1.3 個人總結

image-20220731121747821

Spring主要是生成對象、自定義切面、然後自定義配置類(需要開啓組件掃描,配置AOP等切面包)
SpringMVC主要是控制web請求響應,定義攔截器之類(也需要開啓mvc功能)
Mybatis主要是和數據庫的交互(需要配置mybatis-starter啓動器)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章