类 DispatcherPortlet

  • 所有已实现的接口:
    EventListener, EventPortlet, Portlet, PortletConfig, ResourceServingPortlet, Aware, ApplicationListener<ContextRefreshedEvent>, EnvironmentAware, EnvironmentCapable

    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 Apache 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!

    从以下版本开始:
    2.0
    作者:
    William G. Thompson, Jr., John A. Lewis, Juergen Hoeller
    另请参阅:
    Controller, ViewRendererServlet, ContextLoaderListener
    • 字段详细资料

      • 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.
        另请参阅:
        常量字段值
      • 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.
      • pageNotFoundLogger

        protected static final Log pageNotFoundLogger
        Additional logger to use when no mapped handler is found for a request.
    • 方法详细资料

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

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

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

        参数:
        context - the current Portlet ApplicationContext
        strategyInterface - the strategy interface
        返回:
        the List of corresponding strategy objects
      • getMultipartResolver

        public PortletMultipartResolver getMultipartResolver()
        Obtain this portlet's PortletMultipartResolver, if any.
        返回:
        the PortletMultipartResolver used by this portlet, or null if none (indicating that no multipart support is available)
      • 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.
        参数:
        request - current HTTP request
        返回:
        the processed request (multipart wrapper if necessary)
        抛出:
        MultipartException
      • exposeActionException

        protected void exposeActionException​(PortletRequest request,
                                             StateAwareResponse response,
                                             Exception ex)
        Expose the given action exception to the given response.
        参数:
        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.
        参数:
        mv - the ModelAndView to render
        request - current portlet render request
        response - current portlet render response
        抛出:
        Exception - if there's a problem rendering the view
      • resolveViewName

        protected View resolveViewName​(String viewName,
                                       Map<String,​?> 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.

        参数:
        viewName - the name of the view to resolve
        model - the model to be passed to the view
        request - current portlet render request
        返回:
        the View object, or null if none found
        抛出:
        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)
      • doRender

        protected void doRender​(View view,
                                Map<String,​?> model,
                                PortletRequest request,
                                MimeResponse response)
                         throws Exception
        Actually render the given view.

        The default implementation delegates to ViewRendererServlet.

        参数:
        view - the View to render
        model - the associated model
        request - current portlet render/resource request
        response - current portlet render/resource response
        抛出:
        Exception - if there's a problem rendering the view
      • doDispatch

        protected void doDispatch​(PortletRequestDispatcher dispatcher,
                                  PortletRequest request,
                                  MimeResponse response)
                           throws Exception
        Perform a dispatch on the given PortletRequestDispatcher.

        The default implementation uses a forward for resource requests and an include for render requests.

        参数:
        dispatcher - the PortletRequestDispatcher to use
        request - current portlet render/resource request
        response - current portlet render/resource response
        抛出:
        Exception - if there's a problem performing the dispatch
      • processHandlerException

        protected ModelAndView processHandlerException​(RenderRequest request,
                                                       RenderResponse response,
                                                       Object handler,
                                                       Exception ex)
                                                throws Exception
        Determine an error ModelAndView via the registered HandlerExceptionResolvers.
        参数:
        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
        返回:
        a corresponding ModelAndView to forward to
        抛出:
        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.
        参数:
        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
        返回:
        a corresponding ModelAndView to forward to
        抛出:
        Exception - if no error ModelAndView found