目录
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"; //返回一个逻辑视图名
}
}
重定向会让原始请求的数据消亡。