Spring MVC中的适配器模式体现在对Controller接口的不同实现进行统一处理的过程。在Spring MVC中,HandlerAdapter
是适配器模式的具体体现,它允许DispatcherServlet与各种类型的Controller进行交互,而不必关心Controller的具体实现细节。下面通过一个简化的示例来说明:
示例:
- 定义一个基础的Controller接口(在真实Spring MVC中,Controller通常通过实现
org.springframework.web.servlet.mvc.Controller
或使用@Controller
注解的类表示):
public interface CustomController {
ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response);
}
- 创建两种不同实现的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;
}
}
- 设计一个适配器接口和它的实现,这里简化为一个泛型接口:
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);
}
}
- 假设有个简易版的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
类,或是实现特定接口的类,从而实现了适配器模式,增强了系统的灵活性和扩展性。