这是深入了解.
Spring提供了一个DispatcherServlet类,该类通常可以处理所有请求.它在其doDispatch(HttpServletRequest request,HttpServletResponse response)方法中执行此操作
// Actually invoke the handler.
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
其中mv是最终的ModelAndView对象,ha是使用@RequestMapping注释的控制器方法的包装.
通常,这将通过一堆方法调用,最终以ServletInvocableHandlerMethod.invokeAndHandle结束
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle
at org.springframework.web.servlet.DispatcherServlet.doDispatch
看源头
public final void invokeAndHandle(ServletWebRequest webRequest,
ModelAndViewContainer mavContainer, Object... providedArgs) throws Exception {
Object returnValue = invokeForRequest(webRequest, mavContainer, providedArgs);
setResponseStatus(webRequest);
if (returnValue == null) {
if (isRequestNotModified(webRequest) || hasResponseStatus() || mavContainer.isRequestHandled()) {
mavContainer.setRequestHandled(true);
return;
}
} else if (StringUtils.hasText(this.responseReason)) {
mavContainer.setRequestHandled(true);
return;
}
mavContainer.setRequestHandled(false);
try {
this.returnValueHandlers.handleReturnValue(returnValue, getReturnValueType(returnValue), mavContainer, webRequest);
}
catch (Exception ex) {
if (logger.isTraceEnabled()) {
logger.trace(getReturnValueHandlingErrorMessage("Error handling return value", returnValue), ex);
}
throw ex;
}
}
returnValue是您的@RequestMapping方法返回的对象.它经历了
this.returnValueHandlers.handleReturnValue
Spring确定一个HandlerMethodReturnValueHandler来处理该对象.
public void handleReturnValue(
Object returnValue, MethodParameter returnType,
ModelAndViewContainer mavContainer, NativeWebRequest webRequest)
throws Exception {
HandlerMethodReturnValueHandler handler = getReturnValueHandler(returnType); // returns the appropriate handler
Assert.notNull(handler, "Unknown return value type [" + returnType.getParameterType().getName() + "]");
handler.handleReturnValue(returnValue, returnType, mavContainer, webRequest);
}
getReturnValueHandler(返回类型);返回适当的处理程序. HandlerMethodReturnValueHandler是带有supportsReturnType方法的接口,如果处理程序支持该类型(字符串,视图,ResponseEntity,etc. (look for supported return types)),则该方法返回true.因此,该方法返回它找到的第一个处理程序,该处理程序支持该类型并运行它.
Spring在初始化时,注册了HandlerMethodReturnValueHandler的全部实现.基本上都是known implementing classes in its javadoc.
现在,哪种返回类型由您决定.如果您想返回一个Model以便可以在jsp视图中使用请求属性,则可以让Spring将Model实例传递给您的方法,也可以自己创建Model对象并将其传递给您返回的ModelAndView.在大多数情况下,这都是风格问题.