Spring MVC是Spring構建在Servlet API上的Web框架。目前大部分的Java Web 開發已經使用Spring MVC 來作。它提供了模型 - 視圖 - 控制器架構,可用於開發靈活的Web應用程序。在本教程中,咱們將重點關注與之相關的問題,由於它一般是Spring開發人員面試的主題。前端
Spring MVC 實現了一些明確並且相對低耦合的概念,可讓開發者很容易開發和測試他們的Web應用。這些概念有:java
這些概念都是徹底獨立並且職責單一。所以Spring MVC給了咱們很大的靈活性。它基於接口(提供的實現類),咱們可使用自定義接口配置框架的每一個部分。另外一個重要的事情是咱們再也不依賴於特定的視圖技術(例如,JSP),能夠選擇咱們最複合業務的視圖技術。此外,咱們不只僅在Web應用程序開發中使用Spring MVC,也能夠用它建立RESTful Web服務。web
流程圖:面試
@Autowired
註解可使用在成員屬性上或方法上,按類型注入Spring bean。這個註解容許Spring解析協做的bean並注入到你業務須要的bean中。spring
@ModelAttribute
註解是Spring MVC中最重要的註解之一。它將方法參數或方法返回值綁定到命名中的Model屬性中,而後將其公開給Web視圖。若是咱們在方法級別使用它,則代表該方法的目的是添加一個或多個模型屬性。另外一方面,當用做方法參數時,它表示應從模型中檢索參數。若是不存在,咱們應該首先實例化它,而後將其添加到Model中。一旦出如今模型中,咱們應該填充全部具備匹配名稱的請求參數的參數字段。segmentfault
@Controller
和@RestController
註釋之間的主要區別在於@ResponseBody
註釋自動包含在@RestController
中。這意味着咱們不須要使用@ResponseBody
來註釋咱們的處理程序方法。後端
咱們可使用@PathVariable
註解來從請求URI中提取一個特定模版變量的值來做爲咱們的請求參數。例如 從/user/123
提取123
給/user/{id}
控制器來獲取一個id=123
的數據映射關係。須要特別指出的是經過此註解獲取的值不會被編碼。具體可經過個人文章來獲取緣由。api
Spring MVC 默認支持JSR-303校驗規範 。並在Spring-Boot-starter-web中提供了JSR-303規範實現Hibernate Validator。咱們可使用它來進行參數校驗。詳情可查看個人文章。跨域
@RequestBody
註解用於控制器方法參數上,目的是將Http 請求體轉換爲領域對象(請求參數)。Spring 經過HttpMessageConverter
將請求體反序列化到Java對象中,默認使用jackson類庫反序列化。@ResponseBody
註解使用於Spring MVC控制器中的處理程序方法上,它代表咱們將把方法的返回類型直接寫入HTTP響應主體而不會將它放在Model中,一樣不會將其解釋爲視圖名稱。Spring MVC攔截器容許咱們攔截客戶端請求並在三個地方處理它 - 在處理以前,處理以後或完成以後(在呈現視圖時)。攔截器切面處理一些公共邏輯而避免重複處理程序代碼(如日誌記錄),也能夠用來更改Spring模型中全局使用的參數。經過如下方式:架構
org.springframework.web.servlet.handler.HandlerInterceptorAdapter
——繼承該類org.springframework.web.servlet.HandlerInterceptor
——實現該接口經過@ControllerAdvice
(也可以使用@RestControllerAdvice
)註解和@ExceptionHandler
註解組合,經過在方法入參中捕獲異常進行處理,舉例以下:
@Slf4j @RestControllerAdvice("cn.felord.manage.api") public class GlobalExceptionControllerAdvice { @ExceptionHandler(NullPointerException.class) public Rest nullPointHandler(HttpServletRequest request, NullPointerException e) { log.error("空指針啦,趕忙關注公衆號:Felordcn", e); return RestBody.failure(-1, "null point exception"); } }
Spring MVC 解決跨域問題主要有如下種辦法:
filter
也能夠處理。@CrossOrigin
註解。 請注意該方案須要在Spring MVC 4.x 以上。<mvc:cors>
標籤中配置。WebMvcConfigurer#addCorsMappings(CorsRegistry)
來配置。若是想具體深刻可經過公衆號:Felordcn 來獲取具體的教程。
通常可經過兩種方式:
org.springframework.core.convert.converter.Converter<S,T>
,並將實現注入Spring容器中。org.springframework.format.Formatter<T>
,並將實現注入Spring 容器中。關注公衆號:碼農小胖哥 獲取更多資訊