在Spring Portlet MVC中,我們可以用PortletModeHandlerMapping來將Portlet模式綁定到對應的Handler上,並且再這裡可以聲明攔截器,示例代碼如下:
- <beanid="portletModeHandlerMapping"class="org.springframework.web.portlet.handler.PortletModeHandlerMapping">
- <propertyname="portletModeMap">
- <map>
- <entrykey="view">
- <beanclass="xx.xx.xx.envprovisioning.handlers.EnvProvisionFlowHandler"/>
- </entry>
- </map>
- </property>
- <propertyname="interceptors">
- <list>
- <refbean="envprovisionhandlerinterceptor"/>
- </list>
- </property>
- </bean>
我們結合框架代碼來具體看下這個類是如何工作的。
從最基本的看,它是事先了spring mvc portlet的HandlerMapping 接口,這個接口主要定義了getHandler()方法:
- publicinterface HandlerMapping {
- HandlerExecutionChain getHandler(PortletRequest request) throws Exception;
- }
這個接口的getHandler()方法可以返回對於某種PortletRequest(RenderRequest,ActionRequest,ResourceRequest)的對應的處理方法,並且返回一個HandlerExecutionChain對象,我們可以根據自己的需要注冊多個Handler(對應不同類型的PortletRequest)
而在PortletModeHandlerMapping的父類AbstractHandlerMapping中給出了getHandler()的默認實現:
- publicfinal HandlerExecutionChain getHandler(PortletRequest request) throws Exception {
- Object handler = getHandlerInternal(request);
- if (handler == null) {
- handler = getDefaultHandler();
- }
- if (handler == null) {
- returnnull;
- }
- // 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的執行鏈。