Spring MVC 介紹
Spring MVC(Spring Web MVC)是 Spring Framework 提供的 Web 組件,它的實(shí)現(xiàn)基于 MVC 的設(shè)計(jì)模式:Controller(控制層)复亏、Model(模型層)趾娃、View(視圖層),提供了前端路由映射缔御、視圖解析等功能抬闷,讓 Java Web 開(kāi)發(fā)變得更加簡(jiǎn)單,也屬于 Java 開(kāi)發(fā)中必須要掌握的熱門(mén)框架耕突。
執(zhí)行流程
Spring MVC 的執(zhí)行流程如下:
- 客戶(hù)端發(fā)送請(qǐng)求至前端控制器(DispatcherServlet)
- 前端控制器根據(jù)請(qǐng)求路徑笤成,進(jìn)入對(duì)應(yīng)的處理器
- 處理器調(diào)用相應(yīng)的業(yè)務(wù)方法
- 處理器獲取到相應(yīng)的業(yè)務(wù)數(shù)據(jù)
- 處理器把組裝好的數(shù)據(jù)交還給前端控制器
- 前端控制器將獲取的 ModelAndView 對(duì)象傳給視圖解析器(ViewResolver)
- 前端控制器獲取到解析好的頁(yè)面數(shù)據(jù)
- 前端控制器將解析好的頁(yè)面返回給客戶(hù)端
流程如下圖所示:
核心組件
Spring MVC 的核心組件如下列表所示:
- DispatcherServlet:核心處理器(也叫前端控制器),負(fù)責(zé)調(diào)度其他組件的執(zhí)行眷茁,可降低不同組件之間的耦合性炕泳,是整個(gè) Spring MVC 的核心模塊。
- Handler:處理器上祈,完成具體業(yè)務(wù)邏輯培遵,相當(dāng)于 Servlet 或 Action浙芙。
- HandlerMapping:DispatcherServlet 是通過(guò) HandlerMapping 將請(qǐng)求映射到不同的 Handler。
- HandlerInterceptor:處理器攔截器籽腕,是一個(gè)接口嗡呼,如果我們需要做一些攔截處理,可以來(lái)實(shí)現(xiàn)這個(gè)接口皇耗。
- HandlerExecutionChain:處理器執(zhí)行鏈南窗,包括兩部分內(nèi)容,即 Handler 和 HandlerInterceptor(系統(tǒng)會(huì)有一個(gè)默認(rèn)的 HandlerInterceptor郎楼,如果需要額外攔截處理万伤,可以添加攔截器設(shè)置)。
- HandlerAdapter:處理器適配器箭启,Handler 執(zhí)行業(yè)務(wù)方法之前壕翩,需要進(jìn)行一系列的操作包括表單數(shù)據(jù)的驗(yàn)證、數(shù)據(jù)類(lèi)型的轉(zhuǎn)換傅寡、將表單數(shù)據(jù)封裝到 POJO 等放妈,這一系列的操作,都是由 HandlerAdapter 來(lái)完成荐操,DispatcherServlet 通過(guò) HandlerAdapter 執(zhí)行不同的 Handler芜抒。
- ModelAndView:裝載了模型數(shù)據(jù)和視圖信息,作為 Handler 的處理結(jié)果托启,返回給 DispatcherServlet宅倒。
- ViewResolver:視圖解析器,DispatcherServlet 通過(guò)它將邏輯視圖解析成物理視圖屯耸,最終將渲染結(jié)果響應(yīng)給客戶(hù)端拐迁。
自動(dòng)類(lèi)型轉(zhuǎn)換
自動(dòng)類(lèi)型轉(zhuǎn)換指的是,Spring MVC 可以將表單中的字段疗绣,自動(dòng)映射到實(shí)體類(lèi)的對(duì)應(yīng)屬性上线召,請(qǐng)參考以下示例。
1. JSP 頁(yè)面代碼
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<form action="add">
名稱(chēng):<input type="input" name="name"><br>
年齡:<input type="input" name="age"><br>
<input type="submit" value=" 提交 ">
</form>
</body>
</html>
2. 編寫(xiě)實(shí)體類(lèi)
public class PersonDTO {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
3. 編寫(xiě)控制器
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class PersonController {
@RequestMapping(value = "/add", produces = "text/plain;charset=utf-8")
public String add(PersonVO person) {
return person.getName() + ":" + person.getAge();
}
}
4. 執(zhí)行結(jié)果
執(zhí)行結(jié)果如下圖所示:
中文亂碼處理
業(yè)務(wù)的操作過(guò)程中可能會(huì)出現(xiàn)中文亂碼的情況多矮,以下是處理中文亂碼的解決方案缓淹。
第一步,在 web.xml 添加編碼過(guò)濾器塔逃,配置如下:
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
第二步讯壶,設(shè)置 RequestMapping 的 produces 屬性,指定返回值類(lèi)型和編碼湾盗,如下所示:
@RequestMapping(value = "/add", produces = "text/plain;charset=utf-8")
攔截器
在 Spring MVC 中可以通過(guò)配置和實(shí)現(xiàn) HandlerInterceptor 接口伏蚊,來(lái)實(shí)現(xiàn)自己的攔截器。
1. 配置全局?jǐn)r截器
在 Spring MVC 的配置文件中格粪,添加如下配置:
<mvc:interceptors>
<bean class="com.learning.core.MyInteceptor"></bean>
</mvc:interceptors>
2. 添加攔截器實(shí)現(xiàn)代碼
攔截器的實(shí)現(xiàn)代碼如下: