## org.springframework.web.portlet
Class DispatcherPortlet

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

All Implemented Interfaces:
  EventListener, Portlet, PortletConfig, Aware, ApplicationListener<ContextRefreshedEvent>, EnvironmentAware

    public class DispatcherPortlet

extends FrameworkPortlet

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, Nick Lothian and Eric Dalquist for their suggestions!

Since:
  2.0
Author:
  William G. Thompson, Jr., John A. Lewis, Juergen Hoeller
See Also:
  `Controller`, `ViewRendererServlet`, `ContextLoaderListener`

Field Summary
`static 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.
`static 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.
`static String` `DEFAULT_VIEW_RENDERER_URL` Default URL to ViewRendererServlet.
`static String` `HANDLER_ADAPTER_BEAN_NAME` Well-known name for the HandlerAdapter object in the bean factory for this namespace.
`static String` `HANDLER_EXCEPTION_RESOLVER_BEAN_NAME` Well-known name for the HandlerExceptionResolver object in the bean factory for this namespace.
`static String` `HANDLER_MAPPING_BEAN_NAME` Well-known name for the HandlerMapping object in the bean factory for this namespace.
`static String` `MULTIPART_RESOLVER_BEAN_NAME` Well-known name for the PortletMultipartResolver object in the bean factory for this namespace.
`static String` `PAGE_NOT_FOUND_LOG_CATEGORY` Log category to use when no mapped handler is found for a request.
`protected static Log` `pageNotFoundLogger` Additional logger to use when no mapped handler is found for a request.
`static String` `VIEW_RESOLVER_BEAN_NAME` Well-known name for the ViewResolver object in the bean factory for this namespace.

Fields inherited from class org.springframework.web.portlet.FrameworkPortlet
`DEFAULT_CONTEXT_CLASS, DEFAULT_NAMESPACE_SUFFIX, DEFAULT_USERINFO_ATTRIBUTE_NAMES, PORTLET_CONTEXT_PREFIX`

Fields inherited from class org.springframework.web.portlet.GenericPortletBean
`logger`

Constructor Summary
`DispatcherPortlet()`

Method Summary
`protected ActionRequest` `checkMultipart(ActionRequest request)` Convert the request into a multipart request, and make multipart resolver available.
`protected Object` `createDefaultStrategy(ApplicationContext context, Class<?> clazz)` Create a default strategy.
`protected void` `doActionService(ActionRequest request, ActionResponse response)` Processes the actual dispatching to the handler for action requests.
`protected void` `doEventService(EventRequest request, EventResponse response)` Processes the actual dispatching to the handler for event requests.
`protected void` `doRender(View view, Map model, PortletRequest request, MimeResponse response)` Actually render the given view.
`protected void` `doRenderService(RenderRequest request, RenderResponse response)` Processes the actual dispatching to the handler for render requests.
`protected void` `doResourceService(ResourceRequest request, ResourceResponse response)` Processes the actual dispatching to the handler for resource requests.
`protected void` `exposeActionException(PortletRequest request, StateAwareResponse response, Exception ex)` Expose the given action exception to the given response.

`protected

`<T> List<T>`

`

`getDefaultStrategies(ApplicationContext context, Class<T> strategyInterface)`
Create a List of default strategy objects for the given strategy interface.

`protected

`<T> T`

`

`getDefaultStrategy(ApplicationContext context, Class<T> strategyInterface)`
Return the default strategy object for the given strategy interface.

`protected HandlerExecutionChain` `getHandler(PortletRequest request)` Return the HandlerExecutionChain for this request.
`protected HandlerAdapter` `getHandlerAdapter(Object handler)` Return the HandlerAdapter for this handler object.
`PortletMultipartResolver` `getMultipartResolver()` Obtain this portlet's PortletMultipartResolver, if any.
`protected void` `initStrategies(ApplicationContext context)` Refresh the strategy objects that this portlet uses.
`protected void` `noHandlerFound(PortletRequest request, PortletResponse response)` No handler found -> throw appropriate exception.
`void` `onRefresh(ApplicationContext context)` This implementation calls `initStrategies(org.springframework.context.ApplicationContext)`.
`protected ModelAndView` `processHandlerException(RenderRequest request, RenderResponse response, Object handler, Exception ex)` Determine an error ModelAndView via the registered HandlerExceptionResolvers.
`protected ModelAndView` `processHandlerException(ResourceRequest request, ResourceResponse response, Object handler, Exception ex)` Determine an error ModelAndView via the registered HandlerExceptionResolvers.
`protected void` `render(ModelAndView mv, PortletRequest request, MimeResponse response)` Render the given ModelAndView.
`protected View` `resolveViewName(String viewName, Map model, PortletRequest request)` Resolve the given view name into a View object (to be rendered).
`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` `setForwardActionException(boolean forwardActionException)` Set whether to forward exceptions thrown during the action phase to the render phase via a session attribute.
`void` `setForwardEventException(boolean forwardEventException)` Set whether to forward exceptions thrown during the event phase to the render phase via a session attribute.
`void` `setViewRendererUrl(String viewRendererUrl)` Set the URL to the ViewRendererServlet.

Methods inherited from class org.springframework.web.portlet.FrameworkPortlet

`buildLocaleContext, createPortletApplicationContext, destroy, doDispatch, getContextClass, getContextConfigLocation, getNamespace, getPortletApplicationContext, getPortletContextAttributeName, getTitle, getUsernameForRequest, initFrameworkPortlet, initPortletApplicationContext, initPortletBean, onApplicationEvent, postProcessPortletApplicationContext, processAction, processEvent, processRequest, refresh, serveResource, setContextClass, setContextConfigLocation, setNamespace, setPublishContext, setPublishEvents, setThreadContextInheritable, setUserinfoUsernameAttributes`

Methods inherited from class org.springframework.web.portlet.GenericPortletBean
`addRequiredProperty, getPortletContext, getPortletName, init, initBeanWrapper, setEnvironment`

Methods inherited from class javax.portlet.GenericPortlet
`doEdit, doHelp, doView, getInitParameter, getInitParameterNames, getPortletConfig, getResourceBundle, init, render`

Methods inherited from class java.lang.Object
`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

Field Detail

### MULTIPART_RESOLVER_BEAN_NAME

    public static final String MULTIPART_RESOLVER_BEAN_NAME

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

  See Also:
    Constant Field Values

### HANDLER_MAPPING_BEAN_NAME

    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.

  See Also:
    `setDetectAllViewResolvers(boolean)`, Constant Field Values

### HANDLER_ADAPTER_BEAN_NAME

    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.

  See Also:
    `setDetectAllHandlerAdapters(boolean)`, Constant Field Values

### HANDLER_EXCEPTION_RESOLVER_BEAN_NAME

    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.

  See Also:
    `setDetectAllViewResolvers(boolean)`, Constant Field Values

### VIEW_RESOLVER_BEAN_NAME

    public static final String VIEW_RESOLVER_BEAN_NAME

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

  See Also:
    Constant Field Values

### DEFAULT_VIEW_RENDERER_URL

    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.

  See Also:
    Constant Field Values

### ACTION_EXCEPTION_SESSION_ATTRIBUTE

    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.

### ACTION_EXCEPTION_RENDER_PARAMETER

    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.

  See Also:
    Constant Field Values

### PAGE_NOT_FOUND_LOG_CATEGORY

    public static final String PAGE_NOT_FOUND_LOG_CATEGORY

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

  See Also:
    Constant Field Values

### pageNotFoundLogger

    protected static final Log pageNotFoundLogger

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

Constructor Detail

### DispatcherPortlet

    public DispatcherPortlet()

Method Detail

### setDetectAllHandlerMappings

    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.

### setDetectAllHandlerAdapters

    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.

### setDetectAllHandlerExceptionResolvers

    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.

### setDetectAllViewResolvers

    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.

### setForwardActionException

    public void setForwardActionException(boolean forwardActionException)

  Set whether to forward exceptions thrown during the action phase to the render phase via a session attribute.

  Default is true. Turn this off if you want the portlet container to provide immediate exception handling for action requests.

  See Also:
    `exposeActionException(javax.portlet.PortletRequest, javax.portlet.StateAwareResponse, Exception)`

### setForwardEventException

    public void setForwardEventException(boolean forwardEventException)

  Set whether to forward exceptions thrown during the event phase to the render phase via a session attribute.

  Default is false. Turn this on if you want the `DispatcherPortlet` to forward the exception to the render phase, similar to what it does for `action exceptions` by default.

### setViewRendererUrl

    public void setViewRendererUrl(String viewRendererUrl)

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

### onRefresh

    public void onRefresh(ApplicationContext context)

  This implementation calls `initStrategies(org.springframework.context.ApplicationContext)`.

  Overrides:
    `onRefresh` in class `FrameworkPortlet`
  Parameters:
    `context` - the current Portlet ApplicationContext
  See Also:
    `FrameworkPortlet.refresh()`

### initStrategies

    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.

### getDefaultStrategy

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

  Return the default strategy object for the given strategy interface.

  The default implementation delegates to `getDefaultStrategies(org.springframework.context.ApplicationContext, java.lang.Class<T>)`, expecting a single object in the list.

  Parameters:
    `context` - the current Portlet ApplicationContext
    `strategyInterface` - the strategy interface
  Returns:
    the corresponding strategy object
  See Also:
    `getDefaultStrategies(org.springframework.context.ApplicationContext, java.lang.Class<T>)`

### getDefaultStrategies

    protected <T> 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

### createDefaultStrategy

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

  Create a default strategy.

  The default implementation uses `AutowireCapableBeanFactory.createBean(java.lang.Class<T>)`.

  Parameters:
    `context` - the current Portlet ApplicationContext
    `clazz` - the strategy implementation class to instantiate
  Returns:
    the fully configured strategy instance
  See Also:
    `ApplicationContext.getAutowireCapableBeanFactory()`

### getMultipartResolver

    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)

### doActionService

    protected void doActionService(ActionRequest request,
                                   ActionResponse response)
                            throws Exception

  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.

  Specified by:
    `doActionService` in class `FrameworkPortlet`
  Parameters:
    `request` - current portlet action request
    `response` - current portlet Action response
  Throws:
    `Exception` - in case of any kind of processing failure
  See Also:
    `GenericPortlet.processAction(javax.portlet.ActionRequest, javax.portlet.ActionResponse)`

### doRenderService

    protected void doRenderService(RenderRequest request,
                                   RenderResponse response)
                            throws Exception

  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.

  Specified by:
    `doRenderService` in class `FrameworkPortlet`
  Parameters:
    `request` - current portlet render request
    `response` - current portlet render response
  Throws:
    `Exception` - in case of any kind of processing failure
  See Also:
    `GenericPortlet.doDispatch(javax.portlet.RenderRequest, javax.portlet.RenderResponse)`

### doResourceService

    protected void doResourceService(ResourceRequest request,
                                     ResourceResponse response)
                              throws Exception

  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.

  Specified by:
    `doResourceService` in class `FrameworkPortlet`
  Parameters:
    `request` - current portlet render request
    `response` - current portlet render response
  Throws:
    `Exception` - in case of any kind of processing failure
  See Also:
    `javax.portlet.GenericPortlet#serveResource`

### doEventService

    protected void doEventService(EventRequest request,
                                  EventResponse response)
                           throws Exception

  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.

  Specified by:
    `doEventService` in class `FrameworkPortlet`
  Parameters:
    `request` - current portlet action request
    `response` - current portlet Action response
  Throws:
    `Exception` - in case of any kind of processing failure
  See Also:
    `javax.portlet.GenericPortlet#processEvent`

### checkMultipart

    protected ActionRequest checkMultipart(ActionRequest request)
                                    throws MultipartException

  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)
  Throws:
    `MultipartException`

### getHandler

    protected HandlerExecutionChain getHandler(PortletRequest request)
                                        throws Exception

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

  Parameters:
    `request` - current portlet request
  Returns:
    the HandlerExecutionChain, or null if no handler could be found
  Throws:
    `Exception`

### noHandlerFound

    protected void noHandlerFound(PortletRequest request,
                                  PortletResponse response)
                           throws Exception

  No handler found -> throw appropriate exception.

  Parameters:
    `request` - current portlet request
    `response` - current portlet response
  Throws:
    `Exception` - if preparing the response failed

### getHandlerAdapter

    protected HandlerAdapter getHandlerAdapter(Object handler)
                                        throws PortletException

  Return the HandlerAdapter for this handler object.

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

### exposeActionException

    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)

### render

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

  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

### resolveViewName

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

  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)
  See Also:
    `ViewResolver.resolveViewName(java.lang.String, java.util.Locale)`

### doRender

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

  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

### processHandlerException

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

  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

### processHandlerException

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

  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