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
处理请求的完整过程:
PortletRequest.getLocale()
返回
的Locale绑定在请求上,这使得在处理请求时(如显示视图、准备数据等),
代码能够使用Locale。
如果在ActionRequest
里
指定了分段解析器,框架会在请求里寻找分段,如果找到了,
会把它们包装在MultipartActionRequest
里,供在后续处理中使用。(关于分段处理的进一步信息见第 16.7 节 “Multipart文件上传支持” )。
寻找合适的处理器。如果找到了,这个处理器关联的执行链 (前置处理器、后置处理器和控制器)会被按序执行来准备模型。
如果有模型返回,视图通过视图解析器进行显示,视图解析器是在
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 ”)。 |