栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

控制器处理程序方法支持的返回类型

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

控制器处理程序方法支持的返回类型

这是深入了解。

Spring提供了一个

DispatcherServlet
通常处理所有请求的类。它以其
doDispatch(HttpServletRequestrequest, 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.invokeAndHandleat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethodat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternalat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handleat 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将使用a

ViewNameMethodReturnValueHandler
来处理响应。

现在,由您决定使用哪种返回类型。如果要返回a

Model
以便可以在jsp视图中使用请求属性,则可以让Spring将
Model
实例传递给方法,也可以
Model
自己创建对象并将其传递给
ModelAndView
返回的对象。在大多数情况下,这都是风格问题。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/455362.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号