Spring 实战 Web 二: Spring MVC 的高级技术

自定义 DispatcherServlet 的配置

通过 AbstractAnnotationConfigDispatcherServletInitializer 可以实现通过 Java 来配置 Spring MVC,其中有三个方法是必须进行覆写的:getRootConfigClasses、getServletConfigClasses、getServletMappings,实际上除了这三个方法外,还有很多方法是可以进行重写的:
1. customizeRegistration
DispatcherServlet 被注册到 Servlet 容器后,就会调用 customizeRegistration 方法,并将注册后得到的 ServletRegistration.Dynamic 对象传递过来,通过该对象可对 DispatcherServlet 进行一些定制,如:setLoadOnStartup、setMultipartConfig、setInitParameter 等

添加 Filter、Servlet 和 Listener

继承 AbstractAnnotationConfigDispatcherServletInitializer 会创建 DispatcherServlet 和 ContextLoaderListener,如果想注册其他组件,只需实现 WebApplicationInitializer 接口即可。

multipart 形式数据

配置 multipart 解析器

Spring 3.1 开始,内置了两个 multipart 解析器:
1. CommonsMultipartResolver,使用 Jakarta Commons FileUpload 解析 multipart 请求
2. StandardServletMultipartResolver,依赖于 Servlet 3.0 对 multipart 的支持

两者之间,StandardServletMultipartResolver 是优选。将解析器声明为 bean 即可启用;

此外还必须指定相关的配置,这些配置需要在 web.xml 或 Java 配置类中进行指定,需要将 multipart 的细节作为 DispatcherServlet 配置的一部分。

处理 multipart 数据

最常见的方式是在某个控制器方法参数中使用 @RequestPart 注解接收,可通过以下的方式配置该参数:
1. @RequestPart(“file”) byte[] file
2. @RequestPart(“file”) MultipartFile file (org.springframework.web.multipart.MultipartFile)
3. @RequestPart(“file”) Part file (javax.servlet.http.Part),此时无需配置 MultipartResolver bean。

异常处理

Spring 提供了多种方式将异常转换为响应:
1. 特定的 Spring 异常会被自动映射为指定的 HTTP 状态
2. 异常上可以添加 @ResponseStatus 注解

  1. 在方法上提交 @ExceptionHandler 注解,使用方法来处理当前控制器中的异常
  2. 控制器添加通常,统一处理全局的异常

跨重定向请求传递数据

通过 return "redirect: /spittle/{username}?id=12" 的方式可将请求进行重定向,而 Servlet 体系中请求重定向时原始的请求就结束了,会发起一个新的 GET 请求,原始请求中的模型数据也就消亡了。

  1. 通过 URL 模板将数据放在 url 中进行传递,
...
model.addAttribute("username","Tom"); // 放在路径参数中
model.addAttribute("age",23); // 放在查询参数中
return "redirect:/spittle/{username}";

上面的代码最终得到的 url:/spittle/Tom?age=23
这是一种很简单直接的方式,缺点也很明显,不能传递复杂对象。

  1. 使用 flash 属性

原理:在重定向发生之前,将数据放在会话中,在重定向完成之后,从会话中将其取出,并将会话中的数据清理掉。而 Spring 的实现略有不同,需要使用 RedirectAttributes 对象,会话中 flash 属性会一直携带这些数据,直到下一次请求,然后才会消失。

在重定向执行前,所有通过 RedirectAttributes#addFlashAttribute 添加的属性会复制到会话中。在重定向后,存在会话中的 flash 属性会被取出,并从会话转移到模型中。处理重定向的方法就能从模型中访问 Spittle 对象了。

你可能感兴趣的:(Spring,Web)