`

适配器模式及其在springmvc中的应用

 
阅读更多

    前言 
    关于SpringMVC初始化ContextLoader中的XMLWebApplicationContext,以及DispatcherServlet初始化等等,这样的原理 已经有N多的前辈和牛人总结过了, 我就不在这里重复轮子了。~ 
    废话 
    Spring源码还是层次十分分明的,只要了解原理,相信看起来也不会很困难, 但是它的精髓还有其中使用到的设计模式, “架构”少不了模式, Spring正是因为采用大量的模式而使其易于用户扩展。 

    正文 
    找到DispatcherServlet类中的doDispatch体,我们可以看到,它的作用是相当于在Servlet的 doService调用的。 也就是用来传递request给我们编写的Controller并执行相应的方法、返回ModeView对象。 

     执行的代码片段: 

Java代码  收藏代码
  1. ...  
  2. HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());  
  3. mv = ha.handle(processedRequest, response, mappedHandler.getHandler());  
  4. ...  



mappedHandler.getHandler()得到的是Controller对象 
而此处并非采用直接 调用.handlerRequest或者MultiActionController中编写的自定义方法,而采用了一个HandlerAdapter 的接口。 


此处采用了适配器模式, 由于Controller的类型不同,有多重实现方式,那么调用方式就不是确定的,如果需要直接调用Controller方法,需要在代码中写成如下形式: 


Java代码  收藏代码
  1. if(mappedHandler.getHandler() instanceof MultiActionController){  
  2.    ((MultiActionController)mappedHandler.getHandler()).xxx  
  3. }else if(mappedHandler.getHandler() instanceof XXX){  
  4.     ...  
  5. }else if(...){  
  6.    ...  
  7. }  
  8. ...  



这样假设如果我们增加一个HardController,就要在代码中加入一行 if(mappedHandler.getHandler() instanceof  HardController) 
这种形式就使得程序难以维护,也违反了设计模式中的开闭原则 --  对扩展开放,对修改关闭。 

因此Spring定义了一个适配接口,使得每一种Controller有一种对应的适配器实现类, 
让适配器代替controller执行相应的方法。这样在扩展Controller 时,只需要增加一个适配器类就完成了SpringMVC的扩展了,真的是很精巧的做法! 


废话不多说还是上代码吧,为了看得清楚,就自己实现一套代码来模拟springMVC, 直接贴Spring源码容易降低关注点。 


Java代码  收藏代码
  1. //定义一个Adapter接口  
  2. public interface HandlerAdapter {  
  3.     public boolean supports(Object handler);  
  4.     public void handle(Object handler);  
  5. }  
  6.   
  7. //以下是三种Controller实现  
  8. public interface Controller {  
  9.   
  10. }  
  11.   
  12. public class HttpController implements Controller{  
  13.     public void doHttpHandler(){  
  14.         System.out.println("http...");  
  15.     }  
  16. }  
  17.   
  18. public class SimpleController implements Controller{  
  19.     public void doSimplerHandler(){  
  20.         System.out.println("simple...");  
  21.     }  
  22. }  
  23.   
  24. public class AnnotationController implements Controller{  
  25.     public void doAnnotationHandler(){  
  26.         System.out.println("annotation...");  
  27.     }  
  28. }  
  29.   
  30.   
  31. //下面编写适配器类  
  32.   
  33. public class SimpleHandlerAdapter implements HandlerAdapter {  
  34.   
  35.   
  36.     public void handle(Object handler) {  
  37.         ((SimpleController)handler).doSimplerHandler();  
  38.     }  
  39.   
  40.     public boolean supports(Object handler) {  
  41.         return (handler instanceof SimpleController);  
  42.     }  
  43.   
  44. }  
  45.   
  46.   
  47. public class HttpHandlerAdapter implements HandlerAdapter {  
  48.   
  49.     public void handle(Object handler) {  
  50.         ((HttpController)handler).doHttpHandler();  
  51.     }  
  52.   
  53.     public boolean supports(Object handler) {  
  54.         return (handler instanceof HttpController);  
  55.     }  
  56.   
  57. }  
  58.   
  59.   
  60.   
  61. public class AnnotationHandlerAdapter implements HandlerAdapter {  
  62.   
  63.     public void handle(Object handler) {  
  64.         ((AnnotationController)handler).doAnnotationHandler();  
  65.     }  
  66.   
  67.     public boolean supports(Object handler) {  
  68.           
  69.         return (handler instanceof AnnotationController);  
  70.     }  
  71.   
  72. }  
  73.   
  74.   
  75. //模拟一个DispatcherServlet  
  76. import java.util.ArrayList;  
  77. import java.util.List;  
  78.   
  79.   
  80. public class DispatchServlet {  
  81.       
  82.     public static List<HandlerAdapter> handlerAdapters = new ArrayList<HandlerAdapter>();   
  83.       
  84.     public DispatchServlet(){  
  85.         handlerAdapters.add(new AnnotationHandlerAdapter());  
  86.         handlerAdapters.add(new HttpHandlerAdapter());  
  87.         handlerAdapters.add(new SimpleHandlerAdapter());  
  88.     }  
  89.       
  90.       
  91.     public void doDispatch(){  
  92.           
  93.         //此处模拟SpringMVC从request取handler的对象,仅仅new出,可以出,               
  94.                      //不论实现何种Controller,适配器总能经过适配以后得到想要的结果  
  95. //      HttpController controller = new HttpController();  
  96. //      AnnotationController controller = new AnnotationController();  
  97.         SimpleController controller = new SimpleController();  
  98.         //得到对应适配器  
  99.         HandlerAdapter adapter = getHandler(controller);  
  100.         //通过适配器执行对应的controller对应方法  
  101.         adapter.handle(controller);  
  102.           
  103.     }  
  104.       
  105.     public HandlerAdapter getHandler(Controller controller){  
  106.         for(HandlerAdapter adapter: this.handlerAdapters){  
  107.             if(adapter.supports(controller)){  
  108.                 return adapter;  
  109.             }  
  110.         }  
  111.         return null;  
  112.     }  
  113.       
  114.     public static void main(String[] args){  
  115.         new DispatchServlet().doDispatch();  
  116.     }  
  117.       
  118. }  






通过这个模式可以看出 开源代码 中的精妙, 我们在看框架源码时需要有目标的看,这样会找到很多自己需要学习的东西, 目前很多分析源码的帖子大部分是讲解what,how, 
以此来抛砖引玉,希望各位能够一起来讨论 “why ”

 

----------转发:http://zouruixin.iteye.com/blog/1441846

---------------------

关于适配器及springmvc的应用这篇博文已经讲得比较清楚了,自己在学习过程中也写了个类似的demo来加深理解,源代码见附件。

分享到:
评论

相关推荐

    springmvc第一天课堂笔记.docx

    - **配置处理器适配器**:在`springmvc.xml`中配置处理器适配器,如`SimpleControllerHandlerAdapter`,以便能够执行实现`Controller`接口的处理器。 - **开发处理器**:创建一个实现`Controller`接口的类,例如`...

    springmvc学习第一天

    3. **配置处理器适配器**:在`springmvc.xml`中定义处理器适配器。 4. **开发Handler**:实现`Controller`接口,并定义具体的处理逻辑。 5. **视图渲染**:返回包含数据的ModelAndView对象,由视图解析器解析成具体...

    Java SpringMVC 学习路线.pdf

    SpringMVC是Java Spring框架中的一个重要组成部分,它是一个基于Java实现MVC设计模式的请求驱动类型的轻量级Web框架。学习SpringMVC的目的是为了提高Java Web开发的效率和质量,通过使用SpringMVC可以更方便地实现...

    springmvc项目骨架

    本项目骨架提供了XML和JavaConfig两种配置方式,让我们详细探讨这两种配置方法及其在SpringMVC中的应用。 1. XML配置: 在传统的SpringMVC项目中,XML配置文件(如`spring-servlet.xml`)是核心,用于定义组件、...

    SpringMVC学习课堂笔记

    在`springmvc.xml`配置文件中配置处理器适配器。 ##### 7.4 开发Handler 实现`Controller`接口,并确保符合`HandlerAdapter`的要求。 通过以上知识点的学习,我们不仅了解了SpringMVC的基本原理和用法,还掌握了...

    springmvc框架源码.zip

    SpringMVC是Spring框架的一个模块,专为构建Java Web应用程序而设计。它是Model-View-Controller(MVC)设计模式的实现,旨在简化Web开发,提高代码的可...这将有助于提升你的Web开发技能,特别是在大型企业级应用中。

    Spring+SpringMvc+Maven+Hibernate整合

    下面将详细讲解这四个框架的整合及其在实际项目中的应用。 Spring框架是核心,它提供了依赖注入(DI)和面向切面编程(AOP)等特性,使得代码更加模块化,易于测试和管理。SpringMVC是Spring框架的一部分,专门用于...

    spring + springmvc + mybatis 整合 及 mybatis-pagehelper分页

    在IT行业中,Spring、SpringMVC和MyBatis是三个非常重要的开源框架,它们在企业级Web应用开发中被广泛使用。Spring作为一个全面的后端应用程序框架,提供了依赖注入(DI)和面向切面编程(AOP)等功能,极大地简化了...

    springmvc+mybatis+activti+mysql

    它提供了丰富的功能,如声明式异常处理、数据绑定、模型-视图-适配器模式支持以及松散耦合的组件。Spring MVC通过DispatcherServlet作为前端控制器,负责接收HTTP请求并分发到相应的处理器,使得应用结构清晰且易于...

    springmvc 的工作流程.docx

    SpringMVC是Spring框架的一个模块,主要用于简化Web应用程序的开发过程。它遵循Model-View-Controller(MVC)设计模式,帮助开发者更好地组织代码结构,提高代码的可维护性和可扩展性。本文将详细解释SpringMVC的...

    springmvc课堂笔记

    在`springmvc.xml`中配置处理器适配器。 2. 使用`org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter`来处理实现了Controller接口的处理器。 ##### 3.4 开发Handler - **实现**: ```java ...

    SpringMVC面试专题及答案.pdf

    - **单例模式**:SpringMVC 中的控制器默认采用单例模式,这意味着在整个应用程序中只有一个实例。 - **潜在问题**:单例模式下的控制器可能会出现线程安全问题,特别是在处理多个并发请求时。 - **解决方案**:为了...

    Spring3+springmvc+mybatis三大整合

    在Java开发领域,Spring、SpringMVC和MyBatis是三个非常重要的开源框架,它们各自在不同的层次上解决了Web应用中的问题。Spring作为全面的框架,提供了依赖注入(DI)和面向切面编程(AOP)等核心特性;SpringMVC是...

    SpringMVC学习笔记.zip

    在SpringMVC应用中,通常需要配置以下内容: - 配置DispatcherServlet:定义servlet名称、映射路径等。 - 配置HandlerMapping和HandlerAdapter:定义处理器的查找和调用方式。 - 配置ViewResolver:设置视图解析规则...

    尚硅谷SpringMVC视频

    SpringMVC作为一款优秀的Web应用框架,在实际项目中得到了广泛的应用。其简洁的设计理念、灵活的配置选项以及丰富的功能特性,使其成为Java Web开发领域的佼佼者。通过深入学习SpringMVC的各个组件及其工作原理,...

    qfedu三阶段SpringMVC

    在探讨SpringMVC之前,我们首先回顾一下MVC(Model-View-Controller)架构模式的基本概念及其重要性。 ##### MVC架构概述 MVC是一种软件架构设计模式,用于将应用程序的业务逻辑和表示层分离,从而使开发过程更加...

    spring+springmvc+Hibernate_maven框架整合

    在IT行业中,构建高效、可维护的企业级应用是至关重要的,而Spring、SpringMVC和Hibernate这三大框架的整合正是实现这一目标的常用途径。本文将深入探讨如何使用Maven来管理和集成这些框架,以及它们各自的核心功能...

    SpringMVC流程.docx

    在SpringMVC的整个执行流程中,每个组件都有其特定的职责,它们协同工作,实现了请求的接收、处理和响应的全过程。这种设计模式使得SpringMVC具有高度可扩展性和灵活性,能够适应各种复杂的Web应用需求。开发者可以...

Global site tag (gtag.js) - Google Analytics