ServletInvocableHandlerMethod类简介说明

java-教程王 SpringMVC 发布时间:2022-01-01 08:56:08 阅读数:17823 1
下文讲述ServletInvocableHandlerMethod类的简介说明,如下所示:

ServletInvocableHandlerMethod类简介

HandlerAdapter在内部对于每个请求
都会实例化一个ServletInvocableHandlerMethod进行处理
ServletInvocableHandlerMethod在进行处理的时候
会分两部分别对请求跟响应进行处理

ServletInvocableHandlerMethod类继承关系

  Object 
     HandlerMethod
	    InvocableHandlerMethod
		   ServletInvocableHandlerMethod
		     ConcurrentResultHandlerMethod 

ServletInvocableHandlerMethod类构造函数

public ServletInvocableHandlerMethod(HandlerMethod handlerMethod) {
    //调用父类的构造函数
    super(handlerMethod);
	//获取@ResponseStatus的注解赋值给成员变量
    initResponseStatus();
}

invokeAndHandle() 调用HandlerMethod中控制器的指定方法

public void invokeAndHandle(ServletWebRequest webRequest,ModelAndViewContainer mavContainer, 
Object... providedArgs) throws Exception {
    // 关键 -> 1.执行控制器指定方法
    Object returnValue = invokeForRequest(webRequest, mavContainer, providedArgs);

    // 2.设置响应状态
    setResponseStatus(webRequest);

    // 3.判断请求是否处理完毕,根据返回值来判断。
    if (returnValue == null) {
        if (isRequestNotModified(webRequest) || 
            hasResponseStatus() || 
            mavContainer.isRequestHandled()) {

            // 为 true ,表示方法调用完毕
            mavContainer.setRequestHandled(true);
            return;
        }
    }else if (StringUtils.hasText(this.responseReason)) {
        mavContainer.setRequestHandled(true);
        return;
    }

    // 存在返回值时,可能还需进行视图解析
    mavContainer.setRequestHandled(false);

    try {
        // 处理返回值,在 MavContainer 中设置 ViewName
        // 并判断其是不是【重定向请求】
        this.returnValueHandlers.handleReturnValue(
            returnValue, 
            getReturnValueType(returnValue), 
            mavContainer, 
            webRequest);

    }catch (Exception ex) {
        // 抛出异常...
    }
}
//执行控制器指定方法
public Object invokeForRequest(NativeWebRequest request, ModelAndViewContainer mavContainer,
    Object... providedArgs) throws Exception {
    // 取得方法入参值
    Object[] args = getMethodArgumentValues(request, mavContainer, providedArgs);

    // 利用反射执行该方法,并取得返回值
    Object returnValue = doInvoke(args);
    return returnValue;
}
protected Object doInvoke(Object... args) throws Exception {

    // 设置方法的访问权限,BridgedMethod 表示控制器类的指定方法
    ReflectionUtils.makeAccessible(getBridgedMethod());
    try {
        // 关键 -> 利用反射执行该方法,Bean 表示控制器类名称
        return getBridgedMethod().invoke(getBean(), args);

    }catch (IllegalArgumentException ex) {
        // 抛出异常...
    }catch (InvocationTargetException ex) {
        // 抛出异常...
    }
}
ServletInvocableHandlerMethod对请求以及响应的处理
1. 处理请求的时候,会根据ServletInvocableHandlerMethod的属性argumentResolvers(这个属性是它的父类InvocableHandlerMethod中定义的)进行处理,其中argumentResolvers属性是一个HandlerMethodArgumentResolverComposite类 (这里使用了组合模式的一种变形) ,这个类是实现了HandlerMethodArgumentResolver接口的类,里面有各种实现了HandlerMethodArgumentResolver的list集合。

2. 处理响应的时候,会根据ServletInvocableHandlerMethod的属性returnValueHandlers(自身属性)进行处理,returnValueHandlers属性是一个HandlerMethodReturnValueHandlerComposite类 (这里使用了组合模式的一种变形),这个类是实现了HandlerMethodReturnValueHandler接口的类,里面有各种实现了HandlerMethodReturnValueHandler的List集合。
 
ServletInvocableHandlerMethod的returnValueHandlers和argumentResolvers这两个属性都是在ServletInvocableHandlerMethod进行实例化的时候被赋值的(使用RequestMappingHandlerAdapter的属性进行赋值);RequestMappingHandlerAdapter的argumentResolvers和returnValueHandlers这两个属性是在RequestMappingHandlerAdapter进行实例化的时候被Spring容器注入的
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaFramework/SpringMVC/202201/2110.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者