Spring In Action--04(SpringMVC的文件上傳)

目錄

 

1.配置multipart解析器

2.處理multipart請求

3.異常處理


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"; //返回一個邏輯視圖名  
    }  
}  

重定向會讓原始請求的數據消亡。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章