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

这是深入了解.

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.在大多数情况下,这都是风格问题.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值