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