8.1 Web MVC配置简介
Spring MVC提供了一个WebMvcConfigurationSupport类和一个注解@EnableWebMvc来减少Bean的声明
WebMvcConfigurationSupport的常用配置方法:
1)addCorsMappings():配置跨域路径映射
2)addFormatters():配置格式化器
3)addInterceptors():配置拦截器
4)addViewControllers():配置视图控制器映射
自定义一个继承自WebConfigurationSupport的配置类WebMvcConfig:
1)使用@Configuration注解类WebMvcConfig
2)重写addCorsMappings、addFormatters、addInterceptors、addViewControllers
注:
1)@Configuration在类上使用,启用Spring MVC配置
2)@EnableWebMvc使用在入口类上,启用WebMvc配置
8.1.1 静态资源配置
Spring Boot中默认的静态资源配置时把类路径下的/static、/public、/resources和/METAINF/resources文件夹的静态文件直接映射为/**。
可通过覆盖写addResourceHandlers定制静态资源路径映射
8.1.2 拦截器配置
通过覆盖addInterceptors()方法,使用InterceptorRegistry注册器来添加拦截器HandlerInterceptor
8.1.3 跨域配置
通过重写addCorsMappings方法实现跨域配置的支持,使用CorsRegistry注册类添加路径映射
8.1.4 视图控制器配置
通过重写addViewControllers方法,使用ViewControllerRegistry实现视图控制器配置
8.1.5 消息转换器配置
新增自定义的HTTPMessageConverter:定义一个自己的HTTPMessageConverters的bean,然后在此Bean中注册自定义HTTPMessageConverter即可
8.1.6 数据格式化器配置
通过覆盖重写addFormatters方法来添加数据格式化器
8.1.7 视图解析器配置
通过覆盖重写ContentNegotiatingViewResolver类的configureViewResolves()方法来配置视图解析器
8.2 全局异常处理
Spring MVC的controller层中,全局异常捕获处理的解决方案:
1.使用@ControllerAdvice和@ExceptionHandler进行全局的Controller层异常处理
1)定义统一异常处理类
定义一个@ControllerAdvice标注的WikiExceptionHandler类,在用@ExceptionHandler标注defaultErrorHandler()方法。当捕获到对应异常时,进入defaultErrorHandler()方法。
2)异常信息展示
对应请求视图映射到一个继承WebMVCConfigurationSupport类的WebMvcConfig类的addViewControllers方法中
3)测试异常条件
在一个controller类中编写一个抛出对应异常的测试逻辑
4)测试运行
2.实现org.springframework.web.servlet.HandlerExceptionResolver接口中的resolveException()方法
1)HandlerExceptionResolver接口
HandlerExceptionResolver接口中定义了一个resolveException方法,用于处理Controller中的异常
2)异常处理实现
定义一个使用@Component标注的类,该类实现HandlerExceptionResolver接口中法人resolveException()方法
3)UndeclaredThrowableException
该异常通常是在RPC接口调用场景或者使用JDK动态代理的场景时发生
4)异常逻辑测试
5)运行测试
8.3 定制Web容器
Spring Boot支持嵌入式容器,默认启动嵌入式Tomcat容器
Spring Boot中Web服务器的配置在application.properties中的属性以server.*开头。Spring Boot给所有属性都提供了默认配置
8.4 定制Spring Boot应用程序启动Banner
程序启动最开始,有一个Spring空心字的这段Banner是在Spring Boot中默认配置的,配置类是SpringBootBanner。SpringBoot中使用SpringApplicationBannerPrinter这个类来实现支持TextBanner(banner.txt)、ImageBanner(banner.gif/banner.jpg/banner.png)两种展示
8.5 自定义注册Servlet、Filter和Listener
Spring Boot中已经移除了web.xml文件,如果需要注册添加Servlet、Filter、Listener为Spring Bean,在Spring Boot中有两种方式:
1)Servlet 3.0 API中的注解@WebServlet、@WebListener、@WebFilter用来配置
2)Spring Boot JavaConfig注解配置Bean的方式进行配置
8.5.1 注册Servlet
声明一个继承自HTTPServlet的HelloServlet类,并覆写doGet和doPost方法。(@WebServlet注解标注在继承了HTTPServlet类的HelloServlet之上,该注解的作用等价于在web.xml中配置的改servlet的<servlet-mapping>元素中<url-pattern>的配置)
1)@WebFilter注册配置Filter类
2)@WebServlet注册配置Servlet类
3)@WebListener注册配置Listener类
8.5.2 注册Filter
Filter主要用于对用户请求进行预处理(HTTPServletRequest到的Servlet之前,Filter拦截用户的HTTPServletRequest。根据需要检查HTTPServletRequest,也可修改HTTPServletRequest请求头和数据),也可以对HTTPServletResponse进行后处理(HTTPServletResponse到达客户端之前,Filter拦截HTTPServletResponse。根据需要坚持HTTPServletResponse,也可修改HTTPServletResponse响应头和数据),是典型的职责链模式。其与Servlet的区别在于,他不能直接向用户生成响应
处理请求和响应的分解线是chain.doFilter()。执行该方法之前,可对用户请求进行预处理;执行该方法之后,可对响应进行后处理。
Filter接口中的方法总结:
1)init():类似于Servlet生命周期中的init()方法,用于初始化一些关于Filter接口的参数,只在Servlet启动时调用一次
2)doFilter():类似于Servlet生命周期中的service()方法,该方法用于存放过滤器的业务逻辑实现代码
3)destory():类似于Servlet生命周期中的destory()方法,当Servlet容器销毁前调用该方法
开发中使用Filter的场景:
1)禁用浏览器的缓存
2)解决中文乱码问题
3)检查用户是否登录来管理用户权限
3)检查用户请求,根据请求过滤用户非法请求
4)详细记录某些特殊的用户请求
5)对非标准编码的请求解码
8.5.3 注册Listener
Servlet的监听器Listener是实现了javax.servlet.ServletContextListener接口的服务器端程序,只初始化一次,随Web应用的停止而销毁。在Filter init()执行之前执行,在Filter destory()执行之后执行。主要作用是:做一些初始化的内容添加工作,设置一些基本的内容。
Listener主要分为三类:
1)与ServletContext有关的Listener接口
2)与HTTPSession有关的Listener接口
3)与ServletRequest有关的Listener接口