日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

关于Spring 中的PortletModeHandlerMapping

發布時間:2025/3/20 javascript 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于Spring 中的PortletModeHandlerMapping 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在Spring Portlet MVC中,我們可以用PortletModeHandlerMapping來將Portlet模式綁定到對應的Handler上,并且再這里可以聲明攔截器,示例代碼如下:

  • <bean?id="portletModeHandlerMapping"?class="org.springframework.web.portlet.handler.PortletModeHandlerMapping">?
  • ????????<property?name="portletModeMap">?
  • ????????????<map>?
  • ????????????????<entry?key="view">?
  • ????????????????????<bean?class="xx.xx.xx.envprovisioning.handlers.EnvProvisionFlowHandler"?/>?
  • ????????????????</entry>?
  • ????????????</map>?
  • ????????</property>?
  • ????????<property?name="interceptors">???
  • ????????????<list>???
  • ????????????????<ref?bean="envprovisionhandlerinterceptor"/>?
  • ????????????</list>???
  • ????????</property>?
  • ????</bean>?
  • 我們結合框架代碼來具體看下這個類是如何工作的。

    從最基本的看,它是事先了spring mvc portlet的HandlerMapping 接口,這個接口主要定義了getHandler()方法:

    ?

  • public?interface?HandlerMapping?{?
  • ?
  • ????HandlerExecutionChain?getHandler(PortletRequest?request)?throws?Exception;?
  • ?
  • }?
  • 這個接口的getHandler()方法可以返回對于某種PortletRequest(RenderRequest,ActionRequest,ResourceRequest)的對應的處理方法,并且返回一個HandlerExecutionChain對象,我們可以根據自己的需要注冊多個Handler(對應不同類型的PortletRequest)

    而在PortletModeHandlerMapping的父類AbstractHandlerMapping中給出了getHandler()的默認實現:

  • public?final?HandlerExecutionChain?getHandler(PortletRequest?request)?throws?Exception?{ ?
  • ????????Object?handler?=?getHandlerInternal(request); ?
  • ????????if?(handler?==?null)?{ ?
  • ????????????handler?=?getDefaultHandler(); ?
  • ????????} ?
  • ????????if?(handler?==?null)?{ ?
  • ????????????return?null; ?
  • ????????} ?
  • ????????//?Bean?name?or?resolved?handler? ?
  • ????????if?(handler?instanceof?String)?{ ?
  • ????????????String?handlerName?=?(String)?handler; ?
  • ????????????handler?=?getApplicationContext().getBean(handlerName); ?
  • ????????} ?
  • ????????return?getHandlerExecutionChain(handler,?request); ?
  • ????}?
  • ?從這里可以看出它會先調用getHandlerInternal(request), 這個方法是定義在AbstractMapBaseHandlerMapping類中,它用來從handlerMap中提取key(比如"view")等,然后,獲取Value(Handler的類名) 。

    然后在第10-14行,通過這個Handler的名字,來在Spring Application中建立起對應這個handler對應的bean,并且將控制權返回給執行Handler的執行鏈。

    ?

    而我們研究的PortletModelHandlerMapping類則主要用于從xml文件中讀取參數,設置攔截器等等。在PortletModeHandlerMapping對應的bean,(也就是我們定義在xml文件的Spring Application Context上下文定義的portletModeHandlerMapping)初始化時候,它會調用PortletModeHandlerMapping的initApplicationContext()方法,如下:

  • public?void?initApplicationContext()?throws?BeansException?{ ?
  • ????????super.initApplicationContext(); ?
  • ????????registerHandlersByMode(this.portletModeMap); ?
  • ????}?
  • 它回去調用父類的initApplicationContext()然后調用registerHandlerByMode(),我們分別看:

    ?

    對于initApplicationContext(),它會初始化攔截器的設定,也就是對應我們一開始的xml定義中的interceptors屬性,它會分別初始化并且使用這些攔截器:

  • protected?void?initApplicationContext()?throws?BeansException?{ ?
  • ????????extendInterceptors(this.interceptors); ?
  • ????????initInterceptors(); ?
  • ????}?
  • ?

    而對于registerHandlerByMode(this.portletModeMap),則會先讀取xml bean定義文件中的portletModeMap屬性,然后對于其中定義的每一對<map></map>元素,來根據其中的PortletMode來注冊/實例化對應的Handler ,這個我們已經在上文中討論過了。

    ?

    現在我們對這個過程已經一目了然了

    ?

    ?

    ?

    ?

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

    轉載于:https://blog.51cto.com/supercharles888/1159603

    總結

    以上是生活随笔為你收集整理的关于Spring 中的PortletModeHandlerMapping的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。