public class

DispatcherPortlet

extends FrameworkPortlet
java.lang.Object
   ↳ GenericPortlet
     ↳ org.springframework.web.portlet.GenericPortletBean
       ↳ org.springframework.web.portlet.FrameworkPortlet
         ↳ org.springframework.web.portlet.DispatcherPortlet

Class Overview

Central dispatcher for use within the Portlet MVC framework, e.g. for web UI controllers. Dispatches to registered handlers for processing a portlet request.

This portlet is very flexible: It can be used with just about any workflow, with the installation of the appropriate adapter classes. It offers the following functionality that distinguishes it from other request-driven portlet MVC frameworks:

  • It is based around a JavaBeans configuration mechanism.
  • It can use any HandlerMapping implementation - pre-built or provided as part of an application - to control the routing of requests to handler objects. Default is a DefaultAnnotationHandlerMapping. HandlerMapping objects can be defined as beans in the portlet's application context, implementing the HandlerMapping interface, overriding the default HandlerMapping if present. HandlerMappings can be given any bean name (they are tested by type).
  • It can use any HandlerAdapter; this allows for using any handler interface. The default adapter is SimpleControllerHandlerAdapter for Spring's Controller interface. A default AnnotationMethodHandlerAdapter will be registered as well. HandlerAdapter objects can be added as beans in the application context, overriding the default HandlerAdapter. Like HandlerMappings, HandlerAdapters can be given any bean name (they are tested by type).
  • The dispatcher's exception resolution strategy can be specified via a HandlerExceptionResolver, for example mapping certain exceptions to error pages. Default is none. Additional HandlerExceptionResolvers can be added through the application context. HandlerExceptionResolver can be given any bean name (they are tested by type).
  • Its view resolution strategy can be specified via a ViewResolver implementation, resolving symbolic view names into View objects. Default is InternalResourceViewResolver. ViewResolver objects can be added as beans in the application context, overriding the default ViewResolver. ViewResolvers can be given any bean name (they are tested by type).
  • The dispatcher's strategy for resolving multipart requests is determined by a PortletMultipartResolver implementation. An implementations for Jakarta Commons FileUpload is included: CommonsPortletMultipartResolver. The MultipartResolver bean name is "portletMultipartResolver"; default is none.

NOTE: The @RequestMapping annotation will only be processed if a corresponding HandlerMapping (for type level annotations) and/or HandlerAdapter (for method level annotations) is present in the dispatcher. This is the case by default. However, if you are defining custom HandlerMappings or HandlerAdapters, then you need to make sure that a corresponding custom DefaultAnnotationHandlerMapping and/or AnnotationMethodHandlerAdapter is defined as well - provided that you intend to use @RequestMapping.

A web application can define any number of DispatcherPortlets. Each portlet will operate in its own namespace, loading its own application context with mappings, handlers, etc. Only the root application context as loaded by ContextLoaderListener, if any, will be shared.

Thanks to Rainer Schmitz and Nick Lothian for their suggestions!

Summary

Constants
String ACTION_EXCEPTION_RENDER_PARAMETER This render parameter is used to indicate forward to the render phase that an exception occurred during the action phase.
String DEFAULT_VIEW_RENDERER_URL Default URL to ViewRendererServlet.
String HANDLER_ADAPTER_BEAN_NAME Well-known name for the HandlerAdapter object in the bean factory for this namespace.
String HANDLER_EXCEPTION_RESOLVER_BEAN_NAME Well-known name for the HandlerExceptionResolver object in the bean factory for this namespace.
String HANDLER_MAPPING_BEAN_NAME Well-known name for the HandlerMapping object in the bean factory for this namespace.
String MULTIPART_RESOLVER_BEAN_NAME Well-known name for the PortletMultipartResolver object in the bean factory for this namespace.
String PAGE_NOT_FOUND_LOG_CATEGORY Log category to use when no mapped handler is found for a request.
String VIEW_RESOLVER_BEAN_NAME Well-known name for the ViewResolver object in the bean factory for this namespace.
[Expand]
Inherited Constants
From class org.springframework.web.portlet.FrameworkPortlet
Fields
public static final String ACTION_EXCEPTION_SESSION_ATTRIBUTE Unlike the Servlet version of this class, we have to deal with the two-phase nature of the portlet request.
protected static final Log pageNotFoundLogger Additional logger to use when no mapped handler is found for a request.
[Expand]
Inherited Fields
From class org.springframework.web.portlet.FrameworkPortlet
From class org.springframework.web.portlet.GenericPortletBean
Public Constructors
DispatcherPortlet()
Public Methods
PortletMultipartResolver getMultipartResolver()
Obtain this portlet's PortletMultipartResolver, if any.
void onRefresh(ApplicationContext context)
This implementation calls initStrategies(ApplicationContext).
void setDetectAllHandlerAdapters(boolean detectAllHandlerAdapters)
Set whether to detect all HandlerAdapter beans in this portlet's context.
void setDetectAllHandlerExceptionResolvers(boolean detectAllHandlerExceptionResolvers)
Set whether to detect all HandlerExceptionResolver beans in this portlet's context.
void setDetectAllHandlerMappings(boolean detectAllHandlerMappings)
Set whether to detect all HandlerMapping beans in this portlet's context.
void setDetectAllViewResolvers(boolean detectAllViewResolvers)
Set whether to detect all ViewResolver beans in this portlet's context.
void setViewRendererUrl(String viewRendererUrl)
Set the URL to the ViewRendererServlet.
Protected Methods
ActionRequest checkMultipart(ActionRequest request)
Convert the request into a multipart request, and make multipart resolver available.
Object createDefaultStrategy(ApplicationContext context, Class<?> clazz)
Create a default strategy.
void doActionService(ActionRequest request, ActionResponse response)
Processes the actual dispatching to the handler for action requests.
void doEventService(EventRequest request, EventResponse response)
Processes the actual dispatching to the handler for event requests.
void doRender(View view, Map model, PortletRequest request, MimeResponse response)
Actually render the given view.
void doRenderService(RenderRequest request, RenderResponse response)
Processes the actual dispatching to the handler for render requests.
void doResourceService(ResourceRequest request, ResourceResponse response)
Processes the actual dispatching to the handler for resource requests.
void exposeActionException(PortletRequest request, StateAwareResponse response, Exception ex)
Expose the given action exception to the given response.
<T> List<T> getDefaultStrategies(ApplicationContext context, Class<T> strategyInterface)
Create a List of default strategy objects for the given strategy interface.
<T> T getDefaultStrategy(ApplicationContext context, Class<T> strategyInterface)
Return the default strategy object for the given strategy interface.
HandlerExecutionChain getHandler(PortletRequest request)
Return the HandlerExecutionChain for this request.
HandlerAdapter getHandlerAdapter(Object handler)
Return the HandlerAdapter for this handler object.
void initStrategies(ApplicationContext context)
Refresh the strategy objects that this portlet uses.
void noHandlerFound(PortletRequest request, PortletResponse response)
No handler found -> throw appropriate exception.
ModelAndView processHandlerException(RenderRequest request, RenderResponse response, Object handler, Exception ex)
Determine an error ModelAndView via the registered HandlerExceptionResolvers.
ModelAndView processHandlerException(ResourceRequest request, ResourceResponse response, Object handler, Exception ex)
Determine an error ModelAndView via the registered HandlerExceptionResolvers.
void render(ModelAndView mv, PortletRequest request, MimeResponse response)
Render the given ModelAndView.
View resolveViewName(String viewName, Map model, PortletRequest request)
Resolve the given view name into a View object (to be rendered).
[Expand]
Inherited Methods
From class org.springframework.web.portlet.FrameworkPortlet
From class org.springframework.web.portlet.GenericPortletBean
From class java.lang.Object
From interface org.springframework.context.ApplicationListener
From interface org.springframework.context.EnvironmentAware

Constants

public static final String ACTION_EXCEPTION_RENDER_PARAMETER

This render parameter is used to indicate forward to the render phase that an exception occurred during the action phase.

Constant Value: "actionException"

public static final String DEFAULT_VIEW_RENDERER_URL

Default URL to ViewRendererServlet. This bridge servlet is used to convert portlet render requests to servlet requests in order to leverage the view support in the org.springframework.web.view package.

Constant Value: "/WEB-INF/servlet/view"

public static final String HANDLER_ADAPTER_BEAN_NAME

Well-known name for the HandlerAdapter object in the bean factory for this namespace. Only used when "detectAllHandlerAdapters" is turned off.

Constant Value: "handlerAdapter"

public static final String HANDLER_EXCEPTION_RESOLVER_BEAN_NAME

Well-known name for the HandlerExceptionResolver object in the bean factory for this namespace. Only used when "detectAllHandlerExceptionResolvers" is turned off.

Constant Value: "handlerExceptionResolver"

public static final String HANDLER_MAPPING_BEAN_NAME

Well-known name for the HandlerMapping object in the bean factory for this namespace. Only used when "detectAllHandlerMappings" is turned off.

Constant Value: "handlerMapping"

public static final String MULTIPART_RESOLVER_BEAN_NAME

Well-known name for the PortletMultipartResolver object in the bean factory for this namespace.

Constant Value: "portletMultipartResolver"

public static final String PAGE_NOT_FOUND_LOG_CATEGORY

Log category to use when no mapped handler is found for a request.

Constant Value: "org.springframework.web.portlet.PageNotFound"

public static final String VIEW_RESOLVER_BEAN_NAME

Well-known name for the ViewResolver object in the bean factory for this namespace.

Constant Value: "viewResolver"

Fields

public static final String ACTION_EXCEPTION_SESSION_ATTRIBUTE

Unlike the Servlet version of this class, we have to deal with the two-phase nature of the portlet request. To do this, we need to pass forward any exception that occurs during the action phase, so that it can be displayed in the render phase. The only direct way to pass things forward and preserve them for each render request is through render parameters, but these are limited to String objects and we need to pass the Exception itself. The only other way to do this is in the session. The bad thing about using the session is that we have no way of knowing when we are done re-rendering the request and so we don't know when we can remove the objects from the session. So we will end up polluting the session with an old exception when we finally leave the render phase of one request and move on to something else.

protected static final Log pageNotFoundLogger

Additional logger to use when no mapped handler is found for a request.

Public Constructors

public DispatcherPortlet ()

Public Methods

public PortletMultipartResolver getMultipartResolver ()

Obtain this portlet's PortletMultipartResolver, if any.

Returns
  • the PortletMultipartResolver used by this portlet, or null if none (indicating that no multipart support is available)

public void onRefresh (ApplicationContext context)

This implementation calls initStrategies(ApplicationContext).

Parameters
context the current Portlet ApplicationContext

public void setDetectAllHandlerAdapters (boolean detectAllHandlerAdapters)

Set whether to detect all HandlerAdapter beans in this portlet's context. Else, just a single bean with name "handlerAdapter" will be expected.

Default is "true". Turn this off if you want this portlet to use a single HandlerAdapter, despite multiple HandlerAdapter beans being defined in the context.

public void setDetectAllHandlerExceptionResolvers (boolean detectAllHandlerExceptionResolvers)

Set whether to detect all HandlerExceptionResolver beans in this portlet's context. Else, just a single bean with name "handlerExceptionResolver" will be expected.

Default is true. Turn this off if you want this portlet to use a single HandlerExceptionResolver, despite multiple HandlerExceptionResolver beans being defined in the context.

public void setDetectAllHandlerMappings (boolean detectAllHandlerMappings)

Set whether to detect all HandlerMapping beans in this portlet's context. Else, just a single bean with name "handlerMapping" will be expected.

Default is true. Turn this off if you want this portlet to use a single HandlerMapping, despite multiple HandlerMapping beans being defined in the context.

public void setDetectAllViewResolvers (boolean detectAllViewResolvers)

Set whether to detect all ViewResolver beans in this portlet's context. Else, just a single bean with name "viewResolver" will be expected.

Default is true. Turn this off if you want this portlet to use a single ViewResolver, despite multiple ViewResolver beans being defined in the context.

public void setViewRendererUrl (String viewRendererUrl)

Set the URL to the ViewRendererServlet. That servlet is used to ultimately render all views in the portlet application.

Protected Methods

protected ActionRequest checkMultipart (ActionRequest request)

Convert the request into a multipart request, and make multipart resolver available. If no multipart resolver is set, simply use the existing request.

Parameters
request current HTTP request
Returns
  • the processed request (multipart wrapper if necessary)

protected Object createDefaultStrategy (ApplicationContext context, Class<?> clazz)

Create a default strategy.

The default implementation uses createBean(Class, int, boolean).

Parameters
context the current Portlet ApplicationContext
clazz the strategy implementation class to instantiate
Returns
  • the fully configured strategy instance

protected void doActionService (ActionRequest request, ActionResponse response)

Processes the actual dispatching to the handler for action requests.

The handler will be obtained by applying the portlet's HandlerMappings in order. The HandlerAdapter will be obtained by querying the portlet's installed HandlerAdapters to find the first that supports the handler class.

Parameters
request current portlet action request
response current portlet Action response
Throws
Exception in case of any kind of processing failure

protected void doEventService (EventRequest request, EventResponse response)

Processes the actual dispatching to the handler for event requests.

The handler will be obtained by applying the portlet's HandlerMappings in order. The HandlerAdapter will be obtained by querying the portlet's installed HandlerAdapters to find the first that supports the handler class.

Parameters
request current portlet action request
response current portlet Action response
Throws
Exception in case of any kind of processing failure

protected void doRender (View view, Map model, PortletRequest request, MimeResponse response)

Actually render the given view.

The default implementation delegates to ViewRendererServlet.

Parameters
view the View to render
model the associated model
request current portlet render request
response current portlet render response
Throws
Exception if there's a problem rendering the view

protected void doRenderService (RenderRequest request, RenderResponse response)

Processes the actual dispatching to the handler for render requests.

The handler will be obtained by applying the portlet's HandlerMappings in order. The HandlerAdapter will be obtained by querying the portlet's installed HandlerAdapters to find the first that supports the handler class.

Parameters
request current portlet render request
response current portlet render response
Throws
Exception in case of any kind of processing failure

protected void doResourceService (ResourceRequest request, ResourceResponse response)

Processes the actual dispatching to the handler for resource requests.

The handler will be obtained by applying the portlet's HandlerMappings in order. The HandlerAdapter will be obtained by querying the portlet's installed HandlerAdapters to find the first that supports the handler class.

Parameters
request current portlet render request
response current portlet render response
Throws
Exception in case of any kind of processing failure

protected void exposeActionException (PortletRequest request, StateAwareResponse response, Exception ex)

Expose the given action exception to the given response.

Parameters
request current portlet request
response current portlet response
ex the action exception (may also come from an event phase)

protected List<T> getDefaultStrategies (ApplicationContext context, Class<T> strategyInterface)

Create a List of default strategy objects for the given strategy interface.

The default implementation uses the "DispatcherPortlet.properties" file (in the same package as the DispatcherPortlet class) to determine the class names. It instantiates the strategy objects and satisifies ApplicationContextAware if necessary.

Parameters
context the current Portlet ApplicationContext
strategyInterface the strategy interface
Returns
  • the List of corresponding strategy objects

protected T getDefaultStrategy (ApplicationContext context, Class<T> strategyInterface)

Return the default strategy object for the given strategy interface.

The default implementation delegates to getDefaultStrategies(ApplicationContext, Class), expecting a single object in the list.

Parameters
context the current Portlet ApplicationContext
strategyInterface the strategy interface
Returns
  • the corresponding strategy object

protected HandlerExecutionChain getHandler (PortletRequest request)

Return the HandlerExecutionChain for this request. Try all handler mappings in order.

Parameters
request current portlet request
Returns
  • the HandlerExceutionChain, or null if no handler could be found
Throws
Exception

protected HandlerAdapter getHandlerAdapter (Object handler)

Return the HandlerAdapter for this handler object.

Parameters
handler the handler object to find an adapter for
Throws
if no HandlerAdapter can be found for the handler. This is a fatal error.
PortletException

protected void initStrategies (ApplicationContext context)

Refresh the strategy objects that this portlet uses.

May be overridden in subclasses in order to initialize further strategy objects.

protected void noHandlerFound (PortletRequest request, PortletResponse response)

No handler found -> throw appropriate exception.

Parameters
request current portlet request
response current portlet response
Throws
Exception if preparing the response failed

protected ModelAndView processHandlerException (RenderRequest request, RenderResponse response, Object handler, Exception ex)

Determine an error ModelAndView via the registered HandlerExceptionResolvers.

Parameters
request current portlet request
response current portlet response
handler the executed handler, or null if none chosen at the time of the exception (for example, if multipart resolution failed)
ex the exception that got thrown during handler execution
Returns
  • a corresponding ModelAndView to forward to
Throws
Exception if no error ModelAndView found

protected ModelAndView processHandlerException (ResourceRequest request, ResourceResponse response, Object handler, Exception ex)

Determine an error ModelAndView via the registered HandlerExceptionResolvers.

Parameters
request current portlet request
response current portlet response
handler the executed handler, or null if none chosen at the time of the exception (for example, if multipart resolution failed)
ex the exception that got thrown during handler execution
Returns
  • a corresponding ModelAndView to forward to
Throws
Exception if no error ModelAndView found

protected void render (ModelAndView mv, PortletRequest request, MimeResponse response)

Render the given ModelAndView. This is the last stage in handling a request. It may involve resolving the view by name.

Parameters
mv the ModelAndView to render
request current portlet render request
response current portlet render response
Throws
Exception if there's a problem rendering the view

protected View resolveViewName (String viewName, Map model, PortletRequest request)

Resolve the given view name into a View object (to be rendered).

Default implementations asks all ViewResolvers of this dispatcher. Can be overridden for custom resolution strategies, potentially based on specific model attributes or request parameters.

Parameters
viewName the name of the view to resolve
model the model to be passed to the view
request current portlet render request
Returns
  • the View object, or null if none found
Throws
Exception if the view cannot be resolved (typically in case of problems creating an actual View object)