Spring 03 Web springMVC

Springboot 常用 Spring MVC 實現 web 服務。

Spring MVC 請求處理流程

《Spring 實戰第四版》
圖片來自《Spring 實戰第四版》

瀏覽器請求首先被交給 DispatcherServlet 前端控制器。
DispatcherServlet 查詢處理器映射以決定將請求發送給哪個控制器。控制器處理業務邏輯后,向 DispatcherServlet 返回處理結果(被稱為模型)和邏輯視圖名。DispatcherServlet 使用視圖解析器為邏輯視圖名匹配特定視圖。最后視圖渲染結果,交給響應對象返回瀏覽器。

MVC 啟動

Springboot 啟動 Spring MVC 時,動態加載\org\springframework\web\servlet\DispatcherServlet.properties文件定義的組件。

控制器

@Controller 注解定義控制器。它與 @Component 注解功能相同,因此Spring 會創建 MyController bean。
@RequestMapping 注解定義請求路徑(value 屬性)和控制器方法(hello())的映射關系。映射關系被存儲到HandlerMapping(處理器映射)對象。DispatcherServlet 將請求發送給處理器映射,處理器映射返回的不是 Controller,而是 HandlerExecutionChain 對象。

@Controller
public class MyController {@RequestMapping(value = "/", method=GET)public String hello() {return "hello";}
}

HandlerExecutionChain 對象包含處理器 handler 和攔截器 interceptorList 。處理器是對控制器 controller 的封裝。攔截器增強處理器功能。

public class HandlerExecutionChain {private final Object handler;private final List<HandlerInterceptor> interceptorList = new ArrayList<>();

HandlerAdapter 實現類執行 HandlerExecutionChain 對象的內容。即執行控制器并返回結果。
控制器返回的結果被稱為模型。視圖解析器根據邏輯視圖名稱定位視圖,視圖渲染模型給響應體。前后端分離場景下一般用 json 格式響應體,此時不需要視圖解析器和視圖。

@RequestMapping

@RequestMapping 注解有主要有兩個參數,一個是路徑 value,一個是請求方法 method。它的簡化版本 @GetMapping 注解表示 get 請求類型,@PostMapping 注解表示 Post 請求類型。

獲取控制器參數

@RequestParam 注解可以定義HTTP參數和方法參數的映射關系。

@RequestMapping(value = "/param", method=GET)
public String param(@RequestParam("user") String user,@RequestParam("age") int age) {return service(user, age);
}

@RequestBody 注解可以將 json 參數轉換為對應 java 對象。

@RequestMapping(value = "/param", method=GET)
public String param(@RequestBody User user) {return service(user);
}

@PathVariable 注解可以獲取路徑參數。Restful 風格要求用路徑,而不是用參數表示資源。

@RequestMapping(value = "/param/{id}", method=GET)
public String param(@PathVariable("id") String id) {return service(id);
}

@DataTimeFormat 注解和 @NumberFormat 注解可以定義格式化參數。

自定義獲取控制器參數的規則

SpringMVC 通過 WebDataBinder 機制來獲取參數。它解析 HTTP 請求上下文,轉換參數并且提供驗證功能。轉換參數的接口有三個:Converter,Formatter 和 GenericConverter。第一個是轉換類型,第二個是轉換格式,第三個是轉換數組。
SpringMVC 將三個接口的默認實現類注冊到注冊機,這就是大部分類型轉換無需開發者開發的原因。
我們可以定義自己的轉換器,只需實現接口,SpringMVC自動注冊到注冊機。

@Component
public class MyConvrter implements Converter<String, User> {@Overridepublic User convert(String str) {...}
}

參數驗證

SpringMVC 支持參數驗證。通過 @Valid 注解啟動驗證機制,通過 @NotNull, @Max, @Range, @Email 等注解驗證字段。

用戶也可以在 WebDataBinder 注冊驗證器自定義驗證機制。

public class MyValidator implements Validator {// 指定驗證類型@Overridepublic boolean supports(Class<?> clazz) {return clazz.equals(User.class);}// 執行驗證方法@Overridepublic void validate(Object target, Errors erros) {...}
}

MyValidator 類沒有 @Component 注解。在控制器類用 @InitBinder 注解注冊驗證類。

@RequestMapping("/user")
public class UserController {@InitBinderpublic void initBinder(WebDataBinder binder) {binder.setValidator(new MyValidator()); // 綁定驗證器}@GetMapping("/validate")public Map<String, Object> validator(@Valid User user, Errors erros) {if (errors.hasErrors()) {// 沒通過驗證,返回錯誤結果}}
}

視圖

SpringMVC 視圖分為邏輯視圖和非邏輯視圖。邏輯視圖需要視圖解析器進一步定位視圖,比如 JSP。非邏輯視圖不需定位,直接渲染,比如 json。

攔截器

攔截器用于攔截處理器,增強處理器功能。preHandle 方法在處理器執行前執行,postHandle 方法在處理器執行后執行,afterCompletion 方法在處理器完成且視圖渲染后后執行。

public class MyInterceptor extends HandlerInterceptor {@Overridepublic boolean preHandle(HttpServltRequest request, HttpServletResponse response, Object handler) {...}@Overridepublic boolean postHandle(HttpServltRequest request, HttpServletResponse response, Object handler) {...}@Overridepublic boolean afterCompletion(HttpServltRequest request, HttpServletResponse response, Object handler) {...}
}

開發攔截器后需要注冊攔截器。

@Configuration
public class MyApplication implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {InterceptorRegistry ir = registry.addInterceptor(new MyInterceptor());ir.addPathPatterns("/user/*");}
}

多個攔截器按照責任鏈模式裝配。對于 preHandle 方法,先注冊先執行。對于 postHandle 和 afterCompletion 方法,先注冊后執行。如果某個攔截器的 preHandle 為 false,后續的 preHandle 和 postHandle 都不會執行。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/917722.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/917722.shtml
英文地址,請注明出處:http://en.pswp.cn/news/917722.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

大廠面試題

線程池的狀態?回答:running->shutdown->stop->tidyng->TERMINATED 線程池狀態怎么流轉2. 回答:變成shutdown&#xff0c;執行shutdown()函數變成stop&#xff0c;執行shutdownnow函數 變成tining&#xff0c;所有任務已處理完 變成TERMINATED&#xff0c;線程池調…

達芬奇31-40

快捷鍵C鼠標左鍵拖拽到節點上 A鼠標左鍵拖拽節點 復制到另一個圖層上Raw素材太哦調整為log方便調色磨皮中間調向左磨皮,向右變老找到丟失的高光磨皮后臉部高光消失,或不明顯,此時用亮度吸管工具找到臉部的高光,拉高中灰和亮部的Y值質感紋理增強器Tiny,Fine高頻細節(臉部)增強或…

dify

一、SVG Logo Design ### 任務 我希望你充當圖像生成的提示生成器。 ### 任務描述 你的工作是提供詳細且富有創意的描述&#xff0c;以激發 AI 生成獨特而有趣的圖像。請記住&#xff0c;格式應遵循以下一般模式&#xff1a; <主要主題>, <主要主題的描述>, <背…

Mysql 實戰問題處理速通

文章目錄創建賬號和授權查詢沒有主鍵的表統計每個庫大小前十張大表清理日志表Prepared statement needs to be re-preparedxtrabackup 問題鎖問題處理快速處理查詢事務等待和阻塞情況innodb_trxprocesslistdata_locksdata_lock_waitsmetadata_locksevents_statements_current其…

如何測量滾珠花鍵的旋轉方向間隙?

測量滾珠花鍵的旋轉方向間隙需要使用適當的工具&#xff0c;通常情況下&#xff0c;可以使用游標卡尺或外徑卡尺進行測量。這些工具可以準確地測量間隙的寬度和深度&#xff0c;并且可以輕松地記錄測量結果。手動檢測法&#xff1a;將滾珠花鍵固定在支架上&#xff0c;確保其可…

Android AppSearch 深度解析:現代應用搜索架構與實踐

一、AppSearch 概述1.1 什么是 AppSearchAppSearch 是 Android Jetpack 組件庫中的一個現代化本地搜索框架&#xff0c;于 Android 12 (API level 31) 引入&#xff0c;旨在為 Android 應用提供高效、可靠的本地數據索引和搜索能力。與傳統的 SQLite 搜索方案相比&#xff0c;A…

使用公眾號的消息模板給關注用戶發消息

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家&#xff0c;歷代文學網&#xff08;PC端可以訪問&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移動端可微信小程序搜索“歷代文學”&#xff09;總架構師&#xff0c;15年工作經驗&#xff0c;精通Java編…

【盤古100Pro+開發板實驗例程】FPGA學習 | 3X3圖像矩陣生成 | 圖像實驗指導手冊

本原創文章由深圳市小眼睛科技有限公司創作&#xff0c;版權歸本公司所有&#xff0c;如需轉載&#xff0c;需授權并注明出處&#xff08;www.meyesemi.com) 1. 實驗簡介 實驗目的&#xff1a; 實現 3X3 圖像矩陣對應 9 個像素點圖像數據的讀取。 實驗環境&#xff1a; Wind…

【通用視覺框架】基于OpenCvSharp+WPF+YOLO開發的仿VisionMaster的通用視覺框架軟件,全套源碼,開箱即用

【通用視覺框架】基于OpenCvSharpWPFYOLO開發的仿VisionMaster的通用視覺框架軟件&#xff0c;全套源碼&#xff0c;開箱即用 基于OpenCvSharp、WPF和YOLO的組合&#xff0c;構建一個兼具圖像處理能力、可視化交互和實時檢測的工業級視覺框架。其核心是將底層算法與上層界面無…

微信小程序轉Vue2組件智能提示詞

角色 小程序轉Vue2組件工程師&#xff08;ElementUI專精&#xff09; 核心能力 技術專長&#xff1a;作為世界頂尖前端工程師&#xff0c;專注于將小程序組件&#xff08;.wxml/.wxss/.js/.json&#xff09;精準轉換為Vue2ElementUI組件&#xff0c;轉換邏輯零偏差&#xff0c;…

JVM 學習總結

文章目錄內存結構程序計數器什么是程序計數器&#xff1f;核心作用&#xff1a;為什么需要程序計數器&#xff1f;實現原理主要特點示例&#xff1a;PC 寄存器如何工作總結Java 虛擬機棧什么是 Java 虛擬機棧&#xff1f;棧幀的內部結構主要特點總結線程診斷本地方法棧堆堆內存…

目標檢測檢出率,誤檢率,ap,map等評估python代碼

1.deepseek版本import numpy as np from collections import defaultdictdef calculate_iou(box1, box2):"""計算兩個邊界框的交并比&#xff08;IoU&#xff09;:param box1: [x1, y1, x2, y2]:param box2: [x1, y1, x2, y2]:return: IoU"""# 計…

python的高校班級管理系統

前端開發框架:vue.js 數據庫 mysql 版本不限 后端語言框架支持&#xff1a; 1 java(SSM/springboot)-idea/eclipse 2.NodejsVue.js -vscode 3.python(flask/django)–pycharm/vscode 4.php(thinkphp/laravel)-hbuilderx 數據庫工具&#xff1a;Navicat/SQLyog等都可以 在高校教…

Scrapy 工作流程深度解析:引擎驅動的完美協作

一、Scrapy 核心組件全景圖 #mermaid-svg-KWCKN9n4urijbSws {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-KWCKN9n4urijbSws .error-icon{fill:#552222;}#mermaid-svg-KWCKN9n4urijbSws .error-text{fill:#552222;…

PCIe Base Specification解析(七)

文章目錄3.6 Data Integrity Mechansisms3.6.1 Introduction3.6.2 LCRC, Sequence Number, and Retry Management (TLP Transmitter)3.6.2.1 LCRC and Sequence Number Rules (TLP Transmitter)3.6.2.2 Handling of Received DLLPs3.6.3 LCRC and Sequence Number (TLP Receive…

Windows 11 使用Windows Hello使用人臉識別登錄失敗,重新錄入人臉識別輸入PIN后報Windows Hello安裝程序白屏無響應的問題解決

Windows 11 使用Windows Hello使用人臉識別登錄失敗&#xff0c;重新錄入人臉識別輸入PIN后報Windows Hello安裝程序白屏無響應的問題解決&#xff1a;遇到此種情況時&#xff1a;1、在“開始”右鍵——設置——賬號——登錄選項2、需要在PIN這里先進行刪除此登錄選項&#xff…

qq scheme

QQ intent scheme跳轉 1.跳轉指定說說(root) 2.跳轉指定說說(非root) 3. 跳轉聊天框 4. 跳轉用戶主頁 5. 跳轉加群 6. 跳轉指定用戶空間 1.跳轉指定說說(root) 該方法需root權限 app.startActivity({className: "com.qzone.reborn.base.QZoneTransparentShellActivi…

C語言基礎_隨機數、數組、函數、指針

0、隨機數&#xff1a; 要用C語言產生隨機數&#xff0c;首先在預處理程序部分要引入stdlib.h頭文件&#xff0c;然后就可以用rand()在后續程序中生成隨機數了。如果不設置隨機數種子srand()&#xff0c;后面生成的隨機數序列就是以41開頭的一個固定序列&#xff0c;因此一般以…

PHP?ORT擴展構建純PHP機器學習的推薦系統

結合 PHP?ORT 構建推薦系統的核心思想是&#xff1a;使用 ONNX 格式的機器學習模型&#xff0c;在 PHP 中本地執行推理&#xff0c;實時給出推薦結果。下面是一個完整的架構設計與實現路徑&#xff0c;適合你快速上手。&#x1f3af; 場景目標 你想在一個 PHP 網站中實現推薦功…

PromptPilot搭配Doubao-seed-1.6:定制你需要的AI提示prompt

目錄 一、PromptPilot 二、基于產品評價的用戶情感分析 2.1 使用PromptPiolt工具進行提示詞生成 2.2 基于prompt的模型調試 2.3 基于prompt的批量數據測評 2.4 基于多輪對話的prompt測試 如今&#xff0c;我們正身處一個 AI 技術飛速迭代的時代。人工智能早已不再是實驗室…