|
The Spring Framework | |||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object javax.portlet.GenericPortlet org.springframework.web.portlet.GenericPortletBean org.springframework.web.portlet.FrameworkPortlet org.springframework.web.portlet.DispatcherPortlet
public class DispatcherPortlet
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:
HandlerMapping
implementation - pre-built or provided
as part of an application - to control the routing of requests to handler objects.
Default is PortletModeHandlerMapping
.
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).
HandlerAdapter
; this allows to use any handler interface.
The default adapter is SimpleControllerHandlerAdapter
for Spring's Controller
interface.
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).
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).
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).
PortletMultipartResolver
implementation.
An implementations for Jakarta Commons FileUpload is included:
CommonsPortletMultipartResolver
.
The MultipartResolver bean name is "portletMultipartResolver"; default is none.
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!
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(PortletRequest request)
Build a LocaleContext for the given request, exposing the request's primary locale as current locale. |
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 |
doRenderService(RenderRequest request,
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(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(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 void |
render(ModelAndView mv,
RenderRequest request,
RenderResponse response)
Render the given ModelAndView. |
protected View |
resolveViewName(String viewName,
Map model,
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.GenericPortletBean |
---|
addRequiredProperty, getPortletContext, getPortletName, init, initBeanWrapper |
Methods inherited from class javax.portlet.GenericPortlet |
---|
doEdit, doHelp, doView, getInitParameter, getInitParameterNames, getPortletConfig, getResourceBundle, getTitle, init, render |
Methods inherited from class java.lang.Object |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Field Detail |
---|
public static final String MULTIPART_RESOLVER_BEAN_NAME
public static final String HANDLER_MAPPING_BEAN_NAME
public static final String HANDLER_ADAPTER_BEAN_NAME
public static final String HANDLER_EXCEPTION_RESOLVER_BEAN_NAME
public static final String VIEW_RESOLVER_BEAN_NAME
public static final String DEFAULT_VIEW_RENDERER_URL
org.springframework.web.view
package.
public static final String HANDLER_EXECUTION_CHAIN_ATTRIBUTE
public static final String ACTION_EXCEPTION_SESSION_ATTRIBUTE
public static final String ACTION_EXCEPTION_RENDER_PARAMETER
public static final String PAGE_NOT_FOUND_LOG_CATEGORY
protected static final Log pageNotFoundLogger
Constructor Detail |
---|
public DispatcherPortlet()
Method Detail |
---|
public void setDetectAllHandlerMappings(boolean detectAllHandlerMappings)
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 setDetectAllHandlerAdapters(boolean detectAllHandlerAdapters)
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)
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 setDetectAllViewResolvers(boolean detectAllViewResolvers)
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)
public void setThreadContextInheritable(boolean threadContextInheritable)
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.
public void onRefresh(ApplicationContext context)
initStrategies(org.springframework.context.ApplicationContext)
.
onRefresh
in class FrameworkPortlet
context
- the current Portlet ApplicationContextFrameworkPortlet.refresh()
protected void initStrategies(ApplicationContext context)
May be overridden in subclasses in order to initialize further strategy objects.
protected Object getDefaultStrategy(ApplicationContext context, Class strategyInterface) throws BeansException
The default implementation delegates to getDefaultStrategies(org.springframework.context.ApplicationContext, java.lang.Class)
,
expecting a single object in the list.
context
- the current Portlet ApplicationContextstrategyInterface
- the strategy interface
BeansException
- if initialization failedgetDefaultStrategies(org.springframework.context.ApplicationContext, java.lang.Class)
protected List getDefaultStrategies(ApplicationContext context, Class strategyInterface) throws BeansException
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.
context
- the current Portlet ApplicationContextstrategyInterface
- the strategy interface
BeansException
- if initialization failedprotected Object createDefaultStrategy(ApplicationContext context, Class clazz) throws BeansException
The default implementation uses
AutowireCapableBeanFactory.createBean(java.lang.Class, int, boolean)
.
context
- the current Portlet ApplicationContextclazz
- the strategy implementation class to instantiate
BeansException
- if initialization failedApplicationContext.getAutowireCapableBeanFactory()
public PortletMultipartResolver getMultipartResolver()
null
if none (indicating that no multipart support is available)protected void doActionService(ActionRequest request, ActionResponse response) throws Exception
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.
doActionService
in class FrameworkPortlet
request
- current portlet action requestresponse
- current portlet Action response
Exception
- in case of any kind of processing failureGenericPortlet.processAction(javax.portlet.ActionRequest, javax.portlet.ActionResponse)
protected void doRenderService(RenderRequest request, RenderResponse response) throws Exception
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.
doRenderService
in class FrameworkPortlet
request
- current portlet render requestresponse
- current portlet render response
Exception
- in case of any kind of processing failureGenericPortlet.doDispatch(javax.portlet.RenderRequest, javax.portlet.RenderResponse)
protected LocaleContext buildLocaleContext(PortletRequest request)
request
- current HTTP request
protected ActionRequest checkMultipart(ActionRequest request) throws MultipartException
request
- current HTTP request
MultipartException
protected HandlerExecutionChain getHandler(PortletRequest request, boolean cache) throws Exception
request
- current portlet requestcache
- whether to cache the HandlerExecutionChain in a request attribute
Exception
protected void noHandlerFound(PortletRequest request, PortletResponse response) throws PortletException
request
- current portlet requestresponse
- current portlet response
PortletException
protected HandlerAdapter getHandlerAdapter(Object handler) throws PortletException
handler
- the handler object to find an adapter for
PortletException
- if no HandlerAdapter can be found for the handler.
This is a fatal error.protected ModelAndView processHandlerException(RenderRequest request, RenderResponse response, Object handler, Exception ex) throws Exception
request
- current portlet requestresponse
- current portlet responsehandler
- 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
Exception
- if no error ModelAndView foundprotected void render(ModelAndView mv, RenderRequest request, RenderResponse response) throws Exception
mv
- the ModelAndView to renderrequest
- current portlet render requestresponse
- current portlet render response
Exception
- if there's a problem rendering the viewprotected View resolveViewName(String viewName, Map model, RenderRequest request) throws Exception
Default implementations asks all ViewResolvers of this dispatcher. Can be overridden for custom resolution strategies, potentially based on specific model attributes or request parameters.
viewName
- the name of the view to resolvemodel
- the model to be passed to the viewrequest
- current portlet render request
Exception
- if the view cannot be resolved
(typically in case of problems creating an actual View object)ViewResolver.resolveViewName(java.lang.String, java.util.Locale)
|
The Spring Framework | |||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |