17.2. DispatcherPortlet
17.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都有缺省 配置,所以你不需要担心它们的配置。
表 17.1. WebApplicationContext
里的特殊的Bean
名词 | 解释 |
---|---|
处理器映射 | (第 17.5 节 “处理器映射”) 一个前置和后置的处理器以及控制器的列表,这些控制器 通过匹配特定的条件(比如,由控制器指定的Portlet模式), 从而得到执行。 |
控制器 | (第 17.4 节 “控制器”)是MVC的一员, 是提供(或至少可以访问)具体功能的Bean |
视图解析器 | (第 17.6 节 “视图和它们的解析”) 能够将 视图名字对应到视图定义。 |
分段(multipart)解析器 | (第 17.7 节 “Multipart文件上传支持”) 能够处理 从HTML表单上传的文件 |
处理器异常解析器 | (第 17.8 节 “异常处理”) 能够将异常对应到视图,或实现某种复杂的异常处理代码 |
在DispatcherPortlet
配置好后,请求进入到特定 DispatcherPortlet
时,它开始处理。下面描述了 DispatcherPortlet
处理请求的完整过程:
PortletRequest.getLocale()
返回 的Locale绑定在请求上,这使得在处理请求时(如显示视图、准备数据等), 代码能够使用Locale。如果在
ActionRequest
里 指定了分段解析器,框架会在请求里寻找分段,如果找到了, 会把它们包装在MultipartActionRequest
里,供在后续处理中使用。(关于分段处理的进一步信息见第 17.7 节 “Multipart文件上传支持” )。寻找合适的处理器。如果找到了,这个处理器关联的执行链 (前置处理器、后置处理器和控制器)会被按序执行来准备模型。
如果有模型返回,视图通过视图解析器进行显示,视图解析器是在
WebApplicationContext
配置好的。如果没有模型 返回(可能由于预处理器或后处理器拦截了请求,比如安全原因),就不会有视图显示 因为有可能请求已经被处理了。
在WebApplicationContext
里 定义的异常处理解析器能够捕获在处理请求时可能抛出的异常,借助这些解析器, 我们可以对在捕获特定异常时的操作进行自定义。
通过在portlet.xml
文件里增加Context参数或者Portlet 初始化参数,可以对Spring的DispatcherPortlet
进行自定义。 下面列出了几种可能。
表 17.2. DispatcherPortlet
的初始化参数
参数 | 解释 |
---|---|
contextClass | 实现WebApplicationContext 的类,在Portlet初始化时用它初始化context。如果没有指定这个 参数,会使用XmlPortletApplicationContext 。 |
contextConfigLocation | 传给context实例(由contextClass 指定) 的字符串,指明context的位置。它可以(以逗号)分隔为多个字符串来 支持多个context(在定义过两次的bean有多个context位置时, 最后的位置起作用)。 |
namespace | WebApplicationContext 的命名空间,缺省是[portlet-name]-portlet 。 |
viewRendererUrl | ViewRendererServlet 的URL, DispatcherPortlet 可以访问。 (见 第 17.3 节 “ViewRendererServlet ”)。 |