Вот углубленный взгляд.
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
где весна определяющей 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
, etc. (look for supported return types)). Таким образом, метод возвращает первый обработчик, который находит, который поддерживает этот тип и запускает его.
Весна, при инициализации, регистрирует целый набор реализаций HandlerMethodReturnValueHandler
. В основном все known implementing classes in its javadoc.
Например, если вы вернете строку, Spring будет использовать ViewNameMethodReturnValueHandler
для обработки ответа.
Теперь, тип возвращаемого типа зависит от вас. Если вы хотите вернуть Model
, чтобы вы могли использовать атрибуты запроса в своем представлении jsp, вы можете либо передать Spring пример Model
, либо самостоятельно создать объект Model
и передать его в ModelAndView
, который будет вам возвращен. В большинстве случаев это вопрос стиля.
Это не дубликат. Я хочу, чтобы внутренние детали реализации касались различий в (старой) весне 2.0 и (новой) весне 3.0 способам делать то же самое. –
Я дал ответ на 3.2+. Ларри З отправил ответ на версию до 3.2. То, что вы также можете сделать, это сделать метод Controller, поместить в него точку останова, затем отладить. Посмотрите на трассировку стека, когда вы находитесь внутри, чтобы увидеть связанные классы. Затем вы можете вернуться из своего метода, чтобы посмотреть, куда он идет, чтобы обработать возвращаемый тип. –