SpringMVC常用配置

我们今天来介绍一个SpringMVC的基本配置,灵活的使用这些配置,可以让我们在开发中更加灵活的处理业务逻辑 。
OK,废话不多说,那就开始吧 。
SpringMVC基础配置(通过注解配置,非xml配置)这篇文章中我们的案例都会有一个MvcConfig的类用来做一个简单的配置,主要是通过ViewResolver来解决映射路径和实际页面的位置,这个类我们还可以继续扩展,让其解决更多的问题,我列举几个:

  • 静态资源映射
  • 拦截器使用
  • 全局配置问题
等等 。这些问题我们可以重新定义一个新的类来解决,也可以扩展MvcConfig来解决 。我们来一个个看看 。
静态资源映射我们都知道在SpringMVC中静态资源文件都是直接访问的,而不需要映射,这些静态资源主要包括js文件、css文件、图片文件等,那么这个需要我们单独处理,否则系统会找不到路径 。OK,这个问题的解决也很容易,假设我有一张图片放在src/main/resources/assets/img目录下,然后想在jsp页面中将其展示出来,我们先来看看jsp页面:
<%@ page contentType="text/html;charset=UTF-8" language="JAVA" %><html><head><title>Hello Sang!</title></head><body><p>Welcome To SpringMVC World!</p><p><img src=https://www.isolves.com/it/cxkf/bk/2019-08-29/"../assets/img/1.png">

然后我们创建MVCConfig类,作用还是和上文一样,不同的是这次我们继承自WebMvcConfigurerAdapter,然后重写WebMvcConfigurerAdapter类中的addResourceHandlers方法来解决这个问题 。如下:
@Configuration@EnableWebMvc@ComponentScan("org.sang")public class MVCConfig extends WebMvcConfigurerAdapter{@Beanpublic InternalResourceViewResolver viewResolver() {InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();viewResolver.setPrefix("/WEB-INF/classes/views/");viewResolver.setSuffix(".jsp");viewResolver.setViewClass(JstlView.class);return viewResolver;}/*** /**的意思是所有文件,包括文件夹中的子文件* /*是所有文件,不包含子文件* /是web项目的根目录* @param registry*/@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {//两个*表示以/assets开始的任意层级的路径都可以访问得到图片,如<img src=https://www.isolves.com/it/cxkf/bk/2019-08-29/"../assets/img/1.png">//一个*表示只可以访问assets目录下的图片文件registry.addResourceHandler("/assets/**").addResourceLocations("classpath:/assets/");}}
OK,这里继承WebMvcConfigureAdapter之后,我们可以重写它里边的很多方法,重写这些方法我们可以对SpringMVC进行配置,addResourceHandler指的是访问路径,addResourceLocations指的是文件放置目录 。
拦截器拦截器在JavaEE开发中还是非常重要的,乱码解决、权限控制等等都会用到,使用Servlet的时候有一个Filter类用来进行过滤,那么SpringMVC也在这方面给我们提供了相应的解决方案 。
定义拦截器
拦截器的定义我们可以通过继承HandlerInterceptorAdapter或者实现HandlerInterceptor接口,我这里以实现接口为例:
public class MyInterceptors implements HandlerInterceptor {public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {System.out.println("preHandle");return true;}public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {System.out.println("postHandle");}public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {System.out.println("afterCompletion");}}
preHandle方法发生在请求发生前执行,postHandle发生在请求发生后执行,afterCompletion在请求完成时执行,实际上执行时机紧挨着postHandle这个方法 。然后在MVCConfig类中添加addInterceptors方法注册拦截器,如下:
@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(myInterceptors());}@Beanpublic MyInterceptors myInterceptors() {return new MyInterceptors();}
这样注册成功之后,我们在浏览器中访问时,打印日志如下:
SpringMVC常用配置

文章插图
全局配置全局资源的配置问题,我们可以通过@ControllerAdvice来把控制器的全局配置放在同一个位置,这样我们可以统一处理下面几个问题:
  • 1 .全局异常处理
  • 2 .预设键值对绑定到Model中
  • 3 .预处理前台请求参数
OK,下面来一个一个看一下 。


推荐阅读