`
youyu4
  • 浏览: 424910 次
社区版块
存档分类
最新评论

Spring MVC之 HandlerAdapter

 
阅读更多

Spring MVC之 HandlerAdapter

 

实际上就是根据HandlerAdapter找到的Controller,调用相应的方法,其中数据转换、数据格式化、数据验证就需要相应的适配器去做。

 

 

HandlerAdapter 接口实现: 

 

HttpRequestHandlerAdapter : 要求handler实现HttpRequestHandler接口,

该接口的方法为: void handleRequest(HttpServletRequest request, HttpServletResponse response)也就是  handler必须有一个handleRequest方法 

 

SimpleControllerHandlerAdapter:要求handler实现Controller接口,该接口的方法为ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response),也就是本工程采用的 

 

AnnotationMethodHandlerAdapter:和上面的DefaultAnnotationHandlerMapping配对使用的,也已过时 

 

RequestMappingHandlerAdapter:和上面的RequestMappingHandlerMapping配对使用,针对@RequestMapping 

 

 

 

HandlerAdapter原理

 

其实HandlerAdapter就是一堆适配的规范接口,找到对应的适配器后,就能将Spring框架和我们自定义的controller连接起来。

 

 

代码例子:

 

定义一个Adapter接口 

public interface HandlerAdapter {  
    public boolean supports(Object handler);  
    public void handle(Object handler);  
}  

 

以下是三种Controller实现  

public interface Controller {  
  
}  
  
public class HttpController implements Controller{  
    public void doHttpHandler(){  
        System.out.println("http...");  
    }  
}  
  
public class SimpleController implements Controller{  
    public void doSimplerHandler(){  
        System.out.println("simple...");  
    }  
}  
  
public class AnnotationController implements Controller{  
    public void doAnnotationHandler(){  
        System.out.println("annotation...");  
    }  
}  

 

下面编写适配器类

public class SimpleHandlerAdapter implements HandlerAdapter {  

public void handle(Object handler) {  
        ((SimpleController)handler).doSimplerHandler();  
    }  
  
    public boolean supports(Object handler) {  
        return (handler instanceof SimpleController);  
    }  
  
}  

public class HttpHandlerAdapter implements HandlerAdapter {  
  
    public void handle(Object handler) {  
        ((HttpController)handler).doHttpHandler();  
    }  
  
    public boolean supports(Object handler) {  
        return (handler instanceof HttpController);  
    }  
  
}  

public class AnnotationHandlerAdapter implements HandlerAdapter {  
  
    public void handle(Object handler) {  
        ((AnnotationController)handler).doAnnotationHandler();  
    }  
  
    public boolean supports(Object handler) {  
          
        return (handler instanceof AnnotationController);  
    }  
  
}  

 

模拟一个DispatcherServlet  

import java.util.ArrayList;  
import java.util.List;  

public class DispatchServlet {  
      
    public static List<HandlerAdapter> handlerAdapters = new ArrayList<HandlerAdapter>();   
      
    public DispatchServlet(){  
        handlerAdapters.add(new AnnotationHandlerAdapter());  
        handlerAdapters.add(new HttpHandlerAdapter());  
        handlerAdapters.add(new SimpleHandlerAdapter());  
    }  

public void doDispatch(){  
          
        //此处模拟SpringMVC从request取handler的对象,仅仅new出,可以出,               
                     //不论实现何种Controller,适配器总能经过适配以后得到想要的结果  
//      HttpController controller = new HttpController();  
//      AnnotationController controller = new AnnotationController();  
        SimpleController controller = new SimpleController();  
        //得到对应适配器  
        HandlerAdapter adapter = getHandler(controller);  
        //通过适配器执行对应的controller对应方法  
        adapter.handle(controller);  
          
    }  
         
    public HandlerAdapter getHandler(Controller controller){  
        for(HandlerAdapter adapter: this.handlerAdapters){  
            if(adapter.supports(controller)){  
                return adapter;  
            }  
        }  
        return null;  
    }  
      
    public static void main(String[] args){  
        new DispatchServlet().doDispatch();  
    }  
      
}  

 

 

参考:

https://zhidao.baidu.com/question/136290865875605525.html

分享到:
评论

相关推荐

    全面掌握Spring MVC:从基础到高级的实践指南

    Spring MVC是Spring框架的一个模块,专注于构建Web应用程序。作为架构师和Java开发者,深入理解Spring MVC的原理和实践应用是非常重要的。本文通过分析Spring MVC的核心组件和执行流程,提供了一个全面的学习指南。 ...

    第三课:spring mvc 原理深度解析1

    3、HandlerAdapter详解这里spring mvc 采用适配器模式来适配调用指定Handler,根据Handler的不同种类采用不同的Adapter,

    看透springMvc源代码分析与实践

    第8章 Spring MVC之初体验84 8.1 环境搭建84 8.2 Spring MVC最简单的配置84 8.2.1 在web.xml中配置Servlet85 8.2.2 创建Spring MVC的xml配置文件85 8.2.3 创建Controller和view86 8.3 关联spring源代码87 8.4...

    Spring MVC 学习笔记

    3、 DispatcherServlet再把请求转交给HandlerAdapter,HandlerAdapter将会把处理器包装为适配器,从而支持多种类型的处理器(适配器模式).简单点说就是让我们知道接下来应该调用Handler处理器里面的什么方法 4、 ...

    spring mvc

    只有对应的HandlerMapping (为了实现类型级别的注解)和/ 或HandlerAdapter (为了实现方法级别的注解)出现在 dispatcher中时, @RequestMapping 才会被处理。 这在DispatcherServlet 和DispatcherPortlet 中都是...

    spring3mvc入门资料

    HandlerMapping接口 HandlerAdapter接口 Controller接口 HandlerInterceptor 接口 View接口 LocalResolver接口HandlerExceptionResolver接口 ModelAndView类 。

    springmvc-ajax

    这里使用了 jackson-databind 包, spring-mvc转json的包 &lt;groupId&gt;com.fasterxml.jackson.core&lt;/groupId&gt; &lt;artifactId&gt;jackson-databind &lt;version&gt;2.12.1 也配置了转成json解决乱码的问题 &lt;!-- 1、支持...

    org.springframework.web.servlet-3.1.0.RELEASE

    是源代码,不是jar文件!!!!! /** * Holder for both Model and View in the web MVC framework. * Note that these are entirely ... * @see org.springframework.web.servlet.mvc.Controller#handleRequest */

    春天来了,继续手写自己的Spring,从0到1,从IOC到DI、AOP、MVC四个阶段,项目已经传到了github和码云上面

    熬了半个多月的时间,每天坐在电脑面前十几个小时,从Spring官网拉下来了spring-framework这个项目的源码,边看源码,边从网上找资料,整个项目中使用的设计模式也是非常的经典,如工厂模式:BeanFactory,代理模式...

    手撸springMvc源码【一】

    MVC作为WEB项目开发的核心环节,正如三个单词的分解那样,C(控制器)将V(视图、用户客户端)与M(javaBean:封装数据)分开构成了MVC。 2. springMvc 核心流程 反射,类加载,注解 3. 涉及的核心类 ...

Global site tag (gtag.js) - Google Analytics