Java EE企業(yè)級應(yīng)用開發(fā)教程課件 第6章 Spring MVC數(shù)據(jù)綁定和響應(yīng)_第1頁
Java EE企業(yè)級應(yīng)用開發(fā)教程課件 第6章 Spring MVC數(shù)據(jù)綁定和響應(yīng)_第2頁
Java EE企業(yè)級應(yīng)用開發(fā)教程課件 第6章 Spring MVC數(shù)據(jù)綁定和響應(yīng)_第3頁
Java EE企業(yè)級應(yīng)用開發(fā)教程課件 第6章 Spring MVC數(shù)據(jù)綁定和響應(yīng)_第4頁
Java EE企業(yè)級應(yīng)用開發(fā)教程課件 第6章 Spring MVC數(shù)據(jù)綁定和響應(yīng)_第5頁
已閱讀5頁,還剩113頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第6章SpringMVC數(shù)據(jù)綁定和響應(yīng)《JavaEE企業(yè)級應(yīng)用開發(fā)教程(Spring+SpringMVC+MyBatis)》學(xué)習(xí)目標(biāo)/Target了解數(shù)據(jù)綁定的概念,能夠簡述SpringMVC數(shù)據(jù)綁定的過程掌握簡單數(shù)據(jù)綁定,能夠使用SpringMVC默認(rèn)支持類型、簡單數(shù)據(jù)類型、POJO類型和自定義類型轉(zhuǎn)換進(jìn)行數(shù)據(jù)綁定掌握復(fù)雜數(shù)據(jù)綁定,能夠使用數(shù)組、集合、復(fù)雜POJO進(jìn)行數(shù)據(jù)綁定,以及進(jìn)行JSON數(shù)據(jù)綁定掌握頁面跳轉(zhuǎn),能夠?qū)崿F(xiàn)返回值為void、String類型和ModelAndView類型的頁面跳轉(zhuǎn)掌握數(shù)據(jù)回寫,能夠?qū)ζ胀ㄗ址蚃SON數(shù)據(jù)進(jìn)行數(shù)據(jù)回寫章節(jié)概述/Summary在開發(fā)Web應(yīng)用程序時,數(shù)據(jù)的傳遞和處理是至關(guān)重要的。SpringMVC框架提供了強大的數(shù)據(jù)綁定和響應(yīng)功能,使得開發(fā)者可以輕松地處理請求參數(shù)、表單數(shù)據(jù),并將處理結(jié)果以清晰的格式返回給客戶端。通過數(shù)據(jù)綁定,開發(fā)者可以將請求參數(shù)映射到Java對象,并進(jìn)行相應(yīng)的處理邏輯;而響應(yīng)功能則能夠幫助開發(fā)者構(gòu)建和返回適當(dāng)?shù)捻憫?yīng)數(shù)據(jù)給客戶端。本章將對SpringMVC框架中的數(shù)據(jù)綁定和響應(yīng)進(jìn)行詳細(xì)講解。目錄/Contents6.16.2SpringMVC簡介SpringMVC入門程序6.3SpringMVC的執(zhí)行流程6.4SpringMVC的請求映射6.5SpringMVC的請求映射SpringMVC簡介6.16.1

數(shù)據(jù)綁定概述先定一個小目標(biāo)!

先定一個小目標(biāo)!了解數(shù)據(jù)綁定的概念,能夠簡述SpringMVC數(shù)據(jù)綁定的過程6.1

數(shù)據(jù)綁定概述在程序運行時,SpringMVC接收到客戶端的請求后,會根據(jù)客戶端請求的參數(shù)和請求頭等數(shù)據(jù)信息,將客戶端請求中的參數(shù)以特定的方式轉(zhuǎn)換并綁定到處理器方法的參數(shù)。SpringMVC中將請求中的數(shù)據(jù)與處理器方法的參數(shù)建立連接和綁定的過程就是SpringMVC的數(shù)據(jù)綁定。在SpringMVC的數(shù)據(jù)綁定過程中,數(shù)據(jù)綁定組件DataBinder會對請求參數(shù)進(jìn)行解析,并進(jìn)行必要的類型轉(zhuǎn)換。如果類型轉(zhuǎn)換成功,DataBinder將請求參數(shù)的值綁定到處理器方法的參數(shù)上,從而完成了數(shù)據(jù)綁定的過程。如果類型轉(zhuǎn)換失敗,通常會拋出一個異常。6.1

數(shù)據(jù)綁定概述SpringMVC數(shù)據(jù)綁定的過程簡單數(shù)據(jù)綁定6.26.2簡單數(shù)據(jù)綁定SpringMVC請求參數(shù)的綁定是框架自動實現(xiàn)的,根據(jù)請求參數(shù)類型和參數(shù)個數(shù)等數(shù)據(jù)信息的復(fù)雜程度,可以將SpringMVC中的數(shù)據(jù)綁定分為簡單數(shù)據(jù)綁定和復(fù)雜數(shù)據(jù)綁定。簡單數(shù)據(jù)綁定不是特指哪一種數(shù)據(jù)類型的綁定,是指請求中的參數(shù)不是基于列表或多層級的數(shù)據(jù),參數(shù)直接和處理器方法的參數(shù)或參數(shù)的屬性進(jìn)行綁定。SpringMVC中簡單數(shù)據(jù)綁定一般分為默認(rèn)支持類型數(shù)據(jù)綁定、簡單數(shù)據(jù)類型綁定和POJO綁定,還可以使用自定義類型轉(zhuǎn)換器將特殊的數(shù)據(jù)轉(zhuǎn)換后進(jìn)行數(shù)據(jù)綁定。下面分別對這四種數(shù)據(jù)綁定進(jìn)行講解。6.2.1

默認(rèn)支持類型綁定先定一個小目標(biāo)!

先定一個小目標(biāo)!掌握SpringMVC默認(rèn)支持類型的數(shù)據(jù)綁定,能夠使用SpringMVC默認(rèn)支持類型進(jìn)行數(shù)據(jù)綁定6.2.1

默認(rèn)支持類型綁定SpringMVC為數(shù)據(jù)綁定提供了一些默認(rèn)支持的類型,當(dāng)使用SpringMVC默認(rèn)支持的類型作為處理器的參數(shù)類型時,SpringMVC的參數(shù)處理適配器能夠?qū)TTP請求中的參數(shù)自動轉(zhuǎn)換并綁定到處理器方法的參數(shù)上。SpringMVC常見的默認(rèn)支持的類型如下所示。①HttpServletRequest:用于獲取請求信息的類型,該類型的對象可以獲取請求的URL、請求的HTTP方法類型、請求參數(shù)等消息。②HttpServletResponse:用于處理響應(yīng)信息的類型,通過該類型的對象可以設(shè)置響應(yīng)的數(shù)據(jù)、響應(yīng)的類型、返回數(shù)據(jù)的格式等。③HttpSession:用于獲取Session中存放的對象的類型,通過該類型的對象可以對Session級別的數(shù)據(jù)進(jìn)行讀寫操作。④Model/ModelMap:Model是一個接口,ModelMap是一個類,Model的實現(xiàn)類對象和ModelMap對象都可以設(shè)置模型數(shù)據(jù),模型數(shù)據(jù)會填充到Request域中,以供視圖層使用。6.2.1

默認(rèn)支持類型綁定(1)創(chuàng)建項目文件6-1pom.xml源代碼在IDEA中創(chuàng)建一個名稱為chapter06的MavenWeb項目,創(chuàng)建SpringMVC的配置文件spring-mvc.xml并完成相關(guān)配置,并在項目的pom.xml文件中引入SpringMVC和Servlet的相關(guān)依賴,pom.xml文件如文件6-1所示。下面通過案例演示將請求中的數(shù)據(jù)綁定到HttpServletRequest類型的對象中。6.2.1

默認(rèn)支持類型綁定(2)創(chuàng)建處理器類文件6-2SpaceController.java源代碼在項目的src\main\java目錄下創(chuàng)建路徑名稱為com.itheima.controller的包,在包中創(chuàng)建處理器類SpaceController,在SpaceController類中定義方法getSpacecraftName(),用于獲取請求中參數(shù)spaceName的值,具體代碼如文件6-2所示。6.2.1

默認(rèn)支持類型綁定(3)測試效果啟動項目,在瀏覽器中訪問http://localhost:8080/chapter06/getSpacecraftName?spaceName=天宮一號,控制臺輸出信息如下圖所示。6.2.2 簡單數(shù)據(jù)類型綁定先定一個小目標(biāo)!

先定一個小目標(biāo)!掌握簡單數(shù)據(jù)類型綁定的數(shù)據(jù)綁定,能夠使用簡單數(shù)據(jù)類型進(jìn)行數(shù)據(jù)綁定6.2.2 簡單數(shù)據(jù)類型綁定簡單數(shù)據(jù)類型的綁定,就是指Java中基本類型(如int、double等)、基本數(shù)據(jù)類型的包裝類、String類型的數(shù)據(jù)綁定。在SpringMVC中進(jìn)行簡單類型的數(shù)據(jù)綁定,只需客戶端請求參數(shù)的名稱和處理器的參數(shù)名稱一致即可,請求參數(shù)會自動映射并匹配到處理器方法的參數(shù)完成數(shù)據(jù)綁定。6.2.2 簡單數(shù)據(jù)類型綁定getSpacecraft()方法源代碼下面通過案例演示,將請求中int類型和String類型的數(shù)據(jù)綁定到SpringMVC處理器方法的參數(shù)上。在文件6-2中定義方法getSpacecraft(),在該方法中定義一個int類型和一個String類型的參數(shù),用于后續(xù)綁定請求中攜帶的參數(shù),getSpacecraft()方法的代碼如下所示。6.2.2 簡單數(shù)據(jù)類型綁定啟動項目,在瀏覽器中訪問地址http://localhost:8080/chapter06/getSpacecraft?number=2&name=天宮二號,控制臺輸出信息如下圖所示。6.2.2 簡單數(shù)據(jù)類型綁定默認(rèn)情況下,進(jìn)行簡單數(shù)據(jù)類型的數(shù)據(jù)綁定時,處理器方法參數(shù)的名稱需要和請求中參數(shù)名稱保持一致,否則會導(dǎo)致處理器無法正確綁定并接收到請求中的參數(shù)。如果需要在兩者不一致的情況實現(xiàn)數(shù)據(jù)綁定,可以使用SpringMVC提供的@RequestParam注解實現(xiàn)。@RequestParam注解用于從請求中獲取參數(shù)的值并將其傳遞給處理器方法的參數(shù)。6.2.2 簡單數(shù)據(jù)類型綁定@RequestParam注解的屬性屬性說明value用于指定要綁定的請求參數(shù)的名稱,例如,@RequestParam(value="userId")Stringid,表示將請求中參數(shù)userId的值綁定到處理器方法的id參數(shù)上。如果當(dāng)前@RequestParam注解只使用vaule屬性,則可以省略value屬性名,如@RequestParam("userId")name與value屬性作用一致required用于指定參數(shù)是否必須,默認(rèn)是true,表示請求中一定要有相應(yīng)的參數(shù)defaultValue當(dāng)請求中不包含對應(yīng)的參數(shù),并且required屬性設(shè)置為false時,用于指定參數(shù)的默認(rèn)值6.2.2 簡單數(shù)據(jù)類型綁定@RequestParam注解的使用相對簡單,假設(shè)在瀏覽器中向地址http://localhost:8080/chapter06/getSpacecraft?nm=Spring發(fā)起請求,可以在getSpacecraft()方法中使用@RequestParam注解標(biāo)注參數(shù),具體代碼如下所示。@RequestMapping("/getSpacecraft")publicvoidgetSpacecraft(@RequestParam(value="nm",required=false,defaultValue="天宮二號")Stringname){ System.out.println("航天器名稱:"+name);}6.2.2 簡單數(shù)據(jù)類型綁定當(dāng)請求的映射方式是REST風(fēng)格時,上述對簡單類型數(shù)據(jù)綁定的方式就不太適用。為此,SpringMVC提供了@PathVariable注解,通過@PathVariable注解可以將URL中占位符參數(shù)綁定到處理器方法的參數(shù)中。@PathVariable注解有以下兩個常用屬性。①value:用于指定URL中占位符名稱。②required:是否必須提供占位符,默認(rèn)值為true。6.2.2 簡單數(shù)據(jù)類型綁定getPathVariable()方法源代碼下面通過案例對請求的映射方式是REST風(fēng)格時,簡單數(shù)據(jù)類型綁定進(jìn)行演示。在文件6-2中新增一個處理方法getPathVariable(),在該方法中使用@PathVariable注解進(jìn)行數(shù)據(jù)綁定,具體代碼如下所示。6.2.2 簡單數(shù)據(jù)類型綁定啟動項目,在瀏覽器中訪問地址http://localhost:8080/chapter06/space/天問一號,控制臺輸出信息如下圖所示。6.2.3 POJO類型綁定先定一個小目標(biāo)!

先定一個小目標(biāo)!掌握POJO類型綁定的數(shù)據(jù)綁定,能夠使用POJO類型進(jìn)行數(shù)據(jù)綁定6.2.3 POJO類型綁定在使用簡單數(shù)據(jù)類型綁定時,可以很容易地根據(jù)具體需求來定義方法中的參數(shù)類型和個數(shù),然而在實際應(yīng)用中,請求可能需要傳遞多個不同類型的參數(shù)數(shù)據(jù),如果還使用簡單數(shù)據(jù)類型進(jìn)行綁定,那么就需要手動編寫多個不同類型的參數(shù),這種操作顯然比較煩瑣。為解決這個問題,可以使用POJO(PlainOrdinaryJavaObject,簡單Java對象)類型進(jìn)行數(shù)據(jù)綁定。6.2.3 POJO類型綁定POJO類型的數(shù)據(jù)綁定指的是將請求中的多個參數(shù)(如請求參數(shù)、表單數(shù)據(jù)等)綁定到處理器方法的一個POJO上。通過POJO類型的數(shù)據(jù)綁定,可以將請求的參數(shù)整合到一個Java對象中,簡化了處理器方法對請求數(shù)據(jù)的處理。在POJO類型的數(shù)據(jù)綁定過程中,需要確保請求的參數(shù)名稱與要綁定的POJO類中的屬性名稱保持一致。只有在參數(shù)名稱與POJO類屬性名稱一致的情況下,SpringMVC才會自動將請求中的數(shù)據(jù)綁定到POJO對象的相應(yīng)屬性上。否則處理器方法中的POJO參數(shù)將無法獲取到請求中的相應(yīng)數(shù)據(jù),其屬性將被初始化為其默認(rèn)值。6.2.3 POJO類型綁定文件6-3Spacecraft

.java源代碼下面通過案例演示POJO類型的數(shù)據(jù)綁定。(1)創(chuàng)建POJO類在項目的src\main\java目錄下,創(chuàng)建一個com.itheima.pojo包,在該包下創(chuàng)建一個Spacecraft

類用于封裝航天器信息,具體如文件6-3所示。6.2.3 POJO類型綁定launch()方法源代碼(2)定義處理器方法在文件6-2的SpaceController類中,定義launch()方法用于接收航天器信息,具體代碼如下所示。6.2.3 POJO類型綁定(3)測試效果在文件6-2的SpaceController類中,定義launch()方法用于接收航天器信息,具體代碼如下所示。啟動項目,在Postman中填寫測試數(shù)據(jù)模擬表單數(shù)據(jù)的發(fā)送,其中請求的HTTP方法為POST,請求的URL為http://localhost:8080/chapter06/launch,攜帶的表單參數(shù)包含id和name,如下圖所示。6.2.3 POJO類型綁定(3)測試效果單擊“Send”按鈕發(fā)送請求,IDEA控制臺輸出信息如下圖所示。6.2.4 自定義類型轉(zhuǎn)換器先定一個小目標(biāo)!

先定一個小目標(biāo)!掌握自定義類型轉(zhuǎn)換器的使用,能夠使用自定義類型轉(zhuǎn)換器實現(xiàn)日期的數(shù)據(jù)綁定6.2.4 自定義類型轉(zhuǎn)換器SpringMVC默認(rèn)提供了一些常用的類型轉(zhuǎn)換器,這些類型轉(zhuǎn)換器,可以將客戶端提交的參數(shù)的數(shù)據(jù)類型自動轉(zhuǎn)換為處理器方法參數(shù)的數(shù)據(jù)類型。然而默認(rèn)類型轉(zhuǎn)換器并不能將提交的參數(shù)轉(zhuǎn)換為所有的類型。此時,就需要開發(fā)者自定義類型轉(zhuǎn)換器,來將參數(shù)轉(zhuǎn)換為程序所需要的類型。Spring框架提供了org.springframework.core.convert.converter.Converter接口作為類型轉(zhuǎn)換器,開發(fā)者可以通過實現(xiàn)Converter接口來自定義類型轉(zhuǎn)換器。Converter接口聲明如下。publicinterfaceConverter<S,T>{ Tconvert(Ssource);}6.2.4 自定義類型轉(zhuǎn)換器文件6-4DateConverter.java源代碼下面通過案例演示自定義類型轉(zhuǎn)換器轉(zhuǎn)換特殊數(shù)據(jù)類型并完成數(shù)據(jù)綁定,該案例要求實現(xiàn)Date類型的數(shù)據(jù)綁定(1)創(chuàng)建日期類型轉(zhuǎn)換器在項目的src\main\java目錄下,創(chuàng)建一個com.itheima.convert包,在該包下創(chuàng)建日期類型轉(zhuǎn)換器DateConverter類,并在DateConverter類中定義convert()方法,實現(xiàn)String類型轉(zhuǎn)換為Date類型,具體如文件6-4所示。6.2.4 自定義類型轉(zhuǎn)換器文件6-5spring-mvc.xml源代碼(2)配置日期類型轉(zhuǎn)換器為了讓SpringMVC知道并使用DateConverter類型轉(zhuǎn)換器,還需要在配置文件spring-mvc.xml中配置日期類型轉(zhuǎn)換器。spring-mvc.xml具體配置如文件6-5所示。6.2.4 自定義類型轉(zhuǎn)換器launchDate()方法源代碼(3)定義處理器方法在文件6-2的SpaceController類中定義方法launchDate(),用于綁定請求中的日期數(shù)據(jù),launchDate()方法代碼如下所示。6.2.4 自定義類型轉(zhuǎn)換器(4)效果測試啟動項目,在瀏覽器中訪問http://localhost:8080/chapter06/launchDate?date=2024-03-22,控制臺輸出信息如下圖所示。6.2.4 自定義類型轉(zhuǎn)換器除了XML方式之外,還可以通過@DateTimeFormat注解來簡化日期類型的格式轉(zhuǎn)換。使用@DateTimeFormat注解完成日期類型的格式轉(zhuǎn)換無需自定義類型轉(zhuǎn)換器,也無需在配置文件中定義轉(zhuǎn)換器工廠或格式化工廠,只需將@DateTimeFormat定義在方法的參數(shù)前面或成員變量上方,就可以為當(dāng)前參數(shù)或變量指定類型轉(zhuǎn)換規(guī)則。6.2.4 自定義類型轉(zhuǎn)換器修改后的launchDate()方法源代碼下面使用@DateTimeFormat注解修改案例,完成Date類型的數(shù)據(jù)綁定。(1)修改處理器方法修改SpaceController類中l(wèi)aunchDate()方法,使用@DateTimeFormat注解指定日期轉(zhuǎn)換的規(guī)則,修改后launchDate()方法的代碼如下。6.2.4 自定義類型轉(zhuǎn)換器(2)修改spring-mvc.xml配置將文件6-5中第21~30行代碼進(jìn)行注釋或者刪除,取消spring-mvc.xml中的轉(zhuǎn)換器工廠的配置,并將第32行代碼中的裝載類型轉(zhuǎn)換器工廠的代碼進(jìn)行刪除,即刪除conversion-service="converterService"。需要注意的是,注解方式的類型轉(zhuǎn)換依賴注解驅(qū)動的支持,配置文件中<mvc:annotation-driven/>標(biāo)簽需要保留。6.2.4 自定義類型轉(zhuǎn)換器(3)測試效果啟動項目,在瀏覽器中訪問http://localhost:8080/chapter06/launchDate?date=2024-03-22,控制臺輸出信息如下圖所示。6.2.4 自定義類型轉(zhuǎn)換器如果launchDate()方法的參數(shù)是POJO類型,且date是POJO類的屬性,可以在POJO類的date屬性上使用@DateTimeFormat注解標(biāo)注,并指定日期解析規(guī)則,這樣同樣可以將請求中的日期參數(shù)綁定到POJO日期類型的屬性上,示例如下。@DateTimeFormat(pattern="yyyy-MM-dd")privateDatedate;復(fù)雜數(shù)據(jù)綁定6.36.3

復(fù)雜數(shù)據(jù)綁定使用簡單數(shù)據(jù)綁定能夠解決實際開發(fā)中多數(shù)的數(shù)據(jù)綁定問題,但仍可能遇到一些比較復(fù)雜的數(shù)據(jù)綁定,比如數(shù)組的綁定、集合的綁定和復(fù)雜POJO的綁定,這些類型的數(shù)據(jù)綁定比簡單數(shù)據(jù)綁定要復(fù)雜,本節(jié)將針對數(shù)組類型的數(shù)據(jù)綁定、集合類型的數(shù)據(jù)綁定、復(fù)雜POJO類型的數(shù)據(jù)綁定、JSON數(shù)據(jù)綁定進(jìn)行講解。6.3.1 數(shù)組和集合綁定先定一個小目標(biāo)!

先定一個小目標(biāo)!掌握數(shù)組和集合綁定,能夠在代碼中使用數(shù)組和集合進(jìn)行數(shù)據(jù)綁定6.3.1 數(shù)組和集合綁定在實際開發(fā)中,可能會遇到請求需要傳遞多個同名參數(shù)到服務(wù)器端的情況,這種情況采用前面講解的簡單數(shù)據(jù)綁定的方式顯然是不合適的。對此,可以使用數(shù)組和集合來接收請求參數(shù),完成數(shù)據(jù)綁定。下面對請求中的參數(shù)綁定到處理器方法的數(shù)組和集合類型的參數(shù)中進(jìn)行講解。6.3.1 數(shù)組和集合綁定batchLaunch()方法源代碼在文件6-2的SpaceController類中定義batchLaunch()方法,用于接收請求中傳遞的多個航天器名稱。當(dāng)處理器方法的參數(shù)聲明為數(shù)組時,如果請求中出現(xiàn)多個同名參數(shù),SpringMVC會將這些同名參數(shù)的值綁定到方法的數(shù)組類型參數(shù)上。下面通過一個批量發(fā)射航天器的案例來演示數(shù)組的數(shù)據(jù)綁定。(1)定義處理器類1.數(shù)組綁定6.3.1 數(shù)組和集合綁定啟動項目,在Postman中填寫測試數(shù)據(jù)模擬表單數(shù)據(jù)的發(fā)送,其中請求的HTTP方法為POST,請求的URL為http://localhost:8080/chapter06/batchLaunch,攜帶的表單參數(shù)為兩個同名的參數(shù)names,如下圖所示。(2)測試效果6.3.1 數(shù)組和集合綁定單擊“Send”按鈕,IDEA控制臺輸出信息如圖所示。(2)測試效果6.3.1 數(shù)組和集合綁定在SpringMVC中,除了可以使用數(shù)組綁定多個同名參數(shù)外,也可以使用集合來進(jìn)行多個同名參數(shù)的綁定。集合中存儲簡單類型數(shù)據(jù)時,數(shù)據(jù)的綁定規(guī)則和數(shù)組的綁定規(guī)則相似,需要請求參數(shù)名稱與處理器方法的參數(shù)名稱保持一致。不同的是,使用集合綁定時,處理器方法的參數(shù)名稱需要使用@RequestParam注解標(biāo)注。2.集合綁定6.3.1 數(shù)組和集合綁定batchLaunchForList()方法源代碼在文件6-2的SpaceController類中定義batchLaunchForList()方法,在方法中定義List類型的參數(shù)接收請求中傳遞的多個航天器名稱,具體如下所示。下面使用集合數(shù)據(jù)綁定實現(xiàn)批量發(fā)射航天器案例。(1)定義處理器方法6.3.1 數(shù)組和集合綁定啟動項目,在Postman中不修改請求參數(shù)內(nèi)容,將請求的URL為http://localhost:8080/chapter06/batchLaunch02后,單擊“Send”按鈕發(fā)送請求,IDEA控制臺輸出如下圖所示。(2)測試效果6.3.2復(fù)雜POJO綁定先定一個小目標(biāo)!

先定一個小目標(biāo)!掌握復(fù)雜POJO綁定,能夠在代碼中使用復(fù)雜POJO進(jìn)行數(shù)據(jù)綁定6.3.2復(fù)雜POJO綁定所謂的復(fù)雜POJO,就是POJO屬性的類型不止包含簡單數(shù)據(jù)類型,還包含POJO類型、List類型和Map類型等其他引用類型。下面分別對復(fù)雜POJO中屬性為POJO類型的數(shù)據(jù)綁定、屬性為List類型的數(shù)據(jù)綁定和屬性為Map類型的數(shù)據(jù)綁定進(jìn)行講解。6.3.2復(fù)雜POJO綁定文件6-6Order.java源代碼在com.itheima.pojo包中創(chuàng)建一個訂單類Order,用于封裝訂單信息,具體如文件6-6所示。在復(fù)雜POJO數(shù)據(jù)綁定時,如果數(shù)據(jù)需要綁定到POJO類型的屬性中,請求參數(shù)的名稱格式需要為“POJO類型屬性名.屬性名”,其中屬性名需要和POJO類型屬性對象所屬類的屬性一致。下面通過一個獲取用戶訂單信息的案例,演示復(fù)雜POJO中屬性為POJO類型的數(shù)據(jù)綁定。(1)創(chuàng)建自定義類1.屬性為POJO類型的數(shù)據(jù)綁定6.3.2復(fù)雜POJO綁定文件6-7User.java源代碼在com.itheima.pojo包中創(chuàng)建一個用戶類User,用于封裝用戶信息,其中User類中包含Order類型的屬性order,具體如文件6-7所示。(1)創(chuàng)建自定義類6.3.2復(fù)雜POJO綁定文件6-7User.java源代碼在com.itheima.controller包中創(chuàng)建處理器類UserController,在該類中定義方法findOrderWithUser(),該方法使用User類型的參數(shù)接收請求中的數(shù)據(jù),具體如文件6-8所示。(2)創(chuàng)建處理器類6.3.2復(fù)雜POJO綁定啟動項目,在Postman中填寫測試數(shù)據(jù)模擬表單數(shù)據(jù)的發(fā)送,其中請求的HTTP方法為POST,請求的URL為http://localhost:8080/chapter06/findOrderWithUser,攜帶的表單參數(shù)為username和order.orderId,其中order.orderId表示為order的orderId屬性,如下圖所示。(3)測試效果6.3.2復(fù)雜POJO綁定單擊“Send”按鈕發(fā)起請求,IDEA控制臺輸出信息如下圖所示。(3)測試效果6.3.2復(fù)雜POJO綁定在進(jìn)行復(fù)雜POJO數(shù)據(jù)綁定時,如果數(shù)據(jù)綁定到List類型的屬性,請求的參數(shù)名稱需要符合以下要求。①如果List的泛型參數(shù)為簡單類型,則請求參數(shù)的名稱需要和POJO中List類型的屬性名稱保持一致。例如User類中有List<String>類型的address屬性,SpringMVC進(jìn)行數(shù)據(jù)綁定時,可以將請求中多個同名參數(shù)address的數(shù)據(jù)綁定到User類的address屬性中。②如果List的泛型參數(shù)為POJO類型,則請求參數(shù)名稱需要與POJO類的層次結(jié)構(gòu)名稱保持一致,并使用數(shù)組格式描述對象在List中的位置。例如User類中有List<Order>類型的orders屬性,可以將請求參數(shù)orders[索引].orderId的數(shù)據(jù)綁定到User類orders屬性的orderId屬性中,這里的索引是一個從0開始的整數(shù),用于指定List中對象的位置。2.屬性為List類型的數(shù)據(jù)綁定6.3.2復(fù)雜POJO綁定文件6-9User.java源代碼一般訂單業(yè)務(wù)中,用戶和訂單通常是一對多的映射關(guān)系,即用戶的訂單屬性使用集合類型。修改文件6-7,將User類中訂單屬性修改為List類型,屬性名稱修改為orders。由于用戶一般擁有多個收貨地址,同時在User類中新增List類型的訂單地址屬性address。修改后的User類具體代碼如6-9所示。(1)修改User類下面通過案例演示復(fù)雜POJO中屬性為List類型的數(shù)據(jù)綁定。6.3.2復(fù)雜POJO綁定文件6-10OrderController.java源代碼在com.itheima.controller包中創(chuàng)建一個處理器類OrderController,在OrderController類中定義saveOrders()方法,獲取請求中用戶的訂單信息和地址信息,具體如文件6-10所示。(2)創(chuàng)建處理器類6.3.2復(fù)雜POJO綁定啟動項目,在Postman中填寫測試數(shù)據(jù)模擬表單數(shù)據(jù)的發(fā)送,其中請求的HTTP方法為POST,請求的URL為http://localhost:8080/chapter06/saveOrders,攜帶的表單參數(shù)包含訂單信息和地址信息,如圖6-14所示。(3)測試效果6.3.2復(fù)雜POJO綁定單擊“Send”按鈕,IDEA控制臺輸出信息如下圖所示。(3)測試效果6.3.2復(fù)雜POJO綁定在進(jìn)行復(fù)雜POJO數(shù)據(jù)綁定時,除了可以使用POJO類型和List類型綁定多個參數(shù)的數(shù)據(jù)之外,還可以使用Map類型來完成多個參數(shù)的數(shù)據(jù)綁定。如果數(shù)據(jù)綁定到Map類型的屬性,請求的參數(shù)名稱需要與POJO類的層次結(jié)構(gòu)名稱保持一致,并使用鍵值的映射格式描述對象在Map中的位置,通過“Map類型的屬性名[鍵]”格式設(shè)置對應(yīng)的值。3.屬性為Map類型的數(shù)據(jù)綁定6.3.2復(fù)雜POJO綁定文件6-11Order.java源代碼在Order類中新增HashMap類型的屬性productInfo,用于封裝訂單中的商品信息,其中productInfo的鍵用來存放商品的類別,productInfo的值用來存放商品類別對應(yīng)的商品。修改后的Order類如文件6-11所示。(1)修改Order類下面通過案例演示復(fù)雜POJO中屬性為Map類型的數(shù)據(jù)綁定。6.3.2復(fù)雜POJO綁定saveOrderInfo()方法源代碼在文件6-10的OrderController類中新增saveOrderInfo()方法,在方法中定義Order參數(shù)獲取請求中的訂單信息,并將獲取到的訂單信息輸出在控制臺,具體如下所示。(2)定義處理器方法6.3.2復(fù)雜POJO綁定啟動項目,在Postman中填寫測試數(shù)據(jù)模擬表單數(shù)據(jù)的發(fā)送,其中請求的HTTP方法為POST,請求的URL為http://localhost:8080/chapter06/orderInfo,攜帶的表單參數(shù)包含訂單Id和商品詳情信息,如下圖所示。(3)測試效果6.3.2復(fù)雜POJO綁定在Postman中單擊“Send”按鈕,IDEA控制臺輸出信息如下圖所示。(3)測試效果6.3.3JSON數(shù)據(jù)綁定先定一個小目標(biāo)!

先定一個小目標(biāo)!掌握J(rèn)SON數(shù)據(jù)綁定,能夠在代碼中使用綁定JSON數(shù)據(jù)6.3.3JSON數(shù)據(jù)綁定JSON(JavaScriptObjectNotation,JS對象簡譜)是一種輕量級的數(shù)據(jù)交換格式,它與XML(ExtensibleMarkupLanguage,可擴展標(biāo)記語言)一樣都可以用來規(guī)范數(shù)據(jù)的格式,從而便于數(shù)據(jù)在程序之間進(jìn)行交換,但相對于XML來說,JSON解析速度更快,占用空間更小。因此在實際開發(fā)中,客戶端請求中發(fā)送的數(shù)據(jù)通常為JSON格式。SpringMVC中,當(dāng)一個請求需要將請求體中的數(shù)據(jù)(通常是JSON或XML格式)轉(zhuǎn)換為Java對象時,可以在方法參數(shù)上使用@RequestBody注解,SpringMVC框架會自動將請求體中的數(shù)據(jù)解析并轉(zhuǎn)換為對應(yīng)的Java對象,然后將該對象作為方法的參數(shù)傳入方法中進(jìn)行處理。6.3.3JSON數(shù)據(jù)綁定不同請求HttpServletRequest中數(shù)據(jù)的MediaType可能會不同,如果想將HttpServletRequest中的數(shù)據(jù)轉(zhuǎn)換成指定對象,或者將對象轉(zhuǎn)換成指定格式的數(shù)據(jù),就需要使用對應(yīng)的消息轉(zhuǎn)換器來實現(xiàn)。Spring中提供了一個HttpMessageConverter接口作為消息轉(zhuǎn)換器,針對不同數(shù)據(jù)類型的轉(zhuǎn)換,Spring中提供了多個HttpMessageConverter接口的實現(xiàn)類,其中MappingJackson2HttpMessageConverter是HttpMessageConverter接口的實現(xiàn)類之一,在處理請求時,可以將請求的JSON報文綁定到處理器的參數(shù)對象,在響應(yīng)請求時,將處理器的返回值轉(zhuǎn)換成JSON報文。6.3.3JSON數(shù)據(jù)綁定引入的依賴源代碼MappingJackson2HttpMessageConverter實現(xiàn)Java對象和JSON字符串之間的轉(zhuǎn)換依賴于Jackson數(shù)據(jù)綁定的依賴jackson-databind,對此,在項目chapter06的pom.xml文件中引入該依賴,具體如下所示。下面通過案例演示SpringMVC中的JSON數(shù)據(jù)綁定。(1)引入依賴6.3.3JSON數(shù)據(jù)綁定saveUser()方法和saveUserList()方法源代碼修改文件6-8,在UserController類中新增saveUser()方法和saveUserList()方法,分別用于獲取請求中的單個用戶信息和多個用戶信息。使用@RequestBody注解結(jié)合Jackson提供的JSON格式轉(zhuǎn)換器,即可完成JSON格式數(shù)據(jù)綁定到方法參數(shù)中。(2)定義處理器方法6.3.3JSON數(shù)據(jù)綁定啟動項目,在Postman中填寫測試數(shù)據(jù)模擬JSON數(shù)據(jù)的發(fā)送,其中請求的HTTP方法為POST,請求的URL為http://localhost:8080/chapter06/saveUser,攜帶的數(shù)據(jù)為JSON格式,如下圖所示。(3)測試效果6.3.3JSON數(shù)據(jù)綁定單擊Postman中的“Send”按鈕,IDEA控制臺輸出如下圖所示。(3)測試效果6.3.3JSON數(shù)據(jù)綁定在Postman中填寫測試數(shù)據(jù)模擬多個用戶信息的JSON數(shù)據(jù)的發(fā)送,其中請求的HTTP方法為POST,請求的URL為http://localhost:8080/chapter06/saveUserList,攜帶的數(shù)據(jù)為多個用戶信息的JSON數(shù)據(jù),如下圖所示。(3)測試效果6.3.3JSON數(shù)據(jù)綁定單擊Postman中的“Send”按鈕,IDEA控制臺輸出如下圖所示。(3)測試效果頁面跳轉(zhuǎn)6.46.4

頁面跳轉(zhuǎn)在SpringMVC中,客戶端與服務(wù)器端之間的交互主要涉及請求和響應(yīng)。當(dāng)客戶端發(fā)送請求到服務(wù)器端時,開發(fā)者可以根據(jù)交互的具體需求采取不同的響應(yīng)方式。SpringMVC的響應(yīng)方式通常可以分為頁面跳轉(zhuǎn)和數(shù)據(jù)回寫兩種。SpringMVC使用頁面跳轉(zhuǎn)的方式進(jìn)行響應(yīng)時,可以通過方法的返回值指定跳轉(zhuǎn)頁面。頁面跳轉(zhuǎn)時,方法的返回值可以設(shè)定三種類型,分別是void、String類型和ModelAndView類型。本節(jié)分別對這三種類型返回值的頁面跳轉(zhuǎn)進(jìn)行講解。6.4.1 返回值為void的頁面跳轉(zhuǎn)先定一個小目標(biāo)!

先定一個小目標(biāo)!掌握返回值為void的頁面跳轉(zhuǎn)6.4.1 返回值為void的頁面跳轉(zhuǎn)當(dāng)SpringMVC方法的返回值為void時,方法執(zhí)行后會跳轉(zhuǎn)到默認(rèn)的頁面。默認(rèn)頁面的路徑會由方法映射路徑和視圖解析器中的前綴、后綴拼接成,拼接格式為“前綴+方法中的映射路徑+后綴”。如果SpringMVC的配置文件中沒有配置視圖解析器,則會報HTTPStatus500錯誤。6.4.1 返回值為void的頁面跳轉(zhuǎn)視圖解析器配置源代碼將配套資源中的pages文件夾復(fù)制到項目的webapp目錄下,并確定spring-mvc.xml配置文件中的視圖解析器配置如下。下面通過案例演示返回值為void的頁面跳轉(zhuǎn)面。(1)配置靜態(tài)資源6.4.1 返回值為void的頁面跳轉(zhuǎn)文件6-12PageController.java源代碼在項目的com.itheima.controller包下創(chuàng)建處理器類PageController,用于處理頁面跳轉(zhuǎn),在PageController類中定義方法showPageByVoid(),用于測試SpringMVC方法返回值為void的頁面跳轉(zhuǎn),具體如文件6-12所示。(2)創(chuàng)建處理器類6.4.1 返回值為void的頁面跳轉(zhuǎn)啟動項目,在瀏覽器中訪問地址http://localhost:8080/chapter06/register。訪問后,控制臺輸出信息如下圖所示。(3)測試效果6.4.1 返回值為void的頁面跳轉(zhuǎn)查看瀏覽器,可以看到頁面進(jìn)行了跳轉(zhuǎn),跳轉(zhuǎn)后的頁面如下圖所示。(3)測試效果6.4.2 返回值為String類型的頁面跳轉(zhuǎn)先定一個小目標(biāo)!

先定一個小目標(biāo)!掌握返回值為String類型的頁面跳轉(zhuǎn),能夠在程序中使用String返回值類型進(jìn)行頁面跳轉(zhuǎn)6.4.2 返回值為String類型的頁面跳轉(zhuǎn)當(dāng)SpringMVC方法的返回值為String類型時,默認(rèn)情況下,這個返回的字符串會被解釋為邏輯視圖名稱,SpringMVC會根據(jù)這個邏輯視圖名稱跳轉(zhuǎn)到對應(yīng)的視圖。如果SpringMVC程序的配置中沒有配置視圖解析器,處理器執(zhí)行后,會將請求進(jìn)行轉(zhuǎn)發(fā),轉(zhuǎn)發(fā)的路徑和方法的返回值一致。在進(jìn)行頁面跳轉(zhuǎn)之前,可以根據(jù)需求選擇頁面跳轉(zhuǎn)時是否攜帶數(shù)據(jù),下面分別對返回值為String類型時不攜帶數(shù)據(jù)的頁面跳轉(zhuǎn)和攜帶數(shù)據(jù)的頁面跳轉(zhuǎn)進(jìn)行講解。6.4.2 返回值為String類型的頁面跳轉(zhuǎn)showPageByString()方法源代碼在文件6-12的PageController類中定義showPageByString()方法,用于測試返回值為String類型的頁面跳轉(zhuǎn),具體如下所示。下面通過一個案例演示返回值為String類型時,不攜帶數(shù)據(jù)的頁面跳轉(zhuǎn),具體實現(xiàn)如下。(1)定義處理器方法1.不攜帶數(shù)據(jù)的頁面跳轉(zhuǎn)6.4.2 返回值為String類型的頁面跳轉(zhuǎn)啟動項目,在瀏覽器中訪問地址http://localhost:8080/chapter06/showPageByString。訪問后,控制臺輸出信息如下圖所示。(2)效果測試6.4.2 返回值為String類型的頁面跳轉(zhuǎn)此時查看瀏覽器,可以看到頁面進(jìn)行了跳轉(zhuǎn),跳轉(zhuǎn)后的頁面如下圖所示。(2)效果測試6.4.2 返回值為String類型的頁面跳轉(zhuǎn)當(dāng)方法的返回值為普通的字符串時,SpringMVC在方法執(zhí)行后會默認(rèn)以轉(zhuǎn)發(fā)的方式響應(yīng)給客戶端。除了這種默認(rèn)的轉(zhuǎn)發(fā)方式,還可以返回指定前綴的字符串,來設(shè)定處理器方法執(zhí)行后對請求進(jìn)行轉(zhuǎn)發(fā)還是重定向,設(shè)定轉(zhuǎn)發(fā)和重定向的字符串格式如下所示。forward:需要轉(zhuǎn)發(fā)到的資源路徑redirect:需要重定向到的資源路徑需要注意的是,方法返回的字符串一旦添加了“forward:”或“redirect:”前綴,那么視圖解析器不再會為方法返回值拼接前綴和后綴了。6.4.2 返回值為String類型的頁面跳轉(zhuǎn)showPageByForward()方法和showPageByRedirect()方法源代碼在文件6-12的PageController中定義showPageByForward()方法和showPageByRedirect()方法,分別用于測試方法執(zhí)行后轉(zhuǎn)發(fā)和重定向的頁面跳轉(zhuǎn)。下面,通過一個案例演示返回指定前綴的字符串的頁面跳轉(zhuǎn)。(1)定義處理器方法6.4.2 返回值為String類型的頁面跳轉(zhuǎn)啟動項目,在瀏覽器中訪問地址http://localhost:8080/chapter06/showPageByForward。訪問后瀏覽器頁面進(jìn)行跳轉(zhuǎn),跳轉(zhuǎn)的頁面如下圖所示。(2)效果測試6.4.2 返回值為String類型的頁面跳轉(zhuǎn)http://localhost:8080/chapter06/showPageByRedirect。訪問后,瀏覽器頁面進(jìn)行跳轉(zhuǎn),跳轉(zhuǎn)的頁面如下圖所示。(2)效果測試6.4.2 返回值為String類型的頁面跳轉(zhuǎn)showPageByRequest()方法和showPageByModel()方法源代碼在文件6-12的PageController類中定義showPageByRequest()方法和showPageByModel()方法,分別使用HttpServletRequest和Model傳遞數(shù)據(jù),并使用字符串指定跳轉(zhuǎn)的頁面。下面通過一個案例演示攜帶數(shù)據(jù)的頁面跳轉(zhuǎn),該案例使用HttpServletRequest類型參數(shù)和Model類型參數(shù)進(jìn)行數(shù)據(jù)傳遞。(1)定義處理器方法2.攜帶數(shù)據(jù)的頁面跳轉(zhuǎn)6.4.2 返回值為String類型的頁面跳轉(zhuǎn)啟動項目,在瀏覽器中訪問地址http://localhost:8080/chapter06/showPageByRequest。訪問后,瀏覽器頁面進(jìn)行跳轉(zhuǎn),跳轉(zhuǎn)的頁面如下圖所示。(2)測試效果6.4.2 返回值為String類型的頁面跳轉(zhuǎn)在瀏覽器中訪問地址http://localhost:8080/chapter06/showPageByModel。訪問后,瀏覽器跳轉(zhuǎn)的頁面如下圖所示。(2)測試效果6.4.2 返回值為ModelAndView類型的頁面跳轉(zhuǎn)先定一個小目標(biāo)!

先定一個小目標(biāo)!掌握返回值為ModelAndView類型的頁面跳轉(zhuǎn),能夠在程序中使用ModelAndView返回值類型進(jìn)行頁面跳轉(zhuǎn)6.4.2 返回值為ModelAndView類型的頁面跳轉(zhuǎn)使用方法的返回值可以指定跳轉(zhuǎn)的邏輯視圖名稱,使用Model等對象可以實現(xiàn)頁面跳轉(zhuǎn)時傳輸數(shù)據(jù)。除此之外,SpringMVC還可以使用ModelAndView設(shè)置響應(yīng)時對應(yīng)的邏輯視圖名稱和數(shù)據(jù),ModelAndView對象主要用于存儲模型數(shù)據(jù)和邏輯視圖名稱,其中模型數(shù)據(jù)即業(yè)務(wù)數(shù)據(jù),可以在視圖渲染過程中合并到最終的視圖中輸出;邏輯視圖名稱則用于確定要渲染哪個視圖。6.4.2 返回值為ModelAndView類型的頁面跳轉(zhuǎn)ModelAndView設(shè)置輯視圖名稱和模型數(shù)據(jù)的方法方法聲明功能描述voidsetViewName(StringviewName)

用于在ModelAndView對象中設(shè)置一個邏輯視圖名稱,會覆蓋預(yù)先存在的邏輯視圖名稱voidsetView(Viewview)用于在ModelAndView對象中設(shè)置一個視圖實例,會覆蓋預(yù)先存在的視圖實例ModelAndViewaddObject(

ObjectattributeValue)用于在ModelAndView對象中添加模型數(shù)據(jù)ModelAndViewaddObject(StringattributeName,ObjectattributeValue)用于在ModelAndView對象中添加指定名稱的模型數(shù)據(jù)ModelAndViewaddAllObjects(

Map<String,?>modelMap)用于在ModelAndView對象中添加模型數(shù)據(jù)。模型數(shù)據(jù)的名稱為Map中的元素的key,值為Map中key對應(yīng)的值6.4.2 返回值為String類型的頁面跳轉(zhuǎn)showModelAndView()方法源代碼在文件6-12的PageController類中定義showModelAndView()方法,在showModelAndView()方法中使用ModelAndView對象封裝模型數(shù)據(jù)和視圖信息,以實現(xiàn)指定跳轉(zhuǎn)頁面和傳遞的數(shù)據(jù)。下面通過一個案例演示返回值為ModelAndView類型的頁面跳轉(zhuǎn)。(1)定義處理器方法6.4.2 返回值為String類型的頁面跳轉(zhuǎn)啟動項目,在瀏覽器中訪問地址http://localhost:8080/chapter06/showModelAndView。訪問后,瀏覽器頁面進(jìn)行跳轉(zhuǎn),跳轉(zhuǎn)的頁面如下圖所示。(2)測試效果數(shù)據(jù)回寫6.56.5

數(shù)據(jù)回寫默認(rèn)情況下,SpringMVC的響應(yīng)會經(jīng)過視圖解析器完成頁面跳轉(zhuǎn)。有時客戶端希望服務(wù)器端在響應(yīng)時不要進(jìn)行頁面跳轉(zhuǎn),只需要回寫相關(guān)的數(shù)據(jù)即可。這個時候可以選擇在響應(yīng)時直接將數(shù)據(jù)寫入到輸出流中,而不經(jīng)過視圖解析器。根據(jù)數(shù)據(jù)格式,可以將回寫到輸出流的數(shù)據(jù)分為普通字符串和JSON數(shù)據(jù)。下面將對SpringMVC普通字符串的回寫和JSON數(shù)據(jù)的回寫進(jìn)行講解。6.5.1 普通字符串的回寫先定一個小目標(biāo)!

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論