这是深入了解。
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(returnType);
返回适当的处理程序。的HandlerMethodReturnValueHandler
是具有一个接口supportsReturnType
方法,该方法返回true
,如果处理程序支持该类型(String
,View
,ResponseEntity
,等。(外表支持的返回类型))。因此,该方法返回它找到的第一个处理程序,该处理程序支持该类型并运行它。
Spring在初始化时会注册的完整实现HandlerMethodReturnValueHandler
。基本上所有已知的实现类都在其javadoc中。
例如,如果您返回一个String,Spring将使用aViewNameMethodReturnValueHandler
来处理响应。
现在,由您决定使用哪种返回类型。如果要返回aModel
以便可以在jsp视图中使用请求属性,则可以让Spring将Model
实例传递给方法,也可以Model
自己创建对象并将其传递给ModelAndView
返回的对象。在大多数情况下,这都是风格问题。