前文分別介紹了 Spring IOC 與 Spring AOP 的相關知識,本文將爲各位大概帶來 Spring MVC 的知識點。關注我的公衆號「Java面典」,每天 10:24 和你一起了解更多 Java 相關知識點。
處理流程
- 用戶發送請求至前端控制器 DispatcherServlet;
- DispatcherServlet 收到請求調用 HandlerMapping 處理器映射器;
- 處理器映射器找到具體的處理器(可以根據 xml 配置、註解進行查找),生成處理器對象及處理器攔截器(如果有則生成)一併返回給 DispatcherServlet;
- DispatcherServlet 調用 HandlerAdapter 處理器適配器;
- HandlerAdapter 經過適配調用具體的處理器(Controller,也叫後端控制器);
- Controller 執行完成返回 ModelAndView;
- HandlerAdapter 將 Controller 執行結果 ModelAndView 返回給 DispatcherServlet;
- DispatcherServlet 將 ModelAndView 傳給 ViewReslover 視圖解析器;
- ViewReslover 解析後返回具體 View;
- DispatcherServlet 根據 View 進行渲染視圖(即將模型數據填充至視圖中);
- DispatcherServlet 響應用戶。
常用註解
基本註解
@RequestMapping:給控制器方法綁定一個 uri;
@ResponseBody:將 Java 對象轉成 json,並且發送給客戶端;
@RequestBody:將客戶端請求過來的 json 轉成 Java 對象;
@RequestParam:當表單參數和方法形參名字不一致時,做一個名字映射;
@PathVarible:用於獲取 uri 中的參數,比如 user/1 中 1 的值。
Rest風格的新api
@RestController:相當於 @Controlle r+ @ResponseBody;
@GetMapping:還包括 @DeleteMapping、@PostMapping、@PutMapping 等相當於 @RequestMapping 加對應的 http 請求方法;
其他註解
@SessionAttribute:聲明將什麼模型數據存入session;
@CookieValue:獲取 cookie 值;
@ModelAttribute:將方法返回值存入 model 中;
@HeaderValue:獲取請求頭中的值。
使用技巧
中文亂碼
通過配置 Spring MVC 字符編碼過濾器來解決Post 請求中文亂碼的問題,在 web.xml 中添加:
<filter>
<filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
文件上傳
- 引入jar包: commons-io-1.3.2.jar 和 commons-fileupload-1.2.1.jar;
- 配置xml:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>
- 控制器兼容:
@RequestMapping("/upload")
public void upload(@RequestParam("file") MultipartFile file) throws Exception {
System.out.println(file.getOriginalFilename());
}