Springboot自定义MVC组件

Springboot自定义MVC组件

前言:讲自定义组件前先要明白每个组件是干什么的,在项目运行中起着什么作用。这样我们知道在什么时候应该怎么样去配置组件,所以我们需要先来了解SpringMVC的运行流程

SpringMVC

springMVC的核心在于其流程,它是一种 Servlet 的技术,它提供了核心控制器 DispatcherServlet 和相关的组件,制定了松散的结构;为了让大家对SpringMVC 有一个大致的认识,先给出它接收请求,处理请求,最后响应浏览器的流程图;
请添加图片描述

  1. 发送请求到前端控制器DispatcherServlet
  2. 通过处理器映射找到对应的处理器,生成处理器对象及处理器,拦截器
  3. 要运行处理器就需要一个对应的环境(适配器),通过适配器就会运行对应的处理器(包含了控制器的内容和其他增强的功能)、拦截器
  4. 处理器执行完返回模型和视图给dispatcherServlet
  5. dispatcherServlet将模型传递给视图解析器
  6. 视图解析器解析完把模型渲染到视图中
  7. 最后将视图响应给用户

再尝试用自己的理解快速过一遍:请求到dispatcherServlet,通过handlerMapping映射到对应的handler及Interceptor,再通过HandlerAdapter去执行,返回对应的ModelAndView,用ViewResolver去解析,生成view,响应用户;

大家有时间可以看看SSM框架中纯手工配置前端解析器,视图解析器,上下文监听器,拦截器…

了解一下SpringMVC的几个组件就够了,至于springmvc-servlet.xml的配置就不写出来了,毕竟现在springboot都是自动配置的。

springMVC流程及配置可以参考这篇文章:https://blog.csdn.net/floating_dreaming/article/details/89089214

SpringBoot-拦截器

自定义springmvc组件配置到Springboot中:

  1. 自定义一个拦截器MyInterceptor
    1. 继承HandlerInterceptor 接口
    2. 实现相应方法
    3. 在方法中编写通过拦截器的条件
  2. 自定义webMvcConfig
    1. 继承WebMvcConfigurer接口
    2. 实现addInterceptor方法
    3. 在方法中定义要拦截的路径和不需拦截的路径
//创建拦截器,并实现拦截器方法。
public class LoginInterceptor implements HandlerInterceptor {
    
    
  
  	//在请求发送到控制器之前执行操作,返回true,则等于放行。
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
    
      //加入逻辑操作,例如请求指定路径处理之前进行登录验证
        HttpSession session = request.getSession();
        Object username = session.getAttribute("username");
        if (username == null || username.equals("")){
    
    
            request.setAttribute("msg", "无权限请先登录");
            request.getRequestDispatcher("/index").forward(request, response);
            return false;
        }
        return true;
    }

  	//用于在将响应发送到客户端之前执行操作。
    @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 {
    
    
    }
}
@Configuration
public class LoginMVCConfig implements WebMvcConfigurer {
    
    

  	//创建拦截器实例bean并加入到容器中
    @Bean
    public LoginInterceptor loginInterceptor() {
    
    
        return new LoginInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    
    

        //拦截器默认会把静态资源也拦截下来,所以我们需要把静态资源的相对路径开放;必然还有我们登录页面
        registry.addInterceptor(loginInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns("/","/index","/css/**", "/js/**", "/img/**");
    }

  	//页面跳转,当我们请求/index路径时,会自动映射到index视图
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
    
    
      	//前提index页面放在视图解析器默认解析的位置,视图解析可在配置文件中配置,当然也可以通过这种注解的		方式配置
        registry.addViewController("/index").setViewName("index");
    }
}

以上是添加拦截器的例子在springboot上自定义了一个组件,其实springboot中的组件都有默认的一个配置,而且是自动配置好的。只是我们通过了解了每个组件的作用之后,我们就可以自己去配置添加这些组件,破坏掉它默认的配置。其实这对于我们了解springboot也好,写需求也好,解决bug也好,都有很大的帮助。

最后,说一下,对于我们在springboot中自定义添加任何组件,都是需要去继承一个WebMvcConfigurer 这个类的,然后将我们的组件通过对应的方法里面的registry参数,配置组件并添加到容器中;
在这里插入图片描述

可重写的方法太多啦,但是大家可以看到很都是springmvc运行流程中相关的组件,所以只要知道了每个组件是做什么的,其实很好去对springboot进行配置添加组件的。其实这也是springboot的自动配置的潜在原理了把,就是把SSM中需要使用xml配置文件配置的组件,拿来进行封装,然后我们需要的时候,只要去重写他的方法就好了。

这里推荐给大家对webConfigconfigurer详解的一篇文章(对常用方法的重写):https://blog.csdn.net/zhangpower1993/article/details/89016503

下一篇文章:excel的导入导出

猜你喜欢

转载自blog.csdn.net/weixin_43573186/article/details/121462805
今日推荐