Spring Boot学习系列(六)------配置MVC
前言
我们在使用SpringBoot的时候,前面的博文中都是直接生成可以运行的jar包,在这个过程中,相比原来繁琐的SpringMVC,我们没有配置过配置文件,但是HTTP请求依然正常处理,这是因为SpringBoot内部进行了各种自动装配,所以我们这次来看下SpringBoot内部的配置!
正文
之所以我们能够不需要任何的配置就可以使用Web功能进行各种访问和映射,是因为SpringBoot在底层自动配置了视图解析器,转换器,以及各种格式化的转换器等,如果我们想要定制自己的的各种转换器和数据绑定等方式,只需要向容器中添加我们自己的组件即可.
比如, 我们添加HttpMessageConverter,ConfigurableWebBindingInitializer等,使用@Bean或者@Component注解来注册到容器中.
一般情况下,我们除了使用SpringBoot默认提供的功能以外,还需要自定义一些功能来扩展MVC,想要这样做,我们可以按照以下方式来完成:
- 自定义配置类
- 添加@Configuration注解
- 自定义的配置类必须继承WebMvcConfigurerAdapter这个类
在这里我来列举几个例子:
-
自定义资源映射;
如果我们想要增加静态资源映射目录,只需要配置类重写addResourceHandlers方法:
@Configuration public class MyWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter { /** * 配置静态访问资源 * @param registry */ @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/my/**").addResourceLocations("classpath:/my/"); super.addResourceHandlers(registry); } }
通过addResourceHandler添加映射路径,然后通过addResourceLocations来指定具体的路径,这样我们在访问的时候就是这样的
http://localhost:8080/my/xxx.xxx
如果你想指定外部的路径,可以这样写:
@Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/my/**").addResourceLocations("file:E:/my/"); super.addResourceHandlers(registry); }
addResourceLocations指的是文件放置的目录,addResoureHandler指的是对外暴露的访问路径.
-
自定义页面跳转addViewControllers
在以前的项目中,如果我们要去访问某个页面,需要在对应的controller层中添加对应的方法来处理,然后指定返回的页面,比如登录,我们在访问的时候需要登录方法来返回对应的页面,现在我们使用SpringBoot的时候,可以直接指定,不用写controller方法了:
/** * 以前要访问一个页面需要先创建个Controller控制类,再写方法跳转到页面 * 在这里配置后就不需要那么麻烦了,直接访问http://localhost:8080/toLogin就跳转到login.jsp页面了 * @param registry */ @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/toLogin").setViewName("login"); super.addViewControllers(registry); }
-
添加拦截器addInterceptors
添加自己的拦截器需要2步来完成:
-
创建自己的拦截器类,并且实现HandlerInterceptor接口
-
在继承了WebMvcConfigurerAdapter的配置类中使用addInterceptors方法添加我们的拦截器即可
下面举个小栗子:
首先自定义拦截器:
public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { boolean flag =true; User user=(User)request.getSession().getAttribute("user"); if(null==user){ response.sendRedirect("toLogin"); flag = false; }else{ flag = true; } return flag; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } }
其次将拦截器添加进来:
/** * 拦截器 * @param registry */ @Override public void addInterceptors(InterceptorRegistry registry) { // addPathPatterns 用于添加拦截规则 // excludePathPatterns 用户排除拦截 registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**").excludePathPatterns("/toLogin","/login"); super.addInterceptors(registry); }
addPathPatterns("/**")
对所有请求都拦截,但是排除了/toLogin
和/login
请求的拦截。
-
-
自定义配置的实现原理
现在我们可以看到,只要我们在类上添加了@Configuration注解,且继承了WebMvcConfigurationAdceptor类,就可以添加自己的配置,这是为什么呢?查看源代码我们可以看到:
- WebMvcAutoConfiguration是SpringMVC的自动配置类
- 在做其他自动配置时会导入;@Import(EnableWebMvcConfiguration.class)
- 容器中所有的WebMvcConfigurer都会一起起作用;
- 我们的配置类也会被调用;
-
全面定制自己的SpringMVC
如果我们不想使用SpringBoot的MVC配置,想要自己来实现,只需要在配置类上添加注解
@EnableWebMvc
即可.
总结
总体来说,正是因为有了SpringBoot的自动配置,我们的开发才能如此快捷,想要更灵活地使用SpringBoot,就要了解其运行和配置的原理,在以后的学习总,我也会加强这方面的知识储备!