16.2.  DispatcherPortlet

Portlet MVC是一个请求驱动的Web MVC框架,它围绕着Portlet设计,把请求 转发给控制器,提供了便利的Porltet应用开发功能。而且,Spring的 DispatcherPortlet功能远远不止这些,它和Spring ApplicationContext完全集成,使得开发人员 能够使用Spring其它部分的每个功能。

DispatcherPortlet和一般的Portlet一样, 在Web应用的portlet.xml中声明:

<portlet>
	<portlet-name>sample</portlet-name>
	<portlet-class>org.springframework.web.portlet.DispatcherPortlet</portlet-class>
	<supports>
		<mime-type>text/html</mime-type>
		<portlet-mode>view</portlet-mode>
	</supports>
	<portlet-info>
		<title>Sample Portlet</title>
	</portlet-info>
</portlet>

现在需要配置DispatcherPortlet

在Portlet MVC框架里,每个DispatcherPortlet都有自己的 WebApplicationContext,它接管了所有在根 WebApplicationContext定义的Bean。我们可以 在Portlet作用范围内对这些Bean进行重载,重载后的Bean可以定义成对于特定的Portlet实例可见。

在初始化 DispatcherPortlet时,框架会在Web应用的WEB-INF 目录下寻找[portlet-name]-portlet.xml,生成在其中定义的Bean(会覆盖在全局范围里名字相同的Bean的定义)。

DispatcherPortlet用到的配置文件位置 可以通过Portlet初始化参数来修改(下面有详细的描述)。

Spring的DispatcherPortlet会用一些特殊的Bean 来处理请求和显示视图。这些Spring包含的Bean和其它的Bean一样,可以在 WebApplicationContext里进行配置。每 个Bean下面都会有详细的描述。这里,只是让你知道它们, 我们继续讨论DispatcherPortlet。大多数的Bean都有缺省配置,所以不需要担心它们的配置。

表 16.1. WebApplicationContext中特殊的Bean

名词 解释
处理器映射 (第 16.5 节 “处理器映射”) 一个前置和后置的处理器以及控制器的列表,这些控制器 通过匹配特定的条件(比如,由控制器指定的Portlet模式), 从而得到执行。
控制器 (第 16.4 节 “控制器”)是MVC的一员, 是提供(或至少可以访问)具体功能的Bean
视图解析器 (第 16.6 节 “视图和它们的解析”) 能够将 视图名字对应到视图定义。
分段(multipart)解析器 (第 16.7 节 “Multipart文件上传支持”) 能够处理 从HTML表单上传的文件
处理器异常解析器 (第 16.8 节 “异常处理”) 能够将异常对应到视图,或实现某种复杂的异常处理代码

DispatcherPortlet配置好后,请求进入到特定 DispatcherPortlet时,它开始处理。下面描述了 DispatcherPortlet处理请求的完整过程:

  1. PortletRequest.getLocale()返回 的Locale绑定在请求上,这使得在处理请求时(如显示视图、准备数据等), 代码能够使用Locale。

  2. 如果在ActionRequest里 指定了分段解析器,框架会在请求里寻找分段,如果找到了, 会把它们包装在MultipartActionRequest 里,供在后续处理中使用。(关于分段处理的进一步信息见第 16.7 节 “Multipart文件上传支持”)。

  3. 寻找合适的处理器。如果找到了,这个处理器关联的执行链 (前置处理器、后置处理器和控制器)会被按序执行来准备模型。

  4. 如果有模型返回,视图通过视图解析器进行显示,视图解析器是在 WebApplicationContext配置好的。如果没有模型 返回(可能由于预处理器或后处理器拦截了请求,比如安全原因),就不会有视图显示 因为有可能请求已经被处理了。

WebApplicationContext里 定义的异常处理解析器能够捕获在处理请求时可能抛出的异常,借助这些解析器, 我们可以对在捕获特定异常时的操作进行自定义。

通过在portlet.xml文件里增加Context参数或者Portlet 初始化参数,可以对Spring的DispatcherPortlet进行自定义。 下面列出了几种可能。

表 16.2. DispatcherPortlet 的初始化参数

参数 解释
contextClass 实现WebApplicationContext 的类,在Portlet初始化时用它初始化context。如果没有指定这个 参数,会使用XmlPortletApplicationContext
contextConfigLocation 传给context实例(由contextClass指定) 的字符串,指明context的位置。它可以(以逗号)分隔为多个字符串来 支持多个context(在定义过两次的bean有多个context位置时, 最后的位置起作用)。
namespace WebApplicationContext 的命名空间,缺省是[portlet-name]-portlet
viewRendererUrl ViewRendererServlet的URL, DispatcherPortlet可以访问。 (见 第 16.3 节 “ViewRendererServlet)。