Spring in action 阅读笔记3
2017-06-08 本文已影响20人
言西枣
5.3接受请求的输入
@RequestParam(value="", defaultValue="") long max
尽管defaultValue是String类型的值,但是绑定到max参数时,会转换成Long类型
"/spittles/12345" vs "/spittles/show?spittle_id=12345"
前者能够识别出要查询的资源,后者描述的是带有参数的一个操作-本质上是通过HTTP发起的RPC
7.1配置的替代方案
添加其他的Servlet与Filter
实现WebApplicationInitializer,注册其他组件
7.2Multipart
- MultipartResolver
A. StandardServletMultipartResolver 配置信息在DispatcherServlet之中
@Bean
public MultipartResolver multipartResolver() throws IOException {
return new StandardServletMultipartResolver();
}
// 1.WebApplicationInitializer
DispatcherServlet ds = new DispatcherServlet();
Dynamic registration = context.addServlet("appServlet", ds);
registration.addMapping("/");
registration.setMultipartConfig(
new MultipartConfigElement("/tmp/spittr/uploads"));
//
// 2.AbstractAnnotationConfigDispatcherServletInitializer
@Override
protected void customizeRegistration(Dynamic registration) {
registration.setMultipartConfig(
new MultipartConfigElement("/tmp/spittr/uploads"));
}
//
// 3.web.xml
<servlet>
<servlet-name>SpringDispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<multipart-config>
<location>/tmp</location>
<max-file-size>5242880</max-file-size><!--5MB-->
<max-request-size>20971520</max-request-size><!--20MB-->
<file-size-threshold>0</file-size-threshold>
</multipart-config>
</servlet>
B. CommonsMultipartResolver
只需要配置bean
@Bean
public MultipartResolver multipartResolver() throws IOException {
CommonsMultipartResolver multipartResolver =
new CommonsMultipartResolver();
multipartResolver.setUploadTempDir(
new FileSystemResource("/tmp/spittr/uploads"));
multipartResolver.setMaxUploadSize(2097152);
multipartResolver.setMaxInMemorySize(0);
return multipartResolver;
}
MultipartResolver在DispatcherServlet转发请求之前对request进行处理,如果是Multipart的请求,就分解为MultipartHttpServletRequest
- 请求
POST enctype="multipart/form-data"
<input type="file" name="" accept="" /> - 处理Multipart请求
A. @RequestPart("name") byte[] filebyte
B. @RequestPart("name") MultipartFile/Part file
[Facepalm][Facepalm]如果使用Part参数接收文件,就不需要配置MultipartResolver了
7.3异常处理
- 使用@ResponseStatus(value=HttpStatus.NOT_FOUND, reason="Not Found")标注异常,将异常映射到状态码
- 使用@ExceptionHandler(Exception.class)标注异常处理方法,处理同一个Controller中handle method(RequestMapping)抛出的此类异常
- 使用@ControllerAdvice进行全局的异常处理,处理所有Controller抛出的此类异常
-
Any Spring bean declared in the DispatcherServlet’s application context that implements HandlerExceptionResolver will be used to intercept and process any exception raised in the MVC system and not handled by a Controller. The interface looks like this:
public interface HandlerExceptionResolver {
/**
* Try to resolve the given exception that got thrown during on handler execution,
* returning a ModelAndView that represents a specific error page if appropriate.
* <p>The returned ModelAndView may be {@linkplain ModelAndView#isEmpty() empty}
* to indicate that the exception has been resolved successfully but that no view
* should be rendered, for instance by setting a status code.
* @param request current HTTP request
* @param response current HTTP response
* @param handler the executed handler, or {@code null} if none chosen at the
* time of the exception (for example, if multipart resolution failed)
* @param ex the exception that got thrown during handler execution
* @return a corresponding ModelAndView to forward to,
* or {@code null} for default processing
*/
ModelAndView resolveException(
HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex);
}