【玩轉Spring】Spring MVC

內容提前知

本節主要分享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后端、分布式系統感興趣,可以加入我們的知識星球。

在潛移默化中完成程序員的自我進化。

image
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容