最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

DispatcherServlet處理器的適配和處理解析

 更新時間:2023年06月27日 11:14:32   作者:程序員札記  
這篇文章主要為大家介紹了DispatcherServlet的處理器的適配和處理流程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

處理大致流程圖

獲取處理器適配器

適配器模式

為什么要處理器適配器,我們前面不是獲取處理器方法了么,直接調(diào)用就好啦。對沒錯,但是那可能只是一種處理器的方式,也就是HandlerMethod,以前還有另外的方式哦,比如實現(xiàn)Controller接口的:

還有實現(xiàn)HttpRequestHandler接口的:

他們的接口都不一樣,總得兼容吧,處理接口不一致的辦法不就是適配器模式嘛,你接口不同,我用不同的適配器來適配,對外都是統(tǒng)一接口,如果以后有新的實現(xiàn),我只要添加適配器即可,這里就是適配器模式的應(yīng)用啦。

DispatcherServlet的getHandlerAdapter

這里就是遍歷所有的處理器適配器,看哪個是適配的就直接返回了。

    protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
        if (this.handlerAdapters != null) {
            for (HandlerAdapter adapter : this.handlerAdapters) {
                if (adapter.supports(handler)) {
                    return adapter;
                }
            }
        }
        throw new ServletException("No adapter for handler [" + handler +
                "]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler");
    }

如何適配

RequestMappingHandlerAdapter的supports

判斷是否是HandlerMethod類型的。

    @Override
    public final boolean supports(Object handler) {
        return (handler instanceof HandlerMethod && supportsInternal((HandlerMethod) handler));
    }
    @Override
    protected boolean supportsInternal(HandlerMethod handlerMethod) {
        return true;
    }

HttpRequestHandlerAdapter的supports

是不是實現(xiàn)了HttpRequestHandler接口。

    @Override
    public boolean supports(Object handler) {
        return (handler instanceof HttpRequestHandler);
    }

SimpleControllerHandlerAdapter的supports

是不是實現(xiàn)了Controller接口。

    @Override
    public boolean supports(Object handler) {
        return (handler instanceof Controller);
    }

至于這些是什么時候初始化的,我就不說了,前面已經(jīng)把方法都演示過了,就是一些自動配置類里,自己可以去找啦,剩下的適配器自己可以也去看看。

處理器適配器處理

其實前面有攔截器,后面會說,還是說主要的,處理器適配器獲得到之后,要進行適配器調(diào)用啦,不同的適配器調(diào)用方式不一樣,但是核心還是調(diào)用處理器的方法啦:

mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

HttpRequestHandlerAdapter的handle

轉(zhuǎn)換成接口類型,調(diào)用接口。

    @Override
    @Nullable
    public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        ((HttpRequestHandler) handler).handleRequest(request, response);
        return null;
    }

SimpleControllerHandlerAdapter的handle

這個也一樣。

    @Override
    @Nullable
    public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        return ((Controller) handler).handleRequest(request, response);
    }

AbstractHandlerMethodAdapter的handle

這個是重點,我們要詳細說。

    @Override
    @Nullable
    public final ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        return handleInternal(request, response, (HandlerMethod) handler);
    }

RequestMappingHandlerAdapter的handleInternal

留出核心代碼,就是處理器處理,然后準(zhǔn)備response。

@Override
    protected ModelAndView handleInternal(HttpServletRequest request,
            HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
        ModelAndView mav;
        ...
        mav = invokeHandlerMethod(request, response, handlerMethod);//      
        ...
        prepareResponse(response);
        ...
        return mav;
    }

invokeHandlerMethod

這里面的才是重點,每個都挺復(fù)雜的,沒關(guān)系,我們一個個來看,新不追求太細節(jié)的東西,知道大致流程,大致的流程就是創(chuàng)建數(shù)據(jù)綁定工廠,這個東西就是做參數(shù)綁定用的,后面會介紹,然后是模型工廠,最終是要創(chuàng)建模型返回的,所以需要這個,而且數(shù)據(jù)綁定工廠也會封裝在里面。

然后初始化模型,會根據(jù)方法的參數(shù)來找解析器解析,找到的話就可以解析出參數(shù),最后封裝到模型里去,最后再調(diào)用處理器的方法處理,然后獲取模型和視圖返回??雌饋砗孟駴]多少東西,其實里面還是表深的。

@Nullable
    protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
            HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
        //先封裝一個
        ServletWebRequest webRequest = new ServletWebRequest(request, response);
        try {
            WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);//數(shù)據(jù)綁定工廠
            ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);//模型工廠
            //進行handlerMethod封裝
            ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
            if (this.argumentResolvers != null) {//設(shè)置參數(shù)解析器
                invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
            }
            if (this.returnValueHandlers != null) {//設(shè)置返回類型解析器
                invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
            }
            invocableMethod.setDataBinderFactory(binderFactory);//綁定工廠
            invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);//參數(shù)名探測器
            //創(chuàng)建ModelAndView容器
            ModelAndViewContainer mavContainer = new ModelAndViewContainer();
            mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));//獲取前面重定向來的屬性
            modelFactory.initModel(webRequest, mavContainer, invocableMethod);//初始化模型
            mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
            ...
            //調(diào)用處理方法
            invocableMethod.invokeAndHandle(webRequest, mavContainer);
            ...
            return getModelAndView(mavContainer, modelFactory, webRequest);
        }
        finally {
            webRequest.requestCompleted();
        }

以上就是DispatcherServlet的處理器的適配和處理解析的詳細內(nèi)容,更多關(guān)于DispatcherServlet處理器適配的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java 中的偽共享詳解及解決方案

    Java 中的偽共享詳解及解決方案

    這篇文章主要介紹了Java 中的偽共享詳解及解決方案,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • 遞歸之斐波那契數(shù)列java的3種方法

    遞歸之斐波那契數(shù)列java的3種方法

    這篇文章主要為大家詳細介紹了遞歸之斐波那契數(shù)列java的3種方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • java開發(fā)環(huán)境的完整搭建過程

    java開發(fā)環(huán)境的完整搭建過程

    這篇文章主要給大家介紹了關(guān)于java開發(fā)環(huán)境的完整搭建過程,文中介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • 淺析Java基于Socket的文件傳輸案例

    淺析Java基于Socket的文件傳輸案例

    這篇文章主要針對Java基于Socket的文件傳輸案例進行詳細解析,具有一定的參考價值,感興趣的朋友可以參考一下
    2016-02-02
  • Maven中兩個命令clean 和 install的使用

    Maven中兩個命令clean 和 install的使用

    Maven是一個項目管理和自動構(gòu)建工具,clean命令用于刪除項目中由先前構(gòu)建生成的target目錄,install命令用于將打包好的jar包安裝到本地倉庫中,供其他項目依賴使用,下面就來詳細的介紹一下這兩個命令
    2024-09-09
  • idea2020.2卡死在reading maven projects

    idea2020.2卡死在reading maven projects

    這篇文章主要介紹了idea2020.2卡死在reading maven projects,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Java8?Optional常用方法使用場景分析

    Java8?Optional常用方法使用場景分析

    這篇文章主要介紹了Java8?Optional常用方法使用場景,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • JPA之使用JPQL語句進行增刪改查

    JPA之使用JPQL語句進行增刪改查

    這篇文章主要介紹了JPA之使用JPQL語句進行增刪改查,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • 關(guān)于Java中的IO流總結(jié)(推薦)

    關(guān)于Java中的IO流總結(jié)(推薦)

    下面小編就為大家?guī)硪黄P(guān)于Java中的IO流總結(jié)(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • Maven打包的三種方式小結(jié)

    Maven打包的三種方式小結(jié)

    這篇文章給大家介紹了三種Maven打包的方式,使用maven-jar-plugin,使用maven-assembly-plugin和使用maven-shade-plugin這三種方式,通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-09-09

最新評論

西安市| 康平县| 六安市| 定安县| 绿春县| 平罗县| 焦作市| 沅江市| 清新县| 四川省| 微山县| 闸北区| 广安市| 光山县| 许昌市| 都昌县| 屏东县| 南京市| 黎川县| 慈利县| 探索| 乐安县| 长垣县| 朝阳县| 木里| 邯郸县| 汕头市| 盱眙县| 平和县| 扬中市| 洱源县| 吴旗县| 合水县| 定结县| 股票| 贞丰县| 临朐县| 日土县| 阜城县| 万山特区| 平顶山市|