在 Spring 中,适配器模式主要应用在 Spring MVC 中的 HandlerAdapter 和 ViewResolver 接口中。Spring MVC 是一个基于 Servlet API 的 Web 框架,它的核心是 DispatcherServlet。当 DispatcherServlet 接收到一个 HTTP 请求时,它会通过 HandlerMapping 找到对应的 Controller,然后通过 HandlerAdapter 调用 Controller 的处理方法,最后通过 ViewResolver 渲染视图并返回响应。
HandlerAdapter 接口定义了一个 handle 方法,用于处理 Controller 的请求。不同类型的 Controller 可能有不同的处理方式,因此 Spring 提供了多个 HandlerAdapter 的实现类,如 SimpleControllerHandlerAdapter、HttpRequestHandlerAdapter、AnnotationMethodHandlerAdapter 等。这些实现类就是适配器,将 Controller 的处理方式适配到 handle 方法中。
下面是一个使用适配器模式的示例代码:
public interface Controller {
ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception;
}
public class SimpleController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mav = new ModelAndView("simple");
mav.addObject("message", "Hello, World!");
return mav;
}
}
public class SimpleControllerHandlerAdapter implements HandlerAdapter {
@Override
public boolean supports(Object handler) {
return (handler instanceof SimpleController);
}
@Override
public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return ((SimpleController) handler).handleRequest(request, response);
}
@Override
public long getLastModified(HttpServletRequest request, Object handler) {
return -1;
}
}
public static void main(String[] args) throws Exception {
SimpleController controller = new SimpleController();
SimpleControllerHandlerAdapter adapter = new SimpleControllerHandlerAdapter();
MockHttpServletRequest request = new MockHttpServletRequest();
MockHttpServletResponse response = new MockHttpServletResponse();
ModelAndView mav = adapter.handle(request, response, controller);
System.out.println(mav.getViewName());
System.out.println(mav.getModel().get("message"));
}
在上面的代码中,Controller 是一个处理请求的接口,SimpleController 是其一个实现类。SimpleControllerHandlerAdapter 实现了 HandlerAdapter 接口,并将 SimpleController 的处理方式适配到 handle 方法中。在 main 方法中,我们创建了一个 SimpleController 和一个 SimpleControllerHandlerAdapter,并通过 MockHttpServletRequest 和 MockHttpServletResponse 来模拟 HTTP 请求和响应,最后调用了 SimpleController 的 handleRequest 方法来处理请求,并输出了视图名称和消息内容。
在 Spring MVC 中,ViewResolver 接口也使用了适配器模式。ViewResolver 用于将逻辑视图名称解析为实际的视图,不同类型的视图可能有不同的解析方式,因此 Spring 提供了多个 ViewResolver 的实现类,如 InternalResourceViewResolver、FreeMarkerViewResolver、TilesViewResolver 等。这些实现类就是适配器,将视图的解析方式适配到 resolveViewName 方法中。