SpringInAction第七章学习笔记:SpringMVC高级技术

第七章:SpringMVC的高级技术

7.1SpringMVC配置的替代方案
1、自定义DispatcherServlet的配置
原本继承AbstractAnnotationConfigDispatcherServletInitializer的前端控制器中,重载是三个方法是abstract方法,最基础的配置,可以重载其他方法以对前端控制器进行更多的配置。

例如覆写customizeRegistration(),用ServletRegistration.Dynamic,调用
setLoadOnStartup()设置load-on-startup优先级,
setInitParameter()设置初始化参数,
setMultipartConfig()配置Servlet3.0对multipart的支持等等。
SpringInAction第七章学习笔记:SpringMVC高级技术_第1张图片
2、添加其他Servlet、Filter、Listener
根据AbstractAnnotationConfigDispatcherServletInitializer的定义,会创建DispatcherServlet和ContextLoaderListener,所以需要注册其他的Servlet、Filter或Listener则还可以手动定义多个初始化器。初始化器最简单的方法就是实现WebApplicationInitializer,这样做会使Spring同时加载此文件,在其中添加所需要的其他Servlet。如下,此时启动服务器则会加载此类,调用onStartup方法。
SpringInAction第七章学习笔记:SpringMVC高级技术_第2张图片
如果只是添加Filter,并且添加到DispatherServlet所在的路径的话,也可以通过DispatcherServlet进行配置,重载getServletFilters(),如下:
SpringInAction第七章学习笔记:SpringMVC高级技术_第3张图片
此上述两种方案都是为了避免在web.xml中声明,当然也可以跟往前的普通方案相同,在web.xml中配置SpringMVC、过滤器

3、在web.xml中声明DispatcherServlet
AbstractAnnotationConfigDispatcherServletInitializer会自动注册DispatcjerServlet和ContextLoaderListener,如果需要用web.xml配置,则需要手动配置。如下:
SpringInAction第七章学习笔记:SpringMVC高级技术_第4张图片
和之前所说的一样,ContextLoaderListener和DispatcherServlet各自加载一个Spring引用上下文,上下文参数contextConfigLocation定义了一个XML地址,会被contextLoaderListener加载。加载DispatcherServlet也可以指定配置文件(一般SSM的配置文件由此加载),如下,配置加载配置中的bean。
SpringInAction第七章学习笔记:SpringMVC高级技术_第5张图片
如果要使用SpringMVC加载配置类而不是XML,如下,配置了加载WebConfig这个类:
SpringInAction第七章学习笔记:SpringMVC高级技术_第6张图片

7.2处理multipart形式的数据
multipart表单会在输入域中放置文本型数据,如果上传文件的话对应部分设置为二进制。
需要配置一个multipart解析器(如果使用Multipart接口读取数据,否则不用),通过它来告诉DispatcherServlet如何读取multipart。
DispatcherServlet将multipart请求功能委托给Spring中的MultipartResolver,从Spring3.1开始内置了两个实现类CommonsMultipartResolver和StandardServletMultipartResolver,前者一般用于Servlet3.0之前的容器,后者更为常用。
只需要直接返回一个bean即可。(必须在前端控制器中setMultipartConfig)
在这里插入图片描述
如果要对上传参数进行一系列的设置,需要在DispatcherServlet中进行设置。上面已经说到了如何在javaConfig类中,重载customizeRegistration进行设置,MultipartConfigElement中属性如下:(分别为,路径,最大文件大小,整个请求的大小,每多少容量进行一次写入)
SpringInAction第七章学习笔记:SpringMVC高级技术_第7张图片
在web.xml中设置如下:(注意,可能需要放置于最后)
SpringInAction第七章学习笔记:SpringMVC高级技术_第8张图片
实现Multipart请求
页面上,form中必须将表单属性设置为multipart/form-data,能告诉浏览器以multipart数据的形式提交表单,每个输入域对应一个part
SpringInAction第七章学习笔记:SpringMVC高级技术_第9张图片
在Spring中 ,提供了MultipartFile接口,提供了一系列相关的方法,可以获得文件的名字、大小、内容类型,转换为数组或以流的方式获取。最重要的是transferTo()方法,可以直接编写一个File指定好路径写入到系统中。

SpringInAction第七章学习笔记:SpringMVC高级技术_第10张图片
在这里插入图片描述
在Servlet3.0中,可以使用javax.servlet.http.Part作为参数。

7.3 处理异常
Servlet的请求输出都是一个Servlet响应,如果在处理过程中出现了异常,则必定在异常会以某种方式转换为响应。
Spring提供了多种方式将异常转换为响应:
·特定的Spring异常会自动映射为指定的HTTP状态码
·在异常上添加@ResponseStatus注解,将其映射为某状态码
·在方法上添加@ExceptionHandler注解,使其来处理异常
1、将异常映射为HTTP状态码
由Spring自身抛出的异常,作为DispatcherServlet处理过程或执行校验时出现问题的结果。例如在SpringMVC中找不到对应Request 的URL处理器,则抛出404 。可以自定义异常类,如下:
在这里插入图片描述
则此时如果抛出此异常,则不是默认的500状态码,而是404。

2、编写异常处理的方法
假如模拟去数据库搜索对象,找寻不到的时候抛出相应的异常如下:
SpringInAction第七章学习笔记:SpringMVC高级技术_第11张图片
如果想做到抛出此异常的时候,去指定页面展示消息,或者通知管理人员的话,则可以编写一个异常处理的方法。使用@ExceptionHandler(异常.class),可以做到抛出此种异常的时候进入到此方法中。
SpringInAction第七章学习笔记:SpringMVC高级技术_第12张图片
注意,此时handle()方法没有写在原先的那个controller,因为想捕获所有的controller抛出这种异常,而不是只针对于testMethod(如果只针对于单个controller,则可以将@ExceptionHandler方法写于那个controller中)。
在Spring3.2中,引入了控制器通知(注解了@ControllerAdvice的类)。其中使用@ControllerAdvice会告知所有controller中@RequestMapping,抛出异常时进入此异常处理类寻找有无匹配的方法,一般包含:
·@ExceptionHandler 异常处理方法
·@InitBinder 类型转换
·@ModelAttribute 在controller方法前先执行一次

7.5跨重定向请求传递数据
当控制器的结果是重定向的时候,原始的请求就结束了,并且会重新发起一个新的get请求,所以携带的数据模型全部随请求消失。
对于重定向,模型不能传递数据,需要通过其他方法传递:
·使用URL模板以路径变量和/或查询参数的形式传递数据(写在URL中)
·通过flash属性发送数据

1、通过URL模板进行重定向
只能传输简单的String或int,通过将值赋在URL中进行数据传输
2、使用falsh属性
Spring提供了将数据发送为flash的属性的功能,flash属性会一直携带这些数据直到下一次请求,然后自动消失。
Spring提供了通过RedirectAttributes设置flash属性的方法(实际上是将数据存于session中并在下个请求中取出并销毁),是Spring3.1引入的Model的一个子接口。addAttribute为model中的方法,所以使用addFlashAttribute才能将数据传递到重定向的地址中。
SpringInAction第七章学习笔记:SpringMVC高级技术_第13张图片
如下,即可在get方法中获取得到重定向传输过来的值。
在Redirect之前的POST请求中加入Flash Attributes中的数据,会被短暂的存储下来(一般是Session中),直到Redirect后的GET请求完成,所以在GET请求中可以获取之前POST请求中放入Flash Attributes中的数据。
SpringInAction第七章学习笔记:SpringMVC高级技术_第14张图片
为完成这样的工作,Spring为请求中新增了OUTPUT_FLASH_MAP和FLASH_MAP_MANAGER
FlashMap用于保存Flash属性,而FlashMapManager用于存储,检索和管理FlashMap实例。在每个请求上都有一个“输入”FlashMap,其中包含从先前请求(如果有)传递的属性,以及一个“输出”FlashMap,其中包含要为后续请求保存的属性。两个FlashMap实例都可以通过RequestContextUtils中的静态方法从Spring MVC中的任何位置访问。
SpringInAction第七章学习笔记:SpringMVC高级技术_第15张图片

你可能感兴趣的:(SpringInAction)