springMVC中的适配器模式是怎么使用的

Spring MVC中的适配器模式体现在对Controller接口的不同实现进行统一处理的过程。在Spring MVC中,HandlerAdapter是适配器模式的具体体现,它允许DispatcherServlet与各种类型的Controller进行交互,而不必关心Controller的具体实现细节。下面通过一个简化的示例来说明:

示例:

  1. 定义一个基础的Controller接口(在真实Spring MVC中,Controller通常通过实现org.springframework.web.servlet.mvc.Controller或使用@Controller注解的类表示):

public interface CustomController {
    ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response);
}

  1. 创建两种不同实现的Controller:

public class SimpleController implements CustomController {
    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("message", "Hello from SimpleController!");
        mav.setViewName("simpleView");
        return mav;
    }
}

public class AdvancedController implements CustomController {
    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("message", "Greetings from AdvancedController!");
        mav.setViewName("advancedView");
        return mav;
    }
}

  1. 设计一个适配器接口和它的实现,这里简化为一个泛型接口:

public interface HandlerAdapter<T extends CustomController> {
    ModelAndView handle(T controller, HttpServletRequest request, HttpServletResponse response);
}

public class CustomControllerAdapter implements HandlerAdapter<CustomController> {
    @Override
    public ModelAndView handle(CustomController controller, HttpServletRequest request, HttpServletResponse response) {
        return controller.handleRequest(request, response);
    }

    // 可以添加方法来判断是否可以处理给定的Controller类型
    public boolean supports(Class<?> controllerClass) {
        return CustomController.class.isAssignableFrom(controllerClass);
    }
}

  1. 假设有个简易版的DispatcherServlet(在真实Spring MVC中,DispatcherServlet已经实现了这一功能):

public class SimpleDispatcherServlet {
    private List<HandlerAdapter> handlerAdapters;

    public void init(List<HandlerAdapter> adapters) {
        this.handlerAdapters = adapters;
    }

    public void service(HttpServletRequest request, HttpServletResponse response) {
        // 获取请求的URI,找到对应的Controller
        // 这里简化为固定的选择
        CustomController controller = new AdvancedController();

        // 通过适配器处理请求
        for (HandlerAdapter adapter : handlerAdapters) {
            if (adapter.supports(controller.getClass())) {
                ModelAndView mav = adapter.handle(controller, request, response);
                // 处理ModelAndView并返回响应
                // 此处省略真正的视图解析和响应输出逻辑
                System.out.println("Dispatched to view: " + mav.getViewName());
                break;
            }
        }
    }
}

在这个示例中,SimpleDispatcherServlet相当于Spring MVC中的DispatcherServlet,它维护着一个HandlerAdapter集合。当接收到请求时,DispatcherServlet会选择合适的适配器来处理请求。这里的CustomControllerAdapter就是一个适配器,它可以把任何实现了CustomController接口的类的请求处理逻辑统一起来。

实际的Spring MVC中,HandlerAdapter会处理各种类型的Controller,如基于注解的@Controller类,或是实现特定接口的类,从而实现了适配器模式,增强了系统的灵活性和扩展性。

相关推荐

  1. springMVC适配器模式怎么使用

    2024-03-31 08:24:02       16 阅读
  2. C++适配器模式

    2024-03-31 08:24:02       5 阅读
  3. Spring MVC 适配器模式

    2024-03-31 08:24:02       16 阅读
  4. 什么适配器模式?它实现方式有哪些?

    2024-03-31 08:24:02       30 阅读
  5. Python与设计模式适配器使用方法

    2024-03-31 08:24:02       15 阅读
  6. 适配器模式理解

    2024-03-31 08:24:02       19 阅读
  7. 什么适配器模式

    2024-03-31 08:24:02       17 阅读
  8. 《设计模式艺术》笔记 - 适配器模式

    2024-03-31 08:24:02       36 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-31 08:24:02       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-31 08:24:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-31 08:24:02       20 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-31 08:24:02       20 阅读

热门阅读

  1. Spring Boot集成disruptor快速入门demo

    2024-03-31 08:24:02       16 阅读
  2. ubunt16.04中ubuntu-drivers devices没有输出

    2024-03-31 08:24:02       15 阅读
  3. 您现在可以在家训练 70b 语言模型

    2024-03-31 08:24:02       23 阅读
  4. 在Ubuntu上配置(安装,使用)Nginx

    2024-03-31 08:24:02       16 阅读
  5. axios实现前后端通信报错Unsupported Media

    2024-03-31 08:24:02       13 阅读
  6. PCL 计算线段之间的距离(3D)

    2024-03-31 08:24:02       19 阅读
  7. Kali Linux 与 Debian 的区别

    2024-03-31 08:24:02       20 阅读
  8. 【自用】uniapp全局统一样式scss管理

    2024-03-31 08:24:02       16 阅读
  9. 简单的socket TCP编程

    2024-03-31 08:24:02       14 阅读
  10. efcore8.0 mysql 生成sql执行时生成sql语句

    2024-03-31 08:24:02       17 阅读