《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类型。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值