?
Ce document utilise Manuel du site Web PHP chinois Libérer
目錄
DispatcherServlet
AbstractController
和 WebContentGenerator
MultiActionController
BeanNameUrlHandlerMapping
SimpleUrlHandlerMapping
HandlerInterceptor
)ViewResolver
)AcceptHeaderLocaleResolver
CookieLocaleResolver
SessionLocaleResolver
LocaleChangeInterceptor
MultipartResolver
form
標(biāo)簽input
標(biāo)簽checkbox
標(biāo)簽checkboxes
標(biāo)簽radiobutton
標(biāo)簽radiobuttons
標(biāo)簽password
標(biāo)簽select
標(biāo)簽option
標(biāo)簽options
標(biāo)簽textarea
標(biāo)簽hidden
標(biāo)簽errors
標(biāo)簽ControllerClassNameHandlerMapping
ModelMap
(ModelAndView
)RequestToViewNameTranslator
@Controller
定義一個(gè)控制器@RequestMapping
映射請(qǐng)求@RequestParam
綁定請(qǐng)求參數(shù)到方法參數(shù)@ModelAttribute
提供一個(gè)從模型到數(shù)據(jù)的鏈接@SessionAttributes
指定存儲(chǔ)在會(huì)話中的屬性WebDataBinder
初始化Spring的web框架圍繞DispatcherServlet
設(shè)計(jì)。
DispatcherServlet
的作用是將請(qǐng)求分發(fā)到不同的處理器。
Spring的web框架包括可配置的處理器(handler)映射、視圖(view)解析、本地化(local)解析、
主題(theme)解析以及對(duì)文件上傳的支持。Spring的Web框架中缺省的處理器是Controller
接口,這是一個(gè)非常簡(jiǎn)單的接口,僅包含ModelAndView handleRequest(request, response)
方法??梢酝ㄟ^(guò)實(shí)現(xiàn)這個(gè)接口來(lái)創(chuàng)建自己的控制器(也可以稱之為處理器),但是更推薦繼承Spring提供的一系列控制器,
比如AbstractController
、AbstractCommandController
和SimpleFormController
。注意,需要選擇正確的基類:如果沒(méi)有表單,就不需要一個(gè)FormController。
這是和Struts的一個(gè)主要區(qū)別。
從Spring 2.5開(kāi)始,使用Java 5或者以上版本的用戶可以采用基于注解的controller方式。
在實(shí)現(xiàn)傳統(tǒng)的Controller
及其子類時(shí)這是一種更好的替換方案,
其中提供了更為靈活的處理multi-action的能力。更多信息請(qǐng)參考第?13.12?節(jié) “基于注解的控制器配置”。
Spring Web MVC允許使用任何對(duì)象作為命令對(duì)象(或表單對(duì)象)- 不必實(shí)現(xiàn)某個(gè)特定于框架的接口或從某個(gè)基類繼承。
Spring的數(shù)據(jù)綁定相當(dāng)靈活,例如,它認(rèn)為類型不匹配這樣的錯(cuò)誤應(yīng)該是應(yīng)用級(jí)的驗(yàn)證錯(cuò)誤,而不是系統(tǒng)錯(cuò)誤。
所以你不需要為了保證表單內(nèi)容的正確提交,而重復(fù)定義一個(gè)和業(yè)務(wù)對(duì)象有相同屬性的表單對(duì)象來(lái)處理簡(jiǎn)單的無(wú)
類型字符串或者對(duì)字符串進(jìn)行轉(zhuǎn)換。這也是和Struts相比的另一個(gè)重要區(qū)別,Struts是圍繞
Action
和ActionForm
等基類構(gòu)建的。
和WebWork相比,Spring將對(duì)象細(xì)分成更多不同的角色:控制器(
Controller
)、可選的命令對(duì)象(Command Object)或表單對(duì)象(Form Object),
以及傳遞到視圖的模型(Model)。模型不僅包含命令對(duì)象或表單對(duì)象,而且也可以包含任何引用數(shù)據(jù)。
相比之下,WebWork的Action
將所有的這些角色都合并在一個(gè)單獨(dú)的對(duì)象里。
雖然WebWork的確允許在表單中使用現(xiàn)有的業(yè)務(wù)對(duì)象,但是必須把它們定義成相應(yīng)的Action
類的bean屬性。更重要的是,在進(jìn)行視圖層(View)運(yùn)算和表單賦值時(shí),WebWork使用的是同一個(gè)處理請(qǐng)求的
Action
實(shí)例。因此,引用數(shù)據(jù)也需要被定義成Action
的bean屬性。這樣一個(gè)對(duì)象就承擔(dān)了太多的角色(當(dāng)然,對(duì)于這個(gè)觀點(diǎn)仍有爭(zhēng)議)。
Spring的視圖解析相當(dāng)靈活。一個(gè)控制器甚至可以直接向response輸出一個(gè)視圖
(此時(shí)控制器返回ModelAndView的值必須是null)。在一般的情況下,一個(gè)ModelAndView
實(shí)例包含一個(gè)視圖名字和一個(gè)類型為Map
的model,
一個(gè)model是一些以bean的名字為key,以bean對(duì)象(可以是命令或form,也可以是其他的JavaBean)
為value的鍵值對(duì)。對(duì)視圖名稱的解析處理也是高度可配置的,可以通過(guò)bean的名字、屬性文件或者自定義的
ViewResolver
實(shí)現(xiàn)來(lái)進(jìn)行解析。實(shí)際上基于
Map
的model(也就是MVC中的M)是高度抽象的,適用于各種表現(xiàn)層技術(shù)。
也就是說(shuō),任何表現(xiàn)層都可以直接和Spring集成,無(wú)論是JSP、Velocity還是其它表現(xiàn)層技術(shù)。
Map model可以被轉(zhuǎn)換成合適的格式,比如JSP request attribute或者Velocity template model。
由于種種原因,許多團(tuán)隊(duì)傾向于使用其他的web框架。比如,某些團(tuán)隊(duì)已經(jīng)在其他的技術(shù)和工具方面進(jìn)行了 投入,他們希望充分利用已有的經(jīng)驗(yàn)。另外,Struts不僅有大量的書(shū)籍和工具,而且有許多開(kāi)發(fā)人員都熟悉它。 因此,如果能忍受Struts的架構(gòu)性缺陷,它仍然是web層一個(gè)不錯(cuò)的選擇。WebWork和其它的web框架也是這樣。
如果不打算使用Spring的web MVC框架,但仍希望使用Spring提供的其它功能,
可以很容易地將所選擇的web框架和Spring結(jié)合起來(lái)。只需通過(guò)Spring的
ContextLoadListener
啟動(dòng)一個(gè)root application context,就可以在
Struts或WebWork的Action中,通過(guò)ServletContext
屬性
(或者Spring提供的相應(yīng)輔助方法)進(jìn)行訪問(wèn)。請(qǐng)注意我們沒(méi)有提到任何具體的“plugins”,因此也你不
需要任何專門的集成工具。從web層的角度看,可以以root application context實(shí)例為入口,把Spring作為一個(gè)library使用。
即便不使用Spring的web MVC,仍可以使用Spring提供的服務(wù)以及所有注冊(cè)的bean。 在這里,Spring不會(huì)和Struts或WebWork競(jìng)爭(zhēng),它只是提供這些純粹的web MVC框架所沒(méi)有的功能, 例如:bean的配置、數(shù)據(jù)訪問(wèn)和事務(wù)處理。因此可以使用Spring的中間層或者數(shù)據(jù)訪問(wèn)層來(lái)增強(qiáng)你的應(yīng)用, 比如你可能只需要JDBC或Hibernate事務(wù)抽象。
Spring的web模塊提供了大量獨(dú)特的功能,包括:
清晰的角色劃分:控制器(controller)、驗(yàn)證器(validator)、
命令對(duì)象(command object)、表單對(duì)象(form object)、模型對(duì)象(model object)、
Servlet分發(fā)器(DispatcherServlet
)、
處理器映射(handler mapping)、視圖解析器(view resolver)等等。 每一個(gè)角色都可以由一個(gè)專門的對(duì)象來(lái)實(shí)現(xiàn)。
強(qiáng)大而直接的配置方式:將框架類和應(yīng)用程序類都能作為JavaBean配置,支持跨多個(gè)context的引用,例如,在web控制器中對(duì)業(yè)務(wù)對(duì)象和驗(yàn)證器(validator)的引用。
可適配、非侵入:可以根據(jù)不同的應(yīng)用場(chǎng)景,選擇合適的控制器子類 (simple型、command型、form型、wizard型、multi-action型或者自定義),而不是從單一控制器 (比如Action/ActionForm)繼承。
可重用的業(yè)務(wù)代碼:可以使用現(xiàn)有的業(yè)務(wù)對(duì)象作為命令或表單對(duì)象,而不需要去擴(kuò)展某個(gè)特定框架的基類。
可定制的綁定(binding) 和驗(yàn)證(validation):比如將類型不匹配作為應(yīng)用級(jí)的驗(yàn)證錯(cuò)誤, 這可以保存錯(cuò)誤的值。再比如本地化的日期和數(shù)字綁定等等。在其他某些框架中,你只能使用字符串表單對(duì)象, 需要手動(dòng)解析它并轉(zhuǎn)換到業(yè)務(wù)對(duì)象。
可定制的handler mapping和view resolution:Spring提供從最簡(jiǎn)單的URL映射, 到復(fù)雜的、專用的定制策略。與某些web MVC框架強(qiáng)制開(kāi)發(fā)人員使用單一特定技術(shù)相比,Spring顯得更加靈活。
靈活的model轉(zhuǎn)換:在Springweb框架中,使用基于Map
的
鍵/值對(duì)來(lái)達(dá)到輕易地與各種視圖技術(shù)的集成。
可定制的本地化和主題(theme)解析:支持在JSP中可選擇地使用Spring標(biāo)簽庫(kù)、支持JSTL、支持Velocity(不需要額外的中間層)等等。
簡(jiǎn)單而強(qiáng)大的JSP標(biāo)簽庫(kù)(Spring Tag Library):支持包括諸如數(shù)據(jù)綁定和主題(theme) 之類的許多功能。它提供在標(biāo)記方面的最大靈活性。如欲了解詳情,請(qǐng)參閱附錄附錄?D, spring.tld
JSP表單標(biāo)簽庫(kù):在Spring2.0中引入的表單標(biāo)簽庫(kù),使得在JSP中編寫(xiě) 表單更加容易。如欲了解標(biāo)簽庫(kù)詳情,請(qǐng)參閱附錄附錄?E, spring-form.tld
Spring Bean的生命周期可以被限制在當(dāng)前的HTTP Request或者HTTP Session
。
準(zhǔn)確的說(shuō),這并非Spring MVC框架本身特性,而應(yīng)歸屬于Sping MVC使用的WebApplicationContext容器。
該功能在第?3.4.4?節(jié) “其他作用域”有詳細(xì)描述。