Spring Boot学习系列(六)------配置MVC

Spring Boot学习系列(六)------配置MVC

前言

我们在使用SpringBoot的时候,前面的博文中都是直接生成可以运行的jar包,在这个过程中,相比原来繁琐的SpringMVC,我们没有配置过配置文件,但是HTTP请求依然正常处理,这是因为SpringBoot内部进行了各种自动装配,所以我们这次来看下SpringBoot内部的配置!

正文

之所以我们能够不需要任何的配置就可以使用Web功能进行各种访问和映射,是因为SpringBoot在底层自动配置了视图解析器,转换器,以及各种格式化的转换器等,如果我们想要定制自己的的各种转换器和数据绑定等方式,只需要向容器中添加我们自己的组件即可.

比如, 我们添加HttpMessageConverter,ConfigurableWebBindingInitializer等,使用@Bean或者@Component注解来注册到容器中.

一般情况下,我们除了使用SpringBoot默认提供的功能以外,还需要自定义一些功能来扩展MVC,想要这样做,我们可以按照以下方式来完成:

  • 自定义配置类
  • 添加@Configuration注解
  • 自定义的配置类必须继承WebMvcConfigurerAdapter这个类

在这里我来列举几个例子:

  1. 自定义资源映射;

    如果我们想要增加静态资源映射目录,只需要配置类重写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指的是对外暴露的访问路径.

  2. 自定义页面跳转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);
        }
    
  3. 添加拦截器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请求的拦截。

  4. 自定义配置的实现原理

    现在我们可以看到,只要我们在类上添加了@Configuration注解,且继承了WebMvcConfigurationAdceptor类,就可以添加自己的配置,这是为什么呢?查看源代码我们可以看到:

    • WebMvcAutoConfiguration是SpringMVC的自动配置类
    • 在做其他自动配置时会导入;@Import(EnableWebMvcConfiguration.class)
    • 容器中所有的WebMvcConfigurer都会一起起作用;
    • 我们的配置类也会被调用;
  5. 全面定制自己的SpringMVC

    如果我们不想使用SpringBoot的MVC配置,想要自己来实现,只需要在配置类上添加注解@EnableWebMvc即可.

总结

总体来说,正是因为有了SpringBoot的自动配置,我们的开发才能如此快捷,想要更灵活地使用SpringBoot,就要了解其运行和配置的原理,在以后的学习总,我也会加强这方面的知识储备!

猜你喜欢

转载自blog.csdn.net/xiaoyao2246/article/details/82906586
今日推荐