浅析SpringMVC中的适配器HandlerAdapter

DispatcherServlte的initHandlerAdapters方法根据配置文件信息把HandlerAdapter注册到handlerAdapters(List)中。

如果在配置文件中没有配置,默认配置会读取DispatcherServlte.properties文件,该文件中配置了三种HandlerAdapter:HttpRequestHandlerAdapter,SimpleControllerHandlerAdapter和AnnotationMethodHandlerAdapter。

SimpleControllerHandlerAdapter :继承Controller方式所使用的适配器
HttpRequestHandlerAdapter   :HTTP请求处理器适配器
RequestMappingHandlerAdapter  :注解方式(@Controller)的处理器适配器

getHandler方法根据请求遍历注册到handlerAdapters中的适配器拿到对应的适配器处理。

for (HandlerMapping hm : this.handlerMappings) {
		HandlerExecutionChain handler = hm.getHandler(request);
		if (handler != null) {
		  return handler;
		}
}

HandlerAdapter接口有三个方法:

supports方法:是判断该适配器是否支持这个HandlerMethod,就是当得到一个handler时,该接口子类该方法做判断(就是类似handler instanceof Controller的判断方式),用来得到适配这个handler的适配器子类。
handle方法:用来执行控制器处理函数,获取ModelAndView 。就是根据该适配器调用规则执行handler方法。

如果正常编写调用,就需要使用多个if else判断instance of

if(handler instanceof HttpRequestHandler){
 handle1();//HttpRequestHandler的处理方式
} else if (handler instanceof Controller){
 handle2();//Controller的处理方式
} else if (handler instanceof Servlet){
 handle3();//Servlet的处理方式
}

这种方法再添加新的处理器实现方式,就需要修改源码,新增else添加处理逻辑,不符合对扩展开放,对修改关闭原则。使用了HandlerAdapter后,当需要新增一种处理器(Controller)时,只需要新增一个HandlerAdapter即可,判断逻辑在他的supports方法中,处理逻辑在handle中,不需要修改任何其他代码。

到此这篇关于浅析SpringMVC中的适配器HandlerAdapter的文章就介绍到这了,更多相关SpringMVC适配器HandlerAdapter内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringMVC适配器模式代码示例

    此处采用了适配器模式, 由于Controller的类型不同,有多重实现方式,那么调用方式就不是确定的,如果需要直接调用Controller方法,需要在代码中写成如下形式: if(mappedHandler.getHandler() instanceof MultiActionController){ ((MultiActionController)mappedHandler.getHandler()).xxx }else if(mappedHandler.getHandler() instanc

  • springmvc中RequestMappingHandlerAdapter与HttpMessageConverter的装配讲解

    一.DispatcherServlet 默认装配 RequestMappingHandlerAdapter ,而 RequestMappingHandlerAdapter 默认装配如下 HttpMessageConverter HttpMessageConverter: 2)加入jackson jar 包后,RequestMappingHandlerAdapter 装配的HttpMessageConverter 如下: 二. HttpMessageConverter 1)HttpMessageC

  • 浅析SpringMVC中的适配器HandlerAdapter

    DispatcherServlte的initHandlerAdapters方法根据配置文件信息把HandlerAdapter注册到handlerAdapters(List)中. 如果在配置文件中没有配置,默认配置会读取DispatcherServlte.properties文件,该文件中配置了三种HandlerAdapter:HttpRequestHandlerAdapter,SimpleControllerHandlerAdapter和AnnotationMethodHandlerAdapte

  • SpringMVC中转发与重定向的区别浅析

    转发和重定向 相同点 都是web开发中资源跳转的方式. 不同点 转发:是服务器内部的跳转,浏览器的地址栏不会发生变化.从一个页面到另一个页面的跳转还是同一个请求,也即是只有一个请求响应.可以通过request域来传递对象. 重定向:是浏览器自动发起对跳转目标的请求,浏览器的地址栏会发生变化.从一个页面到另一个页面的跳转是不同的请求,也即是有两个或两个以上的不同的请求的响应.无法通过request域来传递对象. 在SpringMVC中实现转发和重定向 (1)在SpringMVC中仍然以传统方式进行

  • SpringBoot与SpringMVC中参数传递的原理解析

    目录 一:普通参数与基本注解 二:复杂参数 一:普通参数与基本注解 HandlerMapping中找到能处理请求的Handler(Controller,method()) 为当前Handler找一个适配器HandlerAdapter:RequestMappingHandlerAdapter 1.HandlerAdapter 0-支持方法上标注@RequestMapping 1-支持函数式编程的 xxxx 2.执行目标方法 3.参数解析器:确定要执行的目标方法每一个参数的值是什么 boolean

  • 详解SpringMVC中设置静态资源不被拦截的问题

    这两天使用SpringMVC来做登录,注册的小demo,其中用到了springmvc拦截器对登录操作进行拦截处理,并对url进行验证.验证通过则可以进行handler的处理,如果验证不通过直接跳回或者重定向到指定的页面. 但是在做这个操作的时候,遇到很大的一个问题就是项目demo中的静态资源都会在每次请求中被拦截处理了!跳回页面的时候,页面就不再是想想中的呈现的样子了. 以为我在springmvc.xml中已经配置了拦截器和静态资源的配置却还是出现这样的结果,所以就又是看前段浏览器的设置,又是看

  • SpringMVC中Controller类数据响应的方法

    目录 1. 方法返回值类型 2. 页面跳转 2.1 直接返回字符串 2.2 返回 ModelAndView 对象 2.3 视图前缀和后缀 2.3 重定向和转发 3. 回写数据 3.1 直接返回字符串 3.2 返回对象或集合 上篇博客我们了解了请求参数的获取,那么获取到请求参数之后,需要对参数进行出来,然后进行数据响应.那么这篇博客我们就来了解 Controller 类如何进行数据响应. 1. 方法返回值类型 在 web 阶段我们也了解过数据响应,我们可以简单的将数据响应分为:页面跳转和回写数据

  • SpringMVC中的handlerMappings对象用法

    目录 一.handlerMappings集合内部的元素是什么,有什么作用? 对于RequestMappingHandlerMapping 对于SimpleUrlHandlerMapping 二.handlerMappings集合是怎么初始化的? 总结 三.handlerMappings有什么扩展? localhost:9090/jsp/1.jsp访问时会报如下404错误 从SpringMVC源码解析所用的例子,一个http://localhost:9090/web/hi?name=yang请求调

  • SpringMVC中拦截器的实现

    SpringMVC 中的 Interceptor 拦截器是非常重要和相当有用的,它的主要作用是拦截指定的用户请求,并进行相应的预处理与后处理.其拦截的时间点在“处理器映射器根据用户提交的请求映射出了所要执行的处理器类,并且也找到了要执行该处理器类的处理器适配器,在处理器适配器执行处理器之前”.当然,在处理器映射器映射出所要执行的处理器类时,已经将拦截器与处理器组合为了一个处理器执行链,并返回给了中央调度器. 拦截器和过滤器很像,但是又有比较大的区别 过滤器是servlet规范的一部分,任何jav

  • 一文搞懂SpringMVC中@InitBinder注解的使用

    目录 简介 应用示例 原理解读 环境:Springboot2.4.12 简介 ​@Controller或@ControllerAdvice类可以有@InitBinder方法来初始化WebDataBinder的实例,这些方法可以: 将请求参数(即表单或查询数据)绑定到模型对象. 将基于字符串的请求值(如请求参数.路径变量.头.cookie等)转换为控制器方法参数的目标类型. 渲染HTML表单时,将模型对象的值格式化为字符串值. @InitBinder方法可以注册控制器特定的java.bean.Pr

  • 详解SpringMVC中的异常处理机制

    目录 开头 1.ExceptionHandlerExceptionResolver 2. demo 开头 试想一下我们一般怎么统一处理异常呢,答:切面.但抛开切面不讲,如果对每一个controller方法抛出的异常做专门处理,那么着实太费劲了,有没有更好的方法呢?当然有,就是本篇文章接下来要介绍的springmvc的异常处理机制,用到了ControllerAdvice和ExceptionHandler注解,有点切面的感觉哈哈. 1.ExceptionHandlerExceptionResolve

  • 浅析angularJS中的ui-router和ng-grid模块

    在家里闲着无聊,正好在网上找到了一个关于angular的教程,学习了一下angular的ui-router和ng-grid这两个模块,顺便模仿着做了一个小小的东西. 代码已经上传到github上,地址在这里哟https://github.com/wwervin72/Angular. 有兴趣的小伙伴可以看看.那么然后这里我们就先来了解一下这两个模块的用法. 我们先来说说ui-router这个模块,这个模块主要是用来实现深层次的路由的.其实angular有个内置的指令ng-route,如果在项目中没

随机推荐