?
本文檔使用 php中文網(wǎng)手冊(cè) 發(fā)布
目錄
DispatcherPortlet
ViewRendererServlet
AbstractController
和 PortletContentGenerator
PortletWrappingController
PortletModeHandlerMapping
ParameterHandlerMapping
PortletModeParameterHandlerMapping
HandlerInterceptor
sHandlerInterceptorAdapter
ParameterMappingInterceptor
PortletMultipartResolver
Spring不僅支持傳統(tǒng)(基于Servlet)的Web開(kāi)發(fā),也支持JSR-168 Portlet開(kāi)發(fā)。 Portlet MVC框架盡可能多地采用Web MVC框架,使用相同的底層表現(xiàn)層抽象和整合技術(shù)。所以, 在繼續(xù)閱讀本章前,務(wù)必溫習(xí)第?13?章 Web MVC framework Web框架 和第?14?章 集成視圖技術(shù) 兩章。
請(qǐng)牢記,在Spring MVC中的概念和Spring Porlet MVC中的相同的同時(shí),JSR-168 Portlet 獨(dú)特的工作流程造成了一些顯著的差異。
Porlet工作流程和Servlet的主要差異在于,Portlet的請(qǐng)求處理有兩個(gè)獨(dú)特 的階段:動(dòng)作階段和顯示階段。動(dòng)作階段會(huì)有“后臺(tái)”數(shù)據(jù)改變或動(dòng)作的代碼,這些代碼 只會(huì)執(zhí)行一次。顯示階段會(huì)產(chǎn)生用戶每次刷新時(shí)的看到的顯示內(nèi)容。重要的是, 在單個(gè)請(qǐng)求的整個(gè)處理過(guò)程中,動(dòng)作階段只會(huì)被執(zhí)行一次,而顯示階段可能會(huì)被執(zhí)行多次。 這就提供了(并且要求)在改變系統(tǒng)持久狀態(tài)的活動(dòng)和產(chǎn)生顯示內(nèi)容的活動(dòng)之間 有一個(gè)清晰的分層。
這種兩階段的請(qǐng)求處理是JSR-168規(guī)范的一個(gè)優(yōu)點(diǎn),比如,可以自動(dòng)地更新動(dòng)態(tài)
的搜索結(jié)果,不需要用戶特意去再次執(zhí)行搜索。許多其它的Portlet MVC框架試圖向開(kāi)
發(fā)人員徹底隱藏這種兩階段處理,讓框架看上去盡可能和傳統(tǒng)的Servlet開(kāi)發(fā)相同 - 在我們
看來(lái),這種方式去掉了使用Portlet的一個(gè)主要好處,所以在Spring Portlet MVC
框架里分離的兩階段處理被保留了下來(lái),這主要表現(xiàn)在,Servlet版本的MVC類(lèi)將只
有一個(gè)方法來(lái)處理請(qǐng)求,而Portlet版本的MVC類(lèi)里將會(huì)有兩個(gè)方法:一個(gè)用在動(dòng)作
階段,另一個(gè)用在顯示階段。比如,在Servlet版本的 AbstractController
有
handleRequestInternal(..)
方法,Portlet版本的
AbstractController
有
handleActionRequestInternal(..)
和
handleRenderRequestInternal(..)
方法。
這個(gè)框架是圍繞著分發(fā)器DispatcherPortlet
設(shè)計(jì)的,分發(fā)器把請(qǐng)求轉(zhuǎn)發(fā)給處理
器。和Web框架的DispatcherServlet
一樣,
這個(gè)框架還有可配置的處理器映射和視圖解析,同時(shí)也支持文件上傳。
Portlet MVC不支持本地化解析和主題解析 - 它們是portal/portlet容器
的范疇,并不適合放在Spring框架里。但是,Spring里所有依賴本地化(比如消息的
國(guó)際化)仍舊可以工作,因?yàn)?code class="classname">DispatcherPortlet在以
DispatcherServlet
相同的方式暴露當(dāng)前的本地化信息。
缺省的處理器是一個(gè)非常簡(jiǎn)單的
Controller
接口,它提供了兩個(gè)方法:
void handleActionRequest(request,response)
ModelAndView handleRenderRequest(request,response)
這個(gè)框架包含了許多相同的控制器實(shí)現(xiàn)層次,比如,
AbstractController
,
SimpleFormController
等。它在數(shù)據(jù)綁定、命令對(duì)象使用、
模型處理和視圖解析等方面和Servlet框架相同。
這個(gè)框架利用了一個(gè)特殊的橋Servlet
ViewRendererServlet
來(lái)使用Servlet框架里的視圖顯示
功能,這樣,Portlet請(qǐng)求就被轉(zhuǎn)化為Servlet請(qǐng)求,Portlet視圖能夠以通常的
Servlet底層代碼來(lái)顯示。這意味著,在Portlet里仍能使用當(dāng)前所有的顯示方法,
如JSP、Velocity等。
Spring Portlet MVC支持Web Bean,這些Bean的生命周期在于當(dāng)前的HTTP請(qǐng)求
或HTTP Session
(一般的和全局的)里,這不是
框架自身的特性,而是由使用的容器的
WebApplicationContext
提供的。
第?3.4.4?節(jié) “其他作用域”詳細(xì)地描述了這些Bean的作用范圍。
Spring發(fā)布包帶有完整的Spring Portlet MVC示例,這個(gè)應(yīng)用演示了所有Spring Portlet MVC框架的功能和特色。
你可以在samples/petportal
目錄下找到這個(gè)'petportal'應(yīng)用。