SpringMvc中HandlerMethodReturnVal

2019-05-24  本文已影响0人  昨日已逝去

github原文链接 https://github.com/DespairYoke/java-advance。创作不易,请给个免费的star,已表支持。

示例

@Controller
public class HelloController {

    @GetMapping(value = "hello")
    public String index(String name) {
        System.out.println(name);
        return "index";
    }

}

请求示例: http://localhost:8080/spring-mvc/hello?name=zwd

我们知道当浏览器发来请求时,我们会去HandlerMapping中找到对应的请求地址,获得响应的处理方法如hello,封装在HandlerExecutionChain中,而HandlerExecutionChain中有个HandlerMethod,是需要处理的对象。再根据HandlerMethod找到对应的HandlerAdapter去处理请求。经过一系列处理,最后请求转发到ServletInvocableHandlerMethod中。可以从RequestMappingHandlerAdapter看到下面这段代码。

ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);

下面我们跳过其他,转到ServletInvocableHandlerMethod。ServletInvocableHandlerMethod应该同时负责处理返回值的工作。再往下看可以发现,是通过

public void invokeAndHandle(ServletWebRequest webRequest, ModelAndViewContainer mavContainer,Object... providedArgs) throws Exception {
    this.returnValueHandlers.handleReturnValue(
            returnValue, getReturnValueType(returnValue), mavContainer, webRequest);
}

这个方法对HandlerMethod进行处理的,再跟踪下去,发现了下面的方法:

public void handleReturnValue(@Nullable Object returnValue, MethodParameter returnType,
        ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {
    HandlerMethodReturnValueHandler handler = selectHandler(returnValue, returnType);
    handler.handleReturnValue(returnValue, returnType, mavContainer, webRequest);
}
public void handleReturnValue(@Nullable Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {
    if (returnValue instanceof CharSequence) {
        String viewName = returnValue.toString();
        mavContainer.setViewName(viewName);
        if (isRedirectViewName(viewName)) {
            mavContainer.setRedirectModelScenario(true);
        }
    }
}

可以看到只是把returnValue放入mavContrainerviewName中。

上一篇下一篇

猜你喜欢

热点阅读