美文网首页
Spring 实战 Web 二: Spring MVC 的高级技

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

作者: DJN_ | 来源:发表于2018-08-22 08:54 被阅读0次

    自定义 DispatcherServlet 的配置

    通过 AbstractAnnotationConfigDispatcherServletInitializer 可以实现通过 Java 来配置 Spring MVC,其中有三个方法是必须进行覆写的:getRootConfigClasses、getServletConfigClasses、getServletMappings,实际上除了这三个方法外,还有很多方法是可以进行重写的:

    1. 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 解析器:

    1. CommonsMultipartResolver,使用 Jakarta Commons FileUpload 解析 multipart 请求
    2. StandardServletMultipartResolver,依赖于 Servlet 3.0 对 multipart 的支持

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


    image.png

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


    image.png

    处理 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 注解
    image.png
    1. 在方法上提交 @ExceptionHandler 注解,使用方法来处理当前控制器中的异常
    2. 控制器添加通常,统一处理全局的异常


      image.png

    跨重定向请求传递数据

    通过 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 属性会一直携带这些数据,直到下一次请求,然后才会消失。


    image.png

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

    相关文章

      网友评论

          本文标题:Spring 实战 Web 二: Spring MVC 的高级技

          本文链接:https://www.haomeiwen.com/subject/hjqeiftx.html