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