【玩轉(zhuǎn)Spring】Spring MVC

內(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)化。

image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容