自定义 DispatcherServlet 的配置
通过 AbstractAnnotationConfigDispatcherServletInitializer 可以实现通过 Java 来配置 Spring MVC,其中有三个方法是必须进行覆写的:getRootConfigClasses、getServletConfigClasses、getServletMappings,实际上除了这三个方法外,还有很多方法是可以进行重写的:
-
customizeRegistration
DispatcherServlet 被注册到 Servlet 容器后,就会调用 customizeRegistration 方法,并将注册后得到的 ServletRegistration.Dynamic 对象传递过来,通过该对象可对 DispatcherServlet 进行一些定制,如:setLoadOnStartup、setMultipartConfig、setInitParameter 等
image.png
添加 Filter、Servlet 和 Listener
继承 AbstractAnnotationConfigDispatcherServletInitializer 会创建 DispatcherServlet 和 ContextLoaderListener,如果想注册其他组件,只需实现 WebApplicationInitializer 接口即可。
image.png
multipart 形式数据
配置 multipart 解析器
Spring 3.1 开始,内置了两个 multipart 解析器:
- CommonsMultipartResolver,使用 Jakarta Commons FileUpload 解析 multipart 请求
- StandardServletMultipartResolver,依赖于 Servlet 3.0 对 multipart 的支持
两者之间,StandardServletMultipartResolver 是优选。将解析器声明为 bean 即可启用;
image.png
此外还必须指定相关的配置,这些配置需要在 web.xml 或 Java 配置类中进行指定,需要将 multipart 的细节作为 DispatcherServlet 配置的一部分。
image.png
处理 multipart 数据
最常见的方式是在某个控制器方法参数中使用 @RequestPart 注解接收,可通过以下的方式配置该参数:
- @RequestPart("file") byte[] file
- @RequestPart("file") MultipartFile file (
org.springframework.web.multipart.MultipartFile
) - @RequestPart("file") Part file (
javax.servlet.http.Part
),此时无需配置 MultipartResolver bean。
异常处理
Spring 提供了多种方式将异常转换为响应:
- 特定的 Spring 异常会被自动映射为指定的 HTTP 状态
- 异常上可以添加 @ResponseStatus 注解
- 在方法上提交 @ExceptionHandler 注解,使用方法来处理当前控制器中的异常
-
控制器添加通常,统一处理全局的异常
image.png
跨重定向请求传递数据
通过 return "redirect: /spittle/{username}?id=12"
的方式可将请求进行重定向,而 Servlet 体系中请求重定向时原始的请求就结束了,会发起一个新的 GET 请求,原始请求中的模型数据也就消亡了。
- 通过 URL 模板将数据放在 url 中进行传递,
...
model.addAttribute("username","Tom"); // 放在路径参数中
model.addAttribute("age",23); // 放在查询参数中
return "redirect:/spittle/{username}";
上面的代码最终得到的 url:/spittle/Tom?age=23
这是一种很简单直接的方式,缺点也很明显,不能传递复杂对象。
- 使用 flash 属性
原理:在重定向发生之前,将数据放在会话中,在重定向完成之后,从会话中将其取出,并将会话中的数据清理掉。而 Spring 的实现略有不同,需要使用 RedirectAttributes 对象,会话中 flash 属性会一直携带这些数据,直到下一次请求,然后才会消失。
image.png
在重定向执行前,所有通过 RedirectAttributes#addFlashAttribute 添加的属性会复制到会话中。在重定向后,存在会话中的 flash 属性会被取出,并从会话转移到模型中。处理重定向的方法就能从模型中访问 Spittle 对象了。
网友评论