Spring实战(第四版) 第七章 SpringMVC高级技术

1、Spring MVC配置的替代方案

自定义DispatcherServlet方案

通过重载customizeRegistration()可以对DispatcherServlet进行额外配置

添加其他Servlet和Filter

  • 如果想往Web容器中注册其他组件,只需创建一个新的初始化容器。可实现WebApplicationInitializer接口。
  • 注册。servletContext.addFilter("myFilter", MyFilter.class)
  • 重载AbstractAnnotationConfigDispatcherServletInitializer的getServletFilters()。

2、处理multipart形式数据

配置multipart解析器

https://www.cnblogs.com/tengyunhao/p/7670293.html

  • 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}"
}

posted on 2021-12-19 15:19  kaiker  阅读(4)  评论(0)    收藏  举报