DispatcherPortlet 是Spring MVC Portlet的前端控制器:

 

(1)发送Portlet请求到恰当的处理器(Controller)

  1. protected HandlerExecutionChain getHandler(PortletRequest request) 
  2.    throws Exception 
  3.  { 
  4.    for (HandlerMapping hm : this.handlerMappings) { 
  5.      if (this.logger.isDebugEnabled()) { 
  6.        this.logger.debug( 
  7.          "Testing handler map [" + hm + "] in DispatcherPortlet with name '" + getPortletName() + "'"); 
  8.      } 
  9.      HandlerExecutionChain handler = hm.getHandler(request); 
  10.      if (handler != null) { 
  11.        return handler; 
  12.      } 
  13.    } 
  14.    return null
  15.  } 

(2) 用ViewResolver来根据视图名解析对应的要映射到的视图

  1. protected View resolveViewName(String viewName, Map model, PortletRequest request) 
  2.     throws Exception 
  3.   { 
  4.     for (ViewResolver viewResolver : this.viewResolvers) { 
  5.       View view = viewResolver.resolveViewName(viewName, request.getLocale()); 
  6.       if (view != null) { 
  7.         return view; 
  8.       } 
  9.     } 
  10.     return null; 
  11.   } 

(3) 分发请求(包含最终被解析的视图名+Model中的数据)到ViewRenderRequest来渲染视图

 

  1. protected void doRender(View view, Map model, PortletRequest request, MimeResponse response) 
  2.    throws Exception 
  3.  { 
  4.    request.setAttribute(ViewRendererServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE, getPortletApplicationContext()); 
  5.  
  6.    request.setAttribute(ViewRendererServlet.VIEW_ATTRIBUTE, view); 
  7.    request.setAttribute(ViewRendererServlet.MODEL_ATTRIBUTE, model); 
  8.  
  9.    getPortletContext().getRequestDispatcher(this.viewRendererUrl).include(request, response); 
  10.  }