目錄
1.配置multipart解析器
首先DispatcherServlet是處理所有的請求的,需要在DispatcherServlet配置一個multipart解析器,告訴DispatcherServlet該如何讀取multipart請求。
DispatcherServlet並沒有實現任何解析multipart請求數據的功能,而是把該任務委託給了Spring的MulipartResolver的實現。
Spring內置了兩個MulipartResolver實現:
CommonsMultipartResolver(Spring3.1之前)
StandardServletMultipartResolver
配置只需要要注入一個Bean就行:
其他的上傳文件的限制不是在StandardServletMultipartResolver中配置,而是在Servlet中配置。如何配置DispatcherServlet,用我們之前講的通過重載customizeRegistration()方法。
最大文件上傳大小約爲20M,整個multipart請求的最大容量接近40M,如果一個文件上傳的大小到達了0就寫入臨時路徑,意思就是全部寫入臨時路徑。
2.處理multipart請求
控制器處理multipart請求只需要加上@RequestPart註解就好,接收的就是一個byte的數組。這樣是不好的,Spring提供了MultipartFile來接受,那麼可以拿到文件的全部信息,並且可以通過transferTo()方法輕易保存。
3.異常處理
web中是以請求相應的方法來處理請求,所以出現異常必須要講異常轉換爲Servlet響應。
Spring提供了多種方式將異常轉換爲響應:
- 特定的Spring異常會轉換爲HTTP狀態碼
- 異常上可以添加@ResponseSratus註解,從而將其映射爲某一個HTTP狀態碼。
- 在方法上添加@ExceptionHandler註解,使其用來處理異常。
這樣將異常轉換爲狀態碼,就不會拋出500,而是404.
@ResponseStatus(value = HttpStatus.NOT_FOUND,reason = "not found")
public class MyException extends RuntimeException {
}
但是如果我們還想要獲得異常的處理的信息,那麼就不得不自己編寫處理異常的方法了。這個樣整個Controller拋出的My..異常就都能被它處理。
@ExceptionHandler(MyRuntimeException.class)
public String handler() {
return "error";
}
爲控制器編寫控制器通知類:
@ControllerAdvice
public class ControllerAdviceTest {
@ModelAttribute
public User newUser() {
System.out.println("============應用到所有@RequestMapping註解方法,在其執行之前把返回值放入Model");
return new User();
}
@InitBinder
public void initBinder(WebDataBinder binder) {
System.out.println("============應用到所有@RequestMapping註解方法,在其執行之前初始化數據綁定器");
}
@ExceptionHandler(UnauthenticatedException.class)
@ResponseStatus(HttpStatus.UNAUTHORIZED)
public String processUnauthenticatedException(NativeWebRequest request, UnauthenticatedException e) {
System.out.println("===========應用到所有@RequestMapping註解的方法,在其拋出UnauthenticatedException異常時執行");
return "viewName"; //返回一個邏輯視圖名
}
}
重定向會讓原始請求的數據消亡。