这是一个深入的了解。
春天提供了一个DispatcherServlet
通常,该类处理您的所有请求。它在其doDispatch(HttpServletRequest request, HttpServletResponse response)
method
// Actually invoke the handler.
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
where 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 中已知的实现类.
例如,如果您返回一个字符串,Spring 将使用ViewNameMethodReturnValueHandler来处理响应。
现在,使用哪种返回类型取决于您。如果您想退货Model
所以你可以在你的jsp视图中使用request属性,你可以让Spring传递一个Model
您的方法的实例,或者您可以创建Model
反对自己并将其传递给ModelAndView
您的回报。在大多数情况下,这是风格问题。