亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring?MVC策略模式之MethodArgumentResolver源碼分析

發布時間:2023-05-09 17:44:33 來源:億速云 閱讀:221 作者:iii 欄目:開發技術

今天小編給大家分享一下Spring MVC策略模式之MethodArgumentResolver源碼分析的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

    正文  

    Spring MVC 是一個基于 MVC 設計模式的Web框架,它的核心就是 DispatcherServlet,它相當于請求的中央處理器。在 DispatcherServlet 中,它使用了 MethodArgumentResolver 來解析方法參數。

           MethodArgumentResolver 采用一種策略模式,在 Handler 的方法被調用前,Spring MVC 會自動將 HTTP 請求中的參數轉換成方法參數。MethodArgumentResolver 接口的作用就是允許開發人員自定義參數解析器,以便更好地解析 HTTP 請求中的參數。

    例子

           我們可以通過實現 MethodArgumentResolver 接口來創建自己的參數解析器。MethodArgumentResolver 通過 supportsParameter() 這個方法用來判斷參數是否可以被當前解析器解析。如果返回 true,則調用 resolveArgument() 方法來解析參數。

    下面是一個簡單的例子,演示如何實現一個自定義的 MethodArgumentResolver:

    public class CustomArgumentResolver implements MethodArgumentResolver {
        @Override
        public boolean supportsParameter(MethodParameter parameter) {
            return parameter.getParameterType().equals(CustomObject.class);
        }
        @Override
        public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
            CustomObject customObject = new CustomObject();
            customObject.setName(webRequest.getParameter("name"));
            customObject.setAge(Integer.parseInt(webRequest.getParameter("age")));
            return customObject;
        }
    }

           在上面的例子中,我們實現了一個 CustomArgumentResolver,用來解析 CustomObject 類型的參數。supportsParameter() 方法判斷參數類型是否為 CustomObject 類型,如果是則返回true。resolveArgument() 方法用來解析參數,將請求中的 "age" 和 "name" 參數設置到 CustomObject 對象中。

    源碼分析

           Spring MVC 中有很多默認的參數解析器,比如 RequestParamMethodArgumentResolver、PathVariableMethodArgumentResolver、ModelMethodProcessor 等。下面我們來看一下這些解析器的源碼實現。

    RequestParamMethodArgumentResolver:

    public class RequestParamMethodArgumentResolver implements HandlerMethodArgumentResolver {
        @Override
        public boolean supportsParameter(MethodParameter parameter) {
            return parameter.hasParameterAnnotation(RequestParam.class);
        }
        @Override
        public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
            // 獲取注解
            RequestParam annotation = parameter.getParameterAnnotation(RequestParam.class);
            String paramName = annotation.value();
            String defaultValue = annotation.defaultValue();
            boolean required = annotation.required();
            String[] paramValues = webRequest.getParameterValues(paramName);
            if (paramValues == null || paramValues.length == 0) {
                if (required) {
                    throw new MissingServletRequestParameterException(paramName, parameter.getParameterType().getSimpleName());
                }
                return defaultValue;
            }
            if (paramValues.length == 1) {
                return convertIfNecessary(paramValues[0], parameter.getParameterType());
            }
            return Arrays.stream(paramValues).map(value -> convertIfNecessary(value, parameter.getParameterType())).collect(Collectors.toList());
        }
    }

           RequestParamMethodArgumentResolver 用來解析請求中的 @RequestParam 注解參數

    supportsParameter() 方法判斷參數是否有 @RequestParam 注解,如果有則返回 true。

    resolveArgument()方法解析參數,獲取 RequestParam 注解的 value、defaultValue 和 required 屬性,然后根據參數名從請求中獲取參數值,最后將參數值轉換成目標類型。

    PathVariableMethodArgumentResolver:

    public class PathVariableMethodArgumentResolver implements HandlerMethodArgumentResolver {
        @Override
        public boolean supportsParameter(MethodParameter parameter) {
            return parameter.hasParameterAnnotation(PathVariable.class);
        }
        @Override
        public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
            PathVariable annotation = parameter.getParameterAnnotation(PathVariable.class);
            String attributeName = annotation.value();
            Map<String, String> uriTemplateVariables = (Map<String, String>) webRequest.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE, RequestAttributes.SCOPE_REQUEST);
            String attributeValue = uriTemplateVariables.get(attributeName);
            return convertIfNecessary(attributeValue, parameter.getParameterType());
        }
    }

           PathVariableMethodArgumentResolver 用來解析請求中的 @PathVariable 注解參數

    supportsParameter() 方法判斷參數是否有 @PathVariable 注解,如果有則返回 true。

    resolveArgument() 方法解析參數,獲取 @PathVariable 注解的 value 屬性,然后從請求中獲取 URI 模板變量的值,最后將變量值轉換成目標類型。

    ModelMethodProcessor:

    public class ModelMethodProcessor implements HandlerMethodReturnValueHandler {
        @Override
        public boolean supportsReturnType(MethodParameter returnType) {
            return Model.class.isAssignableFrom(returnType.getParameterType());
        }
        @Override
        public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {
            Model model = mavContainer.getModel();
            model.addAllAttributes((Map<String, ?>) returnValue);
        }
    }

    用來處理 Handler 方法的返回值,并將返回值添加到 Model中。

    supportsReturnType() 方法判斷返回類型是否為 Model 類型或其子類,如果是則返回 true。

    handleReturnValue() 方法將返回值轉換成 Map 類型,然后將 Map 中的鍵值對添加到 Model 中。

    以上就是“Spring MVC策略模式之MethodArgumentResolver源碼分析”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    平和县| 峨眉山市| 青浦区| 南充市| 普兰县| 阳春市| 聂拉木县| 泗洪县| 虎林市| 西吉县| 岳西县| 元阳县| 广水市| 大荔县| 建湖县| 南部县| 陇川县| 甘德县| 天柱县| 大厂| 浪卡子县| 泾源县| 贺州市| 屏山县| 连城县| 新巴尔虎左旗| 伊春市| 大埔区| 昭通市| 防城港市| 灵璧县| 碌曲县| 宜昌市| 栾川县| 哈尔滨市| 道真| 平度市| 阿图什市| 郁南县| 芷江| 房产|