0105 springMVC開發基礎

lcc發表於2021-09-09

背景

已經明確了MVC的思想和SpringMVC的基本流程,下面就都具體的mvc開發細節知識了。

@RequestMapping

springMVC核心流程中,啟動階段會把註解@RequeestMapping註解所配置的內容儲存到HandlerMapping中,然後等待請求到達。

看一下原始碼:
圖片描述

簡單分一下類:

方法 說明
name,value,path 標識控制器方法的訪問url,可以配置多個
method 處理的方法,http的標準方法,比如get,post等
params 引數
headers 請求頭
consumers 接受請求的資源型別
produces 響應的資源型別

說明:

  • url在一個系統中應該保持唯一,能正確標明資源的含義;
  • springboot新增了派生的方法註解,@PostMapping @GetMapping等;

控制器引數 自定義引數轉換

在進入控制器的方法之前,會對http的引數和上下文進行解析,轉換為控制器所需的引數;
自定義引數轉換規則:適用於特殊形式的引數解析,比如第三方公司引數使用加密的方式

處理器轉換引數流程:

WebDataBinder機制:引數的轉換,引數的驗證;

圖片描述

介面 說明
converter 普通的轉換
GenericConverter 陣列型別的轉換
formatter 格式化

springboot的自動註冊引數轉換:
WebMvcAutoConfigurationAdapter類中自動註冊的程式碼:所以,只要實現了這三個介面,並被安裝到ioc中,就自動註冊到了springMVC的引數處理流程中了;

@Override
public void addFormatters(FormatterRegistry registry) {
	for (Converter<?, ?> converter : 
    getBeansOfType(Converter.class)) {
				registry.addConverter(converter);
			}
	for (GenericConverter converter : getBeansOfType(GenericConverter.class)) {
				registry.addConverter(converter);
			}
	for (Formatter<?> formatter : 
    getBeansOfType(Formatter.class)) {
				registry.addFormatter(formatter);
			}
		}

常規引數處理:

型別 說明
無註解下獲取引數 url中的引數名字跟控制器方法的引數名稱一致,並且允許為空
@RequestParam 可以配置url中引數名稱,並設定是否必須,並給出預設值
傳遞陣列 陣列元素透過逗號分隔
傳遞json 定義一個物件,並標註為@RequestBody
url傳遞引數 url引數用{}包起來,而控制器方法引數標註為@PathVariable
獲取格式化引數 @DateFormate @DateTimeFormate,@NumberFormate可以定義接受引數的格式
請求頭引數 @RequestHeader(“x”)註解標註控制器方法
自定義引數解析 實現HttpMessageConverter介面

說明:

  • springboot中可以透過屬性spring.mvc.date-formate來配置

資料驗證

主要是整合了JSR303驗證,採用的是Hibernate-validator機制來驗證;

常見驗證註解

註解 說明
@NotNull 不能為Null
@Future 必須是將來的日期
@Past 必須是過去的日期
@DecimalMin @Min 最小值
@DecimalMax @Max 最大值
@Range 範圍
@Email 必須是郵箱格式
@Size 字串的長度範圍

使用方式

引數方法中,引數物件前標註@Valid ,在物件Errors中可以得到校驗失敗的資訊

自定義引數校驗:

核心介面:Validator ,自定義資料校驗器需要實現該介面;
使用:註冊到WebDataBinder中;
@InitBinder註解標註的方法會在呼叫控制器之前執行;

ModelAndView 檢視和檢視解析器

在springmvc的控制器中,如果引數中使用了ModelAndView,Model,ModelMap,會自動建立資料模型


檢視是渲染資料模型展示給使用者的元件,分為邏輯檢視和非邏輯檢視,
邏輯檢視需要檢視解析器viewResolver進行進一步的定位,比如jsp檢視
而非邏輯檢視不需要進一步的定位,如MappingJacksonJsonView;

檢視介面:兩個核心方法
getContentType();
reder(model, request ,response);

自定義pdf的例子:

TODO

攔截器

springMVC的流程中,根據HandlerMapping會得到一個HandlerExecutionChain,這個物件中包含了一個控制器和一個攔截器列表;透過攔截器可以增強處理器的功能;

攔截器介面程式碼:

圖片描述

三個方法的執行時間相對的是控制器;

自定義攔截器步驟:

  1. 實現HandlerInterceptor類;
  2. 配置類實現 WebMvcConfigurer,註冊自定義的攔截器;
  3. 多個攔截器按照註冊的先後順序執行攔截;

國際化

不同地區的人,時間和語言不同,springMVC對國際化提供了很好的支援。
MessageSource來定義的;
如果resources目錄下無messages.properties檔案,不啟用國際化;

國際化解析器 說明
AcceptHeader 透過L瀏覽器頭來實現國際化區域
Fixed 固定的國際化區域
Cookie 基於Cookie來確定
Session 基於Session來確定

檔案上傳

springMVC對檔案上傳提供了良好的支援。DispatchServlet會把檔案上傳的請求HttpServletRequest轉換為MultipartHttpServletRequest;
而它需要配置好MultipartResolver,springboot預設提供了StandardServletMultipartResolver,這個只需要依賴servlet-api包;

配置方式:

spring.servlet.multipart.enabled=true
spring.servlet.multipart.max-file-size=1MB
spring.servlet.multipart.max-request-size=10MB

控制器寫法:

@PostMapping("/upload/part")
@ResponseBody
public String uplaod(Part file){
    //儲存檔案到本地或者雲服務,返回解析路徑
    
}

其它

不常用的springMVC相關知識點;

知識點 說明
重定向 字串跳轉redirect:/xxx , addFlashAttribute(k,v)可以給redirect新增引數
@ControllerAdvice 定義控制器的增強
@InitBinder 定義自定義的轉換器,校驗器,在控制器執行前呼叫
@ModelAttribute 增加模型的公共引數,不常用
@ExceptionHandler 處理控制器的異常

本文由部落格一文多發平臺 釋出!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2331/viewspace-2824690/,如需轉載,請註明出處,否則將追究法律責任。

相關文章