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