Spring实战(第四版) 第七章 SpringMVC高级技术
1、Spring MVC配置的替代方案
自定义DispatcherServlet方案
通过重载customizeRegistration()可以对DispatcherServlet进行额外配置
添加其他Servlet和Filter
- 如果想往Web容器中注册其他组件,只需创建一个新的初始化容器。可实现WebApplicationInitializer接口。
- 注册。servletContext.addFilter("myFilter", MyFilter.class)
- 重载AbstractAnnotationConfigDispatcherServletInitializer的getServletFilters()。
2、处理multipart形式数据
配置multipart解析器
- MultipartResolver接口实现解析mulitpart请求数据
- 两种解析器,CommonsMultipartResolver,StandardServletMultipartResolver
- 调用setMultipartConfig方法,可以传入MultipartConfig Element实例,进行一些配置
DispatcherServlet ds = new DispatcherServlet();
Dynamic registration = context.addServlet("appServlet", ds);
registration.addMapping("/");
registration.setMultipartConfig(new MultipartConfigElement("/tmp/spittr/uploads"));
处理multipart请求
- 给控制器方法加上@RequestPart注解
- MultipartFile提供了transferTo方法,能够帮助我们将上传文件写入到文件系统中
@RequestMapping(value="/register", method=POST)
public String processRegistration(@RequestPart("profilePicture") byte[] profilePicture, @Valid Spitter spitter) {
}
3、处理异常
将异常映射为HTTP状态码

@ResponseStatus(value=HttpStatus.NOT_FOUND, reason="Spittle Not Found")
public class SpittleNotFoundException extends RuntimeException{}
编写异常处理方法
@RequestMapping(method=RequestMethod.POST)
public String saveSpittle(SpittleForm form, Model model) {
try {
spittleRepository.save(new Spittle(null, form.getMessage(), new Date(),
form.getLongitude(), form.getLatitude()));
return "redirect:/spittles";
} catch (DuplicateSpittleException e) {
return "error/duplicate";
}
}
- 但有了这个就不用catch了
@ExceptionHandler(DuplicateSpittleException.class)
public String handleNotFound() {
return "error/duplicate";
}
4、为控制器添加通知
控制器通知是任意带有ControllerAdvice注解的类,这个类会包含一个或多个@ExceptionHandler/@InitBinder/@ModelAttribute注解标注的方法。
带有@ControllerAdvice注解的类中,以上所述的这些方法会运用到整个应用程序所有控制器中带有@RequestMapping注解的方法上。
5、跨重定向请求传递数据
通过URL模板进行重定向
@RequestMapping(value="/register", method = POST)
public String processRegistration(Spitter spitter, Model model) {
spitterRepository.save(spitter);
model.addAttribute("username", spitter.getUsername());
return "redirect:/spitter/{username}";
}
使用flash属性
- 将需要传递的内容放到会话中。
@RequestMapping(value = "/register", method=POST)
public String processRegistration(Spitter spitter, RedirectAttributes model) {
spitterRepository.save(spitter);
model.addAttribute("username", spitter.getUsername());
model.addFlashAttribute("spitter", spitter);
returtn "redirect:/spitter/{username}"
}
浙公网安备 33010602011771号