使用@Controller 注解的處理器的處理器方法,其返回值常用的有四種類型:
● 第一種:ModelAndView
● 第二種:String
● 第三種:無返回值 void
● 第四種:返回自定義類型對象
根據(jù)不同的情況,使用不同的返回值。
返回 ModelAndView(掌握)
若處理器方法處理完后,需要跳轉(zhuǎn)到其它資源,且又要在跳轉(zhuǎn)的資源間傳遞數(shù)據(jù),此時 處理器方法返回 ModelAndView 比較好。當(dāng)然,若要返回 ModelAndView,則處理器方法中 需要定義 ModelAndView 對象。
在使用時,若該處理器方法只是進行跳轉(zhuǎn)而不傳遞數(shù)據(jù),或只是傳遞數(shù)據(jù)而并不向任何 資源跳轉(zhuǎn)(如對頁面的 Ajax 異步響應(yīng)),此時若返回 ModelAndView,則將總是有一部分多 余:要么 Model 多余,要么 View 多余。即此時返回 ModelAndView 將不合適。
處理器方法返回的字符串可以指定邏輯視圖名,通過視圖解析器解析可以將其轉(zhuǎn)換為物理視圖地址,返回內(nèi)部資源邏輯視圖名,若要跳轉(zhuǎn)的資源為內(nèi)部資源,則視圖解析器可以使用 InternalResourceViewResolver 內(nèi)部資源視圖解析器。此時處理器方法返回的字符串就是要跳轉(zhuǎn)頁面的文件名去掉文件擴展名后的部分。這個字符串與視圖解析器中的 prefix、suffix 相結(jié)合,即可形成要訪問的 URI。
項目:returnString-viewName。在 receiveParameters-object 基礎(chǔ)上修改。直接修改處理器類 MyController
當(dāng)然,也可以直接返回資源的物理視圖名。不過,此時就不需要再在視圖解析器中再配 置前輟與后輟了。
對于處理器方法返回 void 的應(yīng)用場景,AJAX 響應(yīng)
若處理器對請求處理后,無需跳轉(zhuǎn)到其它任何資源,此時可以讓處理器方法返回 void。
例如,對于 AJAX 的異步請求的響應(yīng)。
項目:returnVoid-ajax。在 primary-annotation 基礎(chǔ)上進行修改。
Step1:導(dǎo)入 Jar 包
由于本項目中服務(wù)端向瀏覽器傳回的是 JSON(JavaScript Object Notation,JS 對象符號)數(shù)據(jù),需要使用一個工具類將字符串包裝為 JSON 格式,所以需要導(dǎo)入 JSON 的 Jar 包。
Step2:引入 jQuery 庫
由于本項目要使用 jQuery 的 ajax()方法提交 AJAX 請求,所以項目中需要引入 jQuery 的庫。在 WebRoot 下新建一個 Folder(文件夾),命名為 js,并將 jquery-1.11.1.js 文件放入其中。
當(dāng)然,該 jQuery 庫文件,需要在使用 ajax()方法的 index 頁面中引入。
Step3:定義index頁面
index頁面由兩部分內(nèi)容構(gòu)成:一個是<button/>,用于提交AJAX請求;一個是<script/>,用于處理 AJAX 請求。
點擊按鈕發(fā)起請求
Step4:定義對象Student
Step5:修改處理器類MyController
處理器對于AJAX請求中所提交的參數(shù),可以使用逐個接收的方式,也可以以對象的方式整體接收。只要保證AJAX請求參數(shù)與接收的對象類型屬性同名。
以逐個方式接收參數(shù):
Step6:刪除視圖頁面
由于是服務(wù)端直接向瀏覽器發(fā)回數(shù)據(jù),所以也就無需視圖頁面了,所以需要刪除WEB-INF中的jsp目錄及其中的show頁面。
JSON(JavaScript Object Notation)(官網(wǎng):http://www.json.org/是一種輕量級的數(shù)據(jù)交換格式。易于人閱讀和編寫。同時也易于機器解析和生成。JSON 采用完全獨立于語言的文本格式,這些特性使JSON 成為理想的數(shù)據(jù)交換語言。
JSON 的兩種結(jié)構(gòu)
● “名稱/值”對的集合。
例如{ name:”張三”, age : 23 }
● 值的有序列表,它被理解為數(shù)組。例如:[{ name:”張三”, age : 23 } , { name:”李力”, age : 28 }]
在JSON-Lib中“名稱/值”對的集合用JSONObject對象表示,數(shù)組用JSONArray對象表示。
常用的的json庫:json-lib , Jackson , google公司的gson和阿里巴巴的fastjson
處理器方法也可以返回Object對象。這個Object可以是Integer,String,自定義對象,Map,List等。但返回的對象不是作為邏輯視圖出現(xiàn)的,而是作為直接在頁面顯示的數(shù)據(jù)出現(xiàn)的。
返回對象,需要使用@ResponseBody注解,將轉(zhuǎn)換后的JSON數(shù)據(jù)放入到響應(yīng)體中。
A、導(dǎo)入Jar包
由于返回Object數(shù)據(jù),一般都是將數(shù)據(jù)轉(zhuǎn)化為了JSON對象后傳遞給瀏覽器頁面的。而這個由Object轉(zhuǎn)換為JSON,是由Jackson工具完成的。所以需要導(dǎo)入Jackson的相關(guān)Jar包。
B、注冊注解驅(qū)動
將Object數(shù)據(jù)轉(zhuǎn)化為JSON數(shù)據(jù),需要由消息轉(zhuǎn)換器HttpMessageConverter完成。而轉(zhuǎn)換器的開啟,需要由來完成。
SpringMVC使用消息轉(zhuǎn)換器實現(xiàn)請求數(shù)據(jù)和對象,處理器方法返回對象和響應(yīng)輸出之間的自動轉(zhuǎn)換。
當(dāng)Spring容器進行初始化過程中,在處創(chuàng)建注解驅(qū)動時,默認創(chuàng)建了七個HttpMessageConverter對象。也就是說,我們注冊,就是為了讓容器為我們創(chuàng)建HttpMessageConverter對象。
HttpMessageConverter接口: HttpMessageConverter 是Spring3.0 新添加的一個接口,負責(zé)將請求信息轉(zhuǎn)換為一個對象(類型為T),將對象(類型為T)輸出為響應(yīng)信息
HttpMessageConverter接口定義的方法:
boolean canRead(Class clazz,MediaType mediaType): 指定轉(zhuǎn)換器可以讀取的對象類型,即轉(zhuǎn)換器是否可將請求信息轉(zhuǎn)換為clazz 類型的對象,同時指定支持MIME 類型(text/html,applaiction/json等)
boolean canWrite(Class clazz,MediaType mediaType):指定轉(zhuǎn)換器是否可將clazz 類型的對象寫到響應(yīng)流中,響應(yīng)流支持的媒體類型在MediaType 中定義。
LIst getSupportMediaTypes():該轉(zhuǎn)換器支持的媒體類型。
T read(Class clazz,HttpInputMessage inputMessage):將請求信息流轉(zhuǎn)換為T 類型的對象。
void write(T t,MediaType contnetType,HttpOutputMessgae outputMessage):將T類型的對象寫到響應(yīng)流中,同時指定相應(yīng)的媒體類型為contentType
加入注解驅(qū)動后適配器類的messageConverters屬性值
若要返回非中文字符串,將前面返回數(shù)值型數(shù)據(jù)的返回值直接修改為字符串即可。但若返回的字符串中帶有中文字符,則接收方頁面將會出現(xiàn)亂碼。此時需要使用@RequestMapping的produces屬性指定字符集。
produces,產(chǎn)品,結(jié)果,即該屬性用于設(shè)置輸出結(jié)果類型。
項目:returnObject-String。
直接修改處理器即可。
返回自定義類型對象時,不能以對象的形式直接返回給客戶端瀏覽器,而是將對象轉(zhuǎn)換為JSON格式的數(shù)據(jù)發(fā)送給瀏覽器的。
由于轉(zhuǎn)換器底層使用了Jackson轉(zhuǎn)換方式將對象轉(zhuǎn)換為JSON數(shù)據(jù),所以需要導(dǎo)入Jackson的相關(guān)Jar包。
項目:returnObject-custom。在returnObject-string基礎(chǔ)上進行修改。
Step1:定義VO類
Step2:修改處理器MyController
Step3:修改index頁面
項目:returnObject-list。在returnObject-custom基礎(chǔ)上進行修改。
Step1:修改處理器MyController
Step2:修改 index 頁面