《SpringMvc中的适配器模式》

  适配器模式是将一个接口转换成目标接口,让程序有更好的复用性和扩展性。SpringMvc中的适配器处理器HandlerAdapter就是用了这个设计模式。

  HandlerAdapter是SpringMvc的处理器适配器,会根据传递过来的controller类型不同而调用不同的Handler进行处理,也就是调用请求的方法。

 HandlerAdapter处理的大致流程:

DispatchServlet中有一个集合维护所有的HandlerAdapter,如果配置文件中没有对适配器进行配置,那么DispatchServlet会在创建时对该变量进行初始化,注册所有默认的HandlerAdapter。DispatchServlet会根据传过来的Controller类型从该集合中寻找对应的HandlerAdapter子类进行处理,并且调用它的handler方法,handler通过反射调用具体的执行方法以及返回ModelAndView对象。


  源码解析:


//维护所有HandlerAdapter类的集合
private List<HandlerAdapter> handlerAdapters;
//初始化handlerAdapters
private void initHandlerAdapters(ApplicationContext context) {
代码省略...
}
//diDispatch中部分代码
//获得controller对应的适配器
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
//调用适配器的handler方法处理请求,并返回ModelAndView
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
//返回对应的controller的处理器
protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
	for (HandlerAdapter ha : this.handlerAdapters) {
		if (logger.isTraceEnabled()) {
			logger.trace("Testing handler adapter [" + ha + "]");
		}
		if (ha.supports(handler)) {
			return ha;
		}
	}
	throw new ServletException("No adapter for handler [" + handler +
			"he DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler");
}

  让我们在看看HandlerAdapter的源码:

public interface HandlerAdapter {
	//判断该controller是否由该adapter处理
	boolean supports(Object handler);
	//处理请求
	ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
	
	long getLastModified(HttpServletRequest request, Object handler);

}
  通过适配器模式我们将所有的controller统一交给HandlerAdapter处理,免去了写大量的if-else语句对controller进行判断,也更利于扩展新的controller类型。



猜你喜欢

转载自blog.csdn.net/eragon444668/article/details/76283660
今日推荐