內容提前知
本節主要分享MVC高級知識部分,主要分為文件上傳、異常處理、自定義攔截器、Spring Security等內容,今天主要分享:
1、文件上傳
2、異常處理
文件上傳
首先我們想一想文件上傳我們在服務端知道些什么?
文件名
文件類型
文件大小
文件
那么Spring MVC是怎么處理這些問題的呢?
上一節我們已經實現自定義DispatcherServlet,但是在DispatcherServlet中并未實現任何解析multipart請求數據的功能。它將該任務委托給了Spring中MultipartResolver策略接口的實現, 通過這個實現類來解析multipart請求中的內容。 從Spring 3.1開始, Spring內置了兩個MultipartResolver的實現供我們選擇:CommonsMultipartResolver( 使用Jakarta Commons FileUpload解析multipart請求);StandardServletMultipartResolver(依賴于Servlet 3.0對multipart請求的支持)。一般來講, 在這兩者之間, StandardServletMultipartResolver可能會是優選的方案(不依賴于外部組件)。
程序一:在WebConfig中配置MultipartResolver
@Bean
public MultipartResolver multipartResolver() {
return new StandardServletMultipartResolver();
}
同時在DispatcherServlet中,你還需要重寫customizeRegistration函數。
程序二:配置文件上傳的相關參數
@Override
protected void customizeRegistration(Dynamic registration) {
String location = "E:/spring-mvc/tmp/uploads";
File file = new File(location);
if(!file.exists()) {
file.mkdirs();
}
//每一個文件為3M
long maxFileSize = 1024 * 1024 * 3;
//一共上傳15M的內容
long requestFileSzie = maxFileSize * 5;
//當緩存中有好大的時候,寫入磁盤
int fileSizeThreshold = 0;
registration.setMultipartConfig(
new MultipartConfigElement(
location,
maxFileSize,
requestFileSzie ,
fileSizeThreshold)
);
}
程序三:在controller中獲取MultipartFile數據
@RequestMapping(value="/upload")
public String upload(@RequestPart("myFile") MultipartFile myFile) {
System.out.println("文件名稱:"+myFile.getOriginalFilename());
return "";
}
至此,Spring MVC文件上傳就完了,是不是非常簡單,非常感謝Spring為我們帶來如此簡便的文件上傳方法。
異常處理
在Http中,大家經常會碰到404、500等常見異常錯誤碼,但是我們不可以直接將錯誤碼返回給用戶,那么我們應該怎么做?在前面的Spring AOP中講過,可以將所有的異常進行統一處理,但是又怎么返回到指定界面呢?
Spring提供了多種方式將異常轉換為響應:
特定的Spring異常將會自動映射為指定的HTTP狀態碼;
異常上可以添加@ResponseStatus注解, 從而將其映射為某一個HTTP的狀態碼
在方法上可以添加@ExceptionHandler注解, 使其用來處理異常。
第一種和第二種方式是指將特定情況下的異常轉換為HTTP狀態碼。第三種是對異常的處理。
程序四:@ResponseStatus
@ResponseStatus(value=HttpStatus.INTERNAL_SERVER_ERROR)
public class MyExcetion extends RuntimeException{}
需要注意的的是,@ResponseStatus是注解在異常類上的
當得到我們需要的異常之后,我們需要對異常進行處理,Spring MVC利用了AOP的原理,加入了@ControllerAdvice注解,此注解能夠攔截所有我們定義的異常
程序五:@ControllerAdvice + @ExceptionHandler
@ControllerAdvice
public class ExceptionAdvice {
@ExceptionHandler(MyExcetion.class)
public String exception() {
return "error/500";
}
}
下期預告
下期將分享Spring MVC中高級知識部分(二)-自定義攔截器,以及攔截器、過濾器的區別;為學習Spring Security打下基礎。
如果你對Linux、Java后端、分布式系統感興趣,可以加入我們的知識星球。
在潛移默化中完成程序員的自我進化。