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