The Spring Framework

## 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, javax.portlet.Portlet, javax.portlet.PortletConfig, ApplicationListener

    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` on Java 5+; there is no default on Java 1.4. 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. When running in a Java 5+ environment, 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!

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_EXECUTION_CHAIN_ATTRIBUTE` Request attribute to hold the currently chosen HandlerExecutionChain.
`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 LocaleContext` `buildLocaleContext(javax.portlet.PortletRequest request)` Build a LocaleContext for the given request, exposing the request's primary locale as current locale.
`protected javax.portlet.ActionRequest` `checkMultipart(javax.portlet.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(javax.portlet.ActionRequest request, javax.portlet.ActionResponse response)` Processes the actual dispatching to the handler for action requests.
`protected void` `doRender(View view, Map model, javax.portlet.RenderRequest request, javax.portlet.RenderResponse response)` Actually render the given view.
`protected void` `doRenderService(javax.portlet.RenderRequest request, javax.portlet.RenderResponse response)` Processes the actual dispatching to the handler for render requests.
`protected List` `getDefaultStrategies(ApplicationContext context, Class strategyInterface)` Create a List of default strategy objects for the given strategy interface.
`protected Object` `getDefaultStrategy(ApplicationContext context, Class strategyInterface)` Return the default strategy object for the given strategy interface.
`protected HandlerExecutionChain` `getHandler(javax.portlet.PortletRequest request, boolean cache)` 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(javax.portlet.PortletRequest request, javax.portlet.PortletResponse response)` No handler found -> throw appropriate exception.
`void` `onRefresh(ApplicationContext context)` This implementation calls `initStrategies(org.springframework.context.ApplicationContext)`.
`protected ModelAndView` `processHandlerException(javax.portlet.RenderRequest request, javax.portlet.RenderResponse response, Object handler, Exception ex)` Determine an error ModelAndView via the registered HandlerExceptionResolvers.
`protected void` `render(ModelAndView mv, javax.portlet.RenderRequest request, javax.portlet.RenderResponse response)` Render the given ModelAndView.
`protected View` `resolveViewName(String viewName, Map model, javax.portlet.RenderRequest 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` `setThreadContextInheritable(boolean threadContextInheritable)` Set whether to expose the LocaleContext and RequestAttributes as inheritable for child threads (using an `InheritableThreadLocal`).
`void` `setViewRendererUrl(String viewRendererUrl)` Set the URL to the ViewRendererServlet.

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

`createPortletApplicationContext, destroy, doDispatch, getContextClass, getContextConfigLocation, getNamespace, getPortletApplicationContext, getPortletContextAttributeName, getTitle, getUserinfoUsernameAttributes, getUsernameForRequest, initFrameworkPortlet, initPortletApplicationContext, initPortletBean, isPublishContext, isPublishEvents, onApplicationEvent, postProcessPortletApplicationContext, processAction, processRequest, refresh, setContextClass, setContextConfigLocation, setNamespace, setPublishContext, setPublishEvents, setUserinfoUsernameAttributes`

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

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

### HANDLER_EXECUTION_CHAIN_ATTRIBUTE

    public static final String HANDLER_EXECUTION_CHAIN_ATTRIBUTE

  Request attribute to hold the currently chosen HandlerExecutionChain. Only used for internal optimizations.

### 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.

### 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.

### setThreadContextInheritable

    public void setThreadContextInheritable(boolean threadContextInheritable)

  Set whether to expose the LocaleContext and RequestAttributes as inheritable for child threads (using an `InheritableThreadLocal`).

  Default is "false", to avoid side effects on spawned background threads. Switch this to "true" to enable inheritance for custom child threads which are spawned during request processing and only used for this request (that is, ending after their initial task, without reuse of the thread).

  WARNING: Do not use inheritance for child threads if you are accessing a thread pool which is configured to potentially add new threads on demand (e.g. a JDK `ThreadPoolExecutor`), since this will expose the inherited context to such a pooled thread.

### 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 Object getDefaultStrategy(ApplicationContext context,
                                        Class strategyInterface)
                                 throws BeansException

  Return the default strategy object for the given strategy interface.

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

  Parameters:
    `context` - the current Portlet ApplicationContext
    `strategyInterface` - the strategy interface
  Returns:
    the corresponding strategy object
  Throws:
    `BeansException` - if initialization failed
  See Also:
    `getDefaultStrategies(org.springframework.context.ApplicationContext, java.lang.Class)`

### getDefaultStrategies

    protected List getDefaultStrategies(ApplicationContext context,
                                        Class strategyInterface)
                                 throws BeansException

  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
  Throws:
    `BeansException` - if initialization failed

### createDefaultStrategy

    protected Object createDefaultStrategy(ApplicationContext context,
                                           Class clazz)
                                    throws BeansException

  Create a default strategy.

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

  Parameters:
    `context` - the current Portlet ApplicationContext
    `clazz` - the strategy implementation class to instantiate
  Returns:
    the fully configured strategy instance
  Throws:
    `BeansException` - if initialization failed
  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(javax.portlet.ActionRequest request,
                                   javax.portlet.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(javax.portlet.RenderRequest request,
                                   javax.portlet.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)`

### buildLocaleContext

    protected LocaleContext buildLocaleContext(javax.portlet.PortletRequest request)

  Build a LocaleContext for the given request, exposing the request's primary locale as current locale.

  Parameters:
    `request` - current HTTP request
  Returns:
    the corresponding LocaleContext

### checkMultipart

    protected javax.portlet.ActionRequest checkMultipart(javax.portlet.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(javax.portlet.PortletRequest request,
                                               boolean cache)
                                        throws Exception

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

  Parameters:
    `request` - current portlet request
    `cache` - whether to cache the HandlerExecutionChain in a request attribute
  Returns:
    the HandlerExceutionChain, or null if no handler could be found
  Throws:
    `Exception`

### noHandlerFound

    protected void noHandlerFound(javax.portlet.PortletRequest request,
                                  javax.portlet.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 javax.portlet.PortletException

  Return the HandlerAdapter for this handler object.

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

### processHandlerException

    protected ModelAndView processHandlerException(javax.portlet.RenderRequest request,
                                                   javax.portlet.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

### render

    protected void render(ModelAndView mv,
                          javax.portlet.RenderRequest request,
                          javax.portlet.RenderResponse 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,
                                   javax.portlet.RenderRequest 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,
                            javax.portlet.RenderRequest request,
                            javax.portlet.RenderResponse 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

The Spring Framework

Copyright © 2002-2008 The Spring Framework.