歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 關於Spring 中的PortletModeHandlerMapping

關於Spring 中的PortletModeHandlerMapping

日期:2017/3/1 9:59:56   编辑:Linux編程

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

  1. <beanid="portletModeHandlerMapping"class="org.springframework.web.portlet.handler.PortletModeHandlerMapping">
  2. <propertyname="portletModeMap">
  3. <map>
  4. <entrykey="view">
  5. <beanclass="xx.xx.xx.envprovisioning.handlers.EnvProvisionFlowHandler"/>
  6. </entry>
  7. </map>
  8. </property>
  9. <propertyname="interceptors">
  10. <list>
  11. <refbean="envprovisionhandlerinterceptor"/>
  12. </list>
  13. </property>
  14. </bean>

我們結合框架代碼來具體看下這個類是如何工作的。

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

  1. publicinterface HandlerMapping {
  2. HandlerExecutionChain getHandler(PortletRequest request) throws Exception;
  3. }

這個接口的getHandler()方法可以返回對於某種PortletRequest(RenderRequest,ActionRequest,ResourceRequest)的對應的處理方法,並且返回一個HandlerExecutionChain對象,我們可以根據自己的需要注冊多個Handler(對應不同類型的PortletRequest)

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

  1. publicfinal HandlerExecutionChain getHandler(PortletRequest request) throws Exception {
  2. Object handler = getHandlerInternal(request);
  3. if (handler == null) {
  4. handler = getDefaultHandler();
  5. }
  6. if (handler == null) {
  7. returnnull;
  8. }
  9. // Bean name or resolved handler?
  10. if (handler instanceof String) {
  11. String handlerName = (String) handler;
  12. handler = getApplicationContext().getBean(handlerName);
  13. }
  14. return getHandlerExecutionChain(handler, request);
  15. }

從這裡可以看出它會先調用getHandlerInternal(request), 這個方法是定義在AbstractMapBaseHandlerMapping類中,它用來從handlerMap中提取key(比如"view")等,然後,獲取Value(Handler的類名) 。

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

Copyright © Linux教程網 All Rights Reserved