关于Spring 中的PortletModeHandlerMapping


在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的执行链。

  • 1
  • 2
  • 下一页

相关内容