DispatcherServlet类的doDispatch()方法中,真正去处理请求的关键步骤是:
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
ModelAndView mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
在第一步中根据我们已经获得的HandlerExecutionChain对象中包含的控制器Handler得到一个HandlerAdapter 接口实现类的适配器对象,第二步调用HandlerAdapter 接口的handle()方法。HandlerAdapter接口有多个实现类,对handle()方法的实现中都有最重要的一行代码:
((Controller) handler).handleRequest(request, response);
可以看出来,是将handler强转为Controller接口的实现后调用其handleRequest()方法了,该方法实现在AbstractController类中,代码如下:
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
throws Exception {
//检查请求类型是否被支持(get、post、head).
checkAndPrepare(request, response, this instanceof LastModified);
// Execute handleRequestInternal in synchronized block if required.
if (this.synchronizeOnSession) {
HttpSession session = request.getSession(false);
if (session != null) {
Object mutex = WebUtils.getSessionMutex(session);
synchronized (mutex) {
return handleRequestInternal(request, response);
}
}
}
return handleRequestInternal(request, response);
}
handleRequestInternal()方法是由AbstractController类的子类实现的,针对不同的请求有不同的处理方法。
比如MultiActionController类用来处理同一控制器类中多个请求方法的情况,代码如下:
protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)
throws Exception {
try {
//获得请求的方法名称
String methodName = this.methodNameResolver.getHandlerMethodName(request);
//利用反射来调用方法
return invokeNamedMethod(methodName, request, response);
}
catch (NoSuchRequestHandlingMethodException ex) {
return handleNoSuchRequestHandlingMethod(ex, request, response);
}
}