SpringBoot教程(第4版)課件 第2章 Spring Boot開(kāi)發(fā)入門(mén)_第1頁(yè)
SpringBoot教程(第4版)課件 第2章 Spring Boot開(kāi)發(fā)入門(mén)_第2頁(yè)
SpringBoot教程(第4版)課件 第2章 Spring Boot開(kāi)發(fā)入門(mén)_第3頁(yè)
SpringBoot教程(第4版)課件 第2章 Spring Boot開(kāi)發(fā)入門(mén)_第4頁(yè)
SpringBoot教程(第4版)課件 第2章 Spring Boot開(kāi)發(fā)入門(mén)_第5頁(yè)
已閱讀5頁(yè),還剩111頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第2章SpringBoot開(kāi)發(fā)入門(mén)——從開(kāi)發(fā)典型實(shí)例說(shuō)起SpringBoot實(shí)用教程(第4版)目錄01從登錄功能說(shuō)起1.設(shè)計(jì)系統(tǒng)結(jié)構(gòu)2.創(chuàng)建數(shù)據(jù)庫(kù)和表3.創(chuàng)建SpringBoot項(xiàng)目4.配置數(shù)據(jù)庫(kù)連接從登錄功能說(shuō)起【實(shí)例2.1】實(shí)現(xiàn)“商品信息管理系統(tǒng)”商家登錄功能。設(shè)計(jì)登錄頁(yè)面,包含用戶名和密碼輸入文本框和“登錄”和“重置”按鈕。用戶輸入用戶名和密碼,單擊“登錄”,系統(tǒng)在netshop(網(wǎng)上商城)的數(shù)據(jù)庫(kù)的supplier(商家)表中查詢是否包含該用戶記錄。如果沒(méi)有找到,根據(jù)用戶名和密碼匹配情況,顯示相應(yīng)用戶不存在或者密碼錯(cuò)。如果找到對(duì)應(yīng)記錄,轉(zhuǎn)到另一個(gè)網(wǎng)頁(yè),顯示該商家用戶的注冊(cè)信息。從登錄功能說(shuō)起1.設(shè)計(jì)系統(tǒng)結(jié)構(gòu)系統(tǒng)運(yùn)行在單一的Web服務(wù)器(SpringBoot內(nèi)部的Tomcat)上;由Thymeleaf模板引擎實(shí)現(xiàn)前端頁(yè)面,客戶端用瀏覽器直接訪問(wèn)Web服務(wù)器上的網(wǎng)頁(yè);后臺(tái)JavaEE程序分為控制器、業(yè)務(wù)層和持久層;底層用JDBCAPI操作MySQL數(shù)據(jù)庫(kù),如圖2.1所示。從登錄功能說(shuō)起2.創(chuàng)建數(shù)據(jù)庫(kù)和表在你的計(jì)算機(jī)上準(zhǔn)備數(shù)據(jù)庫(kù)操作環(huán)境:(1)在開(kāi)發(fā)SpringBoot的計(jì)算機(jī)上安裝MySQL8.0/5.x數(shù)據(jù)庫(kù)(根用戶root、口令123456)。(2)安裝NavicatforMySQL或者NavicatPremium15可視化工具。(3)打開(kāi)Navicat,創(chuàng)建MySQL服務(wù)器連接。(4)打開(kāi)連接,在查詢編輯器中執(zhí)行SQL語(yǔ)句:CREATEDATABASEIFNOTEXISTSnetshop DEFAULTCHARACTERSET=gbk DEFAULTCOLLATE=gbk_chinese_ci ENCRYPTION='N'; /*(a)*/USEnetshop; /*(b)*/CREATETABLEsupplier /*(c)*/( SCode char(8) NOTNULLPRIMARYKEY, /*商家編碼*/ SPassWord varchar(12) NOTNULLDEFAULT'888’, /*商家密碼*/ SName varchar(16) NOTNULL, /*商家名稱*/ SWeiXin varchar(16) CHARACTERSETutf8mb4NOTNULL, /*微信*/ Tel char(13) NULL, /*電話(手機(jī))*/ Evaluate float(4,2) DEFAULT0.00, /*商家綜合評(píng)價(jià)*/ SLicence mediumblob NULL /*營(yíng)業(yè)執(zhí)照?qǐng)D片*/);從登錄功能說(shuō)起(5)為了后面測(cè)試程序需要,往supplier表中錄入一條商家用戶的信息記錄,執(zhí)行SQL語(yǔ)句:USEnetshop;INSERTINTOsupplier(SCode,SPassWord,SName,SWeiXin,Tel)VALUES('SXLC001A','888','陜西洛川蘋(píng)果有限公司','8123456-','0911-812345X');netshop數(shù)據(jù)庫(kù)supplier表數(shù)據(jù)記錄如圖2.2所示。從登錄功能說(shuō)起3.創(chuàng)建SpringBoot項(xiàng)目在IDEA中創(chuàng)建SpringBoot項(xiàng)目,步驟如下。(1)啟動(dòng)IDEA,在初始窗口中點(diǎn)“NewProject”新建項(xiàng)目。(2)從窗口左側(cè)選擇項(xiàng)目類(lèi)型為“SpringInitializr”,“Name”欄填寫(xiě)項(xiàng)目名為mystore,“Java”欄選擇所使用的JDK版本,注意一定要與開(kāi)發(fā)機(jī)器上安裝的JDK版本一致(這里是8),其他欄保持默認(rèn),點(diǎn)“Next”繼續(xù)。(3)出現(xiàn)界面供用戶選擇項(xiàng)目所用SpringBoot的版本以及要集成的框架或依賴庫(kù)。從登錄功能說(shuō)起選擇使用的SpringBoot正式版(不帶任何文字標(biāo)注的),在下方“Dependencies”列表中勾選項(xiàng)目所要集成的框架或依賴庫(kù)。DeveloperTools:勾選Lombok、SpringBootDevTools。Web:勾選SpringWeb;TemplateEngines:勾選Thymeleaf。SQL:勾選JDBCAPI、MySQLDriver。選擇完成后,在右側(cè)“Addeddependencies”列表欄里可見(jiàn)已選中的組件名稱。點(diǎn)“Finish”按鈕開(kāi)始創(chuàng)建SpringBoot項(xiàng)目。從登錄功能說(shuō)起4.配置數(shù)據(jù)庫(kù)連接perties中的內(nèi)容寫(xiě)成“鍵名=值”的形式,其中,“鍵名”可以是Spring/SpringBoot及其他第三方框架或依賴庫(kù)內(nèi)部所支持的配置項(xiàng),也可以是用戶自定義的全局配置項(xiàng)名稱(程序中必須引用一致);“值”則是任意的字符串、數(shù)值或布爾型(true/false)。這里配置Spring框架內(nèi)部對(duì)MySQL數(shù)據(jù)庫(kù)的連接,內(nèi)容如下:spring.datasource.url=jdbc:mysql://localhost:3306/netshop?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=truespring.datasource.username=rootspring.datasource.password=123456spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.jackson.serialization.indent-output=true目錄02分

設(shè)

計(jì)1.持久層開(kāi)發(fā)2.業(yè)務(wù)層開(kāi)發(fā)3.表示層開(kāi)發(fā)4.運(yùn)行測(cè)試分層設(shè)計(jì)嚴(yán)格按照J(rèn)avaEE標(biāo)準(zhǔn)的三層架構(gòu)來(lái)設(shè)計(jì)程序,分為表示層、業(yè)務(wù)層、持久層,程序結(jié)構(gòu)如圖2.3所示,圖中畫(huà)出了程序中各個(gè)類(lèi)、接口、對(duì)象、方法所屬的層次和所在的源程序包,并標(biāo)注了它們各自在系統(tǒng)中扮演的角色及相互作用關(guān)系。分層設(shè)計(jì)下面結(jié)合上圖,就即將開(kāi)發(fā)的這個(gè)程序來(lái)簡(jiǎn)要介紹一下它各個(gè)部分的交互工作原理。表示層:包括兩個(gè)頁(yè)面index.html(初始頁(yè),含用戶名和密碼輸入框)和home.html(歡迎頁(yè),顯示用戶注冊(cè)信息)、一個(gè)控制器和一個(gè)模型Supplier(商家用戶模型)。頁(yè)面以HTML5編寫(xiě),其上需要顯示動(dòng)態(tài)數(shù)據(jù)的地方都嵌入了Model(SpringMVC的模型接口);控制器是一個(gè)SupController類(lèi),其中有兩個(gè)方法init()和loginCheck()。業(yè)務(wù)層:有一個(gè)服務(wù)實(shí)體SupServiceImpl類(lèi),它實(shí)現(xiàn)SupService業(yè)務(wù)接口,其中的checkSupplier()方法專門(mén)負(fù)責(zé)處理對(duì)登錄商家用戶信息進(jìn)行驗(yàn)證的業(yè)務(wù)功能(表示層控制器就是調(diào)用該方法執(zhí)行驗(yàn)證的),驗(yàn)證結(jié)果通過(guò)實(shí)例化包裝進(jìn)Result響應(yīng)實(shí)體中返回給前端。持久層:定義了一個(gè)數(shù)據(jù)接口SupRepository,它是持久層對(duì)業(yè)務(wù)層暴露的“操作界面”,業(yè)務(wù)層調(diào)用其中的findSupplier()方法查詢到用戶數(shù)據(jù)。SupRepositoryImpl類(lèi)實(shí)現(xiàn)了該數(shù)據(jù)接口,通過(guò)JDBC存取MySQL中的數(shù)據(jù)。分層設(shè)計(jì)1.持久層開(kāi)發(fā)進(jìn)入項(xiàng)目工程目錄樹(shù)的src→main→java→com.example.mystore節(jié)點(diǎn),右擊,選擇“New”→“Package”項(xiàng),出現(xiàn)提示框中輸入包名,如圖2.4所示。分層設(shè)計(jì)在“NewPackage”文本框中默認(rèn)前綴“com.example.mystore.”后加repository回車(chē),創(chuàng)建一個(gè)名為repository的包,如圖2.5所示。1)定義數(shù)據(jù)接口右擊新創(chuàng)建repository包的節(jié)點(diǎn),選擇“New”→“JavaClass”項(xiàng),在提示框列表選中“Interface”,上方框內(nèi)輸入接口名稱為“SupRepository”,如圖2.6所示。

分層設(shè)計(jì)回車(chē),“SupRepository.java”接口代碼如下:packagecom.example.mystore.repository;

importcom.example.mystore.entity.Supplier; //(b)

publicinterfaceSupRepository{publicSupplierfindSupplier(Suppliersupplier); //(a)}說(shuō)明:(a)加黑部分為用戶輸入接口的定義,聲明接口中的方法findSupplier。它將Supplier類(lèi)的supplier實(shí)例作為參數(shù)帶入,結(jié)果以Supplier類(lèi)的形式返回。因?yàn)镾upplier類(lèi)在表示層才定義,所以目前會(huì)以紅色顯示。(b)導(dǎo)入實(shí)體(entity)類(lèi)Supplier。如果Supplier類(lèi)已經(jīng)創(chuàng)建,在輸入(a)后系統(tǒng)會(huì)自動(dòng)生成本行。分層設(shè)計(jì)可以直接輸入上述代碼取代系統(tǒng)生成的初始代碼。其中:Supplier類(lèi)我們?cè)赾om.example.mystore.entity包中創(chuàng)建。代碼為:packagecom.example.mystore.entity;

importlombok.Data;

@DatapublicclassSupplier{privateStringscode; //商家編碼privateStringspassword; //商家密碼privateStringsname; //商家名稱privateStringsweixin; //微信privateStringtel; //電話(手機(jī))privateFloatevaluate; //商家綜合評(píng)價(jià)}分層設(shè)計(jì)2)開(kāi)發(fā)接口實(shí)現(xiàn)類(lèi)右擊repository包節(jié)點(diǎn),選擇“New”→“JavaClass”項(xiàng),出現(xiàn)提示框下面列表選中“Class”,上方框內(nèi)輸入類(lèi)名稱。創(chuàng)建接口SupRepository的實(shí)現(xiàn)類(lèi)SupRepositoryImpl,代碼顯示。說(shuō)明:(a)Stringsql="SELECT*FROMsupplierWHERESCode=?":根據(jù)商家編碼查詢商家記錄的SQL語(yǔ)句。(b)Objectargs[]={supplier.getScode()}:由傳入findSupplier方法的Supplier對(duì)象參數(shù)中獲取商家編碼實(shí)參值。(c)RowMapper<Supplier>rowMapper=newBeanPropertyRowMapper<Supplier>(Supplier.class):RowMapper是JdbcTemplate提供的類(lèi),用于將查詢數(shù)據(jù)庫(kù)得到的多列數(shù)據(jù)映射到一個(gè)具體的模型類(lèi)(本例就是Supplier類(lèi))上。(d)SuppliersupObj=jdbcTemplate.queryForObject(sql,args,rowMapper):調(diào)用JdbcTemplate模板的queryForObject方法執(zhí)行查詢,需要提供三個(gè)參數(shù):執(zhí)行的SQL語(yǔ)句、實(shí)參(存于對(duì)象數(shù)組args)以及行數(shù)據(jù)映射對(duì)象rowMapper。分層設(shè)計(jì)2.業(yè)務(wù)層開(kāi)發(fā)(1)設(shè)計(jì)響應(yīng)實(shí)體Result類(lèi)在項(xiàng)目工程目錄樹(shù)的com.example.mystore節(jié)點(diǎn)下創(chuàng)建core包,其中定義Result類(lèi)。說(shuō)明:(a)privateintcode:code是返回碼,標(biāo)識(shí)登錄驗(yàn)證通過(guò)與否,若驗(yàn)證通過(guò),返回200;若失敗則視具體情況返回403(密碼錯(cuò))/404(用戶不存在)。(b)privateStringmsg:msg是字符串形式的消息,描述客戶端請(qǐng)求執(zhí)行的情況,若成功,填寫(xiě)成功信息;若失敗,簡(jiǎn)單說(shuō)明失敗原因,這樣用戶就可從返回的消息內(nèi)容中得知登錄失敗的原因,便于糾正錯(cuò)誤重新登錄。(c)privateObjectdata:這個(gè)里面存儲(chǔ)的才是從數(shù)據(jù)庫(kù)得到的數(shù)據(jù)內(nèi)容,以Java對(duì)象的形式存儲(chǔ),傳回前端后由表示層控制器解析為模型對(duì)象,供前臺(tái)頁(yè)面Model使用。分層設(shè)計(jì)(2)定義業(yè)務(wù)接口在項(xiàng)目工程目錄樹(shù)的com.example.mystore節(jié)點(diǎn)下創(chuàng)建service包,其下定義名為SupService的接口,代碼為:packagecom.example.mystore.service;

importcom.example.mystore.core.Result;importcom.example.mystore.entity.Supplier;

publicinterfaceSupService{ publicResultcheckSupplier(Suppliersupplier);}(3)開(kāi)發(fā)服務(wù)實(shí)體在service包下創(chuàng)建業(yè)務(wù)接口的實(shí)現(xiàn)類(lèi)SupServiceImpl,代碼顯示。分層設(shè)計(jì)3.表示層開(kāi)發(fā)(1)設(shè)計(jì)模型本例針對(duì)數(shù)據(jù)庫(kù)supplier(商家)表設(shè)計(jì)一個(gè)商家用戶模型Supplier。在項(xiàng)目工程目錄樹(shù)的com.example.mystore節(jié)點(diǎn)下創(chuàng)建entity包,其中創(chuàng)建模型類(lèi)Supplier,代碼為:packagecom.example.mystore.entity;

importlombok.Data;

@DatapublicclassSupplier{ privateStringscode; //商家編碼 privateStringspassword; //商家密碼 privateStringsname; //商家名稱 privateStringsweixin; //微信 privateStringtel; //電話(手機(jī)) privateFloatevaluate; //商家綜合評(píng)價(jià)}分層設(shè)計(jì)說(shuō)明:①傳統(tǒng)JavaEE數(shù)據(jù)模型類(lèi)的設(shè)計(jì)代碼必須遵循嚴(yán)格的規(guī)范寫(xiě),類(lèi)的各個(gè)屬性對(duì)應(yīng)于要顯示的數(shù)據(jù)記錄的各個(gè)字段(數(shù)據(jù)庫(kù)表的列名),每一個(gè)屬性都對(duì)應(yīng)有一對(duì)get/set方法。②實(shí)際開(kāi)發(fā)時(shí)可根據(jù)應(yīng)用需求靈活調(diào)整模型屬性的數(shù)目,并非數(shù)據(jù)庫(kù)表的所有列都要有其屬性??梢钥吹?,這里暫未定義supplier表的“SLicence”(營(yíng)業(yè)執(zhí)照?qǐng)D片)列屬性,因?yàn)楸纠貌坏剑粗灰WC程序要用的列在模型里有對(duì)應(yīng)的屬性就可以。分層設(shè)計(jì)(2)設(shè)計(jì)前端頁(yè)面右擊項(xiàng)目工程目錄樹(shù)的src→main→resources→templates節(jié)點(diǎn),選擇“New”→“HTMLFile”項(xiàng),出現(xiàn)提示框下面列表選中“HTML5file”,創(chuàng)建前端頁(yè)面,上方框內(nèi)輸入頁(yè)面名稱。如圖2.7所示。本例要?jiǎng)?chuàng)建兩個(gè)頁(yè)面:index.html和home.html。①index.html是初始的登錄頁(yè),頁(yè)面代碼顯示。②home.html是登錄成功后的歡迎頁(yè),頁(yè)面代碼顯示。(3)開(kāi)發(fā)控制器在項(xiàng)目工程目錄樹(shù)的com.example.mystore節(jié)點(diǎn)下創(chuàng)建controller包,其中創(chuàng)建控制器類(lèi)SupController,代碼顯示。分層設(shè)計(jì)4.運(yùn)行測(cè)試(1)啟動(dòng)項(xiàng)目點(diǎn)IDEA工具欄的啟動(dòng)按鈕(位于開(kāi)發(fā)環(huán)境界面右上綠色三角

),底部窗口出現(xiàn)SpringBoot的啟動(dòng)信息,稍候片刻,顯示“StartedMystoreApplicationin1.747seconds(JVMrunningfor2.75)”(時(shí)長(zhǎng)秒數(shù)會(huì)有不同)就表示啟動(dòng)成功,如圖2.8所示。分層設(shè)計(jì)(2)訪問(wèn)頁(yè)面此時(shí)打開(kāi)瀏覽器,地址欄輸入http://localhost:8080/index回車(chē),看到登錄頁(yè)面如圖2.9所示。(3)驗(yàn)證失敗的提示輸入錯(cuò)誤的用戶名或密碼提交,頁(yè)面在對(duì)應(yīng)文本框后顯示紅色的“用戶不存在!”或者“密碼錯(cuò)!”信息。分層設(shè)計(jì)(4)登錄成功輸入正確的用戶名(SXLC001A)和密碼(888),點(diǎn)“登錄”按鈕,成功登錄后頁(yè)面顯示歡迎文字和該商家用戶的注冊(cè)信息,如圖2.10所示。目錄03URL請(qǐng)求參數(shù)傳遞1.形參名(無(wú)注解)接收參數(shù)2.路徑(@PathVariable)傳遞參數(shù)3.用@RequestParam映射參數(shù)URL請(qǐng)求參數(shù)傳遞在SpringBoot中,將URL映射到后臺(tái)程序是通過(guò)注解@RequestMapping處理的。URL映射其實(shí)就是用控制器定義要訪問(wèn)的URL路徑,用戶通過(guò)輸入路徑來(lái)訪問(wèn)控制器的某個(gè)方法,如圖2.11所示。【實(shí)例2.2】商家登錄“商品信息管理系統(tǒng)”通過(guò)輸入U(xiǎn)RL提交用戶名密碼,瀏覽器返回JSON格式的響應(yīng)實(shí)體(內(nèi)含用戶注冊(cè)信息);若失敗則返回的JSON實(shí)體中含消息提示原因。URL請(qǐng)求參數(shù)傳遞1.形參名(無(wú)注解)接收參數(shù)這是最簡(jiǎn)單的方式,用控制器中的方法形參名直接接收來(lái)自URL的請(qǐng)求參數(shù)。(1)控制器編程修改控制器SupController,代碼如下:...@RestController@RequestMapping("index")publicclassSupController{ @Autowired privateSupServicesupService;

@RequestMapping("/check") //處理URL映射的注解語(yǔ)句 publicResultloginCheck(Stringscode,Stringspassword){ Suppliersupplier=newSupplier();supplier.setScode(scode);supplier.setSpassword(spassword); Resultresult=supService.checkSupplier(supplier); returnresult; }}URL請(qǐng)求參數(shù)傳遞(2)運(yùn)行啟動(dòng)項(xiàng)目,打開(kāi)瀏覽器,地址欄輸入http://localhost:8080/index/check?scode=SXLC001A&&spassword=888回車(chē),看到以JSON格式返回的響應(yīng)實(shí)體數(shù)據(jù)如圖2.12所示。URL請(qǐng)求參數(shù)傳遞若故意將URL攜帶的用戶名或密碼寫(xiě)錯(cuò),提交后返回的JSON數(shù)據(jù)中也會(huì)含錯(cuò)誤碼及失敗原因的提示文字(用戶不存在、密碼錯(cuò)),此時(shí)JSON數(shù)據(jù)鍵(data)顯示值為空(null),如圖2.13所示。URL請(qǐng)求參數(shù)傳遞(3)說(shuō)明①用形參接收參數(shù),要求控制器方法的形參名必須與URL攜帶的參數(shù)名完全一致且嚴(yán)格對(duì)應(yīng),URL中既不能省略某個(gè)參數(shù)也不能憑空多出額外的參數(shù)。②URL攜帶的參數(shù)均以“參數(shù)名=值”的形式寫(xiě)在路徑之后,與路徑之間隔一個(gè)“?”,各參數(shù)之間以“&&”(或“&”)分隔。③SpringBoot用來(lái)處理URL映射的注解語(yǔ)句有多種不同形式的寫(xiě)法,本例代碼中的“@RequestMapping("/check")”還可以寫(xiě)成如下幾種形式:@RequestMapping(value="check",method=RequestMethod.GET)@GetMapping("/check")@GetMapping(value="check")URL請(qǐng)求參數(shù)傳遞2.路徑(@PathVariable)傳遞參數(shù)當(dāng)下互聯(lián)網(wǎng)應(yīng)用流行的RESTful風(fēng)格接口,要求客戶端將請(qǐng)求參數(shù)值直接寫(xiě)在訪問(wèn)URL的路徑中,如“http://地址/路徑/值1/值2/.../值n”的形式,這種情況只能依靠路徑自身傳遞參數(shù)值,在SpringBoot中用@PathVariable注解參數(shù)。(1)控制器編程在控制器SupController中添加一個(gè)loginCheckByPath方法,代碼如下:@RequestMapping("/checkbypath/{scode}/{spassword}") //處理URL映射的注解語(yǔ)句publicResultloginCheckByPath(@PathVariableStringscode,@PathVariableStringspassword){ //@PathVariable注解參數(shù) Suppliersupplier=newSupplier();supplier.setScode(scode);supplier.setSpassword(spassword); returnsupService.checkSupplier(supplier);}(2)運(yùn)行啟動(dòng)項(xiàng)目,打開(kāi)瀏覽器,地址欄輸入http://localhost:8080/index/checkbypath/SXLC001A/888回車(chē),看到以JSON格式返回的響應(yīng)實(shí)體數(shù)據(jù)與前圖2.12的一樣。URL請(qǐng)求參數(shù)傳遞(3)說(shuō)明①用“@RequestMapping("/checkbypath/{scode}/{spassword}")”注解語(yǔ)句處理URL映射,在訪問(wèn)“http://localhost:8080/index/checkbypath/SXLC001A/888”時(shí),SpringBoot會(huì)自動(dòng)將URL中的模板變量{scode}、{spassword}綁定到通過(guò)@PathVariable注解的同名參數(shù)上,從而獲取到路徑中的參數(shù)值。處理URL映射的注解語(yǔ)句也可以寫(xiě)成如下幾種等效的形式:@RequestMapping(value="checkbypath/{scode}/{spassword}",method=RequestMethod.GET)@GetMapping("/checkbypath/{scode}/{spassword}")@GetMapping(value="checkbypath/{scode}/{spassword}")②控制器方法“publicResultloginCheckByPath(@PathVariableStringscode,@PathVariableStringspassword)”用@PathVariable注解聲明參數(shù),還可以寫(xiě)成如下兩種形式:publicResultloginCheckByPath(@PathVariable("scode")Stringscode,@PathVariable("spassword")Stringspassword)publicResultloginCheckByPath(@PathVariable(value="scode")Stringscode,@PathVariable(value="spassword")Stringspassword)其中,@PathVariable(value="xxx")中的“xxx”為參數(shù)名,它必須與注解語(yǔ)句“@RequestMapping("/checkbypath/{xxx}/...")”中的模板變量名相一致,但與其后聲明的參數(shù)名可以不同,比如,寫(xiě)成下面這樣也是正確的:publicResultloginCheckByPath(@PathVariable(value="scode")Stringcode,@PathVariable(value="spassword")Stringpassword)URL請(qǐng)求參數(shù)傳遞3.用@RequestParam映射參數(shù)為適應(yīng)這類(lèi)應(yīng)用需求,SpringBoot專門(mén)提供了@RequestParam注解來(lái)支持程序間參數(shù)的映射和默認(rèn)賦值,下面簡(jiǎn)單演示這種用法。(1)控制器編程在控制器SupController中添加一個(gè)loginCheckByPara方法,代碼如下:@RequestMapping(value="checkbypara",method=RequestMethod.GET)publicResultloginCheckByPara(@RequestParam(value="scode")Stringscode,@RequestParam(value="spassword",required=false,defaultValue="888")Stringspassword){ Suppliersupplier=newSupplier();supplier.setScode(scode);supplier.setSpassword(spassword); returnsupService.checkSupplier(supplier);}URL請(qǐng)求參數(shù)傳遞(2)運(yùn)行啟動(dòng)項(xiàng)目,打開(kāi)瀏覽器,地址欄輸入http://localhost:8080/index/checkbypara?scode=SXLC001A(省略了密碼)回車(chē),看到以JSON格式返回的響應(yīng)實(shí)體數(shù)據(jù)與前圖2.12的一樣。若故意寫(xiě)錯(cuò)用戶名,提交后返回含錯(cuò)誤碼404及“用戶不存在!”提示消息的JSON數(shù)據(jù)體。(3)說(shuō)明①處理URL映射的注解語(yǔ)句“@RequestMapping(value="checkbypara",method=RequestMethod.GET)”也可以寫(xiě)成下面幾種等效的形式:@RequestMapping("/checkbypara")@GetMapping("/checkbypara")@GetMapping(value="checkbypara")②用@RequestParam注解聲明參數(shù)還可以寫(xiě)成如下兩種形式:publicResultloginCheckByPara(@RequestParam("scode")Stringscode,@RequestParam(value="spassword",required=false,defaultValue="888")Stringspassword)publicResultloginCheckByPara(@RequestParamStringscode,@RequestParam(value="spassword",required=false,defaultValue="888")Stringspassword)目錄04項(xiàng)目打包部署項(xiàng)目打包部署下面以【實(shí)例2.1】介紹SpringBoot項(xiàng)目打包部署的操作步驟。(1)用IDEA打開(kāi)需要打包的【實(shí)例2.1】項(xiàng)目工程。在IDEA開(kāi)發(fā)環(huán)境中,選擇主菜單“File”→“ProjectStructure...”,彈出“ProjectStructure”窗口,如圖2.14所示。項(xiàng)目打包部署(2)點(diǎn)“CreateJARfromModules”對(duì)話框“MainClass”欄右側(cè)的按鈕,彈出“SelectMainClass”框,選中項(xiàng)目com.example.mystore包下的主類(lèi)MystoreApplication,點(diǎn)“OK”,如圖2.15所示。項(xiàng)目打包部署(3)繼續(xù)點(diǎn)“OK”,回到“ProjectStructure”窗口,如圖2.16所示,界面上列出了即將打包的名稱、類(lèi)型、輸出目錄、包中元素的層次布局等相關(guān)信息,確認(rèn)無(wú)誤后單擊“OK”按鈕。(4)點(diǎn)擊IDEA開(kāi)發(fā)環(huán)境右側(cè)邊欄上的“Maven”標(biāo)簽按鈕,在出現(xiàn)的“Maven”子窗口中雙擊“mystore”→“Lifecycle”→“package”項(xiàng)啟動(dòng)打包過(guò)程,如圖2.17所示。項(xiàng)目打包部署(5)此時(shí),下方控制臺(tái)子窗口中輸出一系列信息,稍候片刻,待出現(xiàn)“BUILDSUCCESS”文字就表示打包成功了,如圖2.18所示。項(xiàng)目打包部署在控制臺(tái)輸出信息中,還有一行(圖中特別框出):Buildingjar:C:\Users\...\mystore\target\mystore-0.0.1-SNAPSHOT.jar它提示用戶打包生成的JAR包的存放位置,通常是放在項(xiàng)目target子目錄下,該子目錄由IDEA在打包過(guò)程中自動(dòng)生成,進(jìn)入項(xiàng)目目錄就可以看到,如圖2.19所示。項(xiàng)目打包部署(6)進(jìn)入target子目錄,可看到一個(gè)名為mystore-0.0.1-SNAPSHOT.jar的文件,它就是打包得到的JAR包,可直接在JVM上運(yùn)行。將這個(gè)文件復(fù)制到某個(gè)特定的目錄下,通過(guò)Windows命令行進(jìn)入其所在目錄,執(zhí)行語(yǔ)句:java-jarmystore-0.0.1-SNAPSHOT.jar控制臺(tái)輸出如圖2.20所示的信息,可見(jiàn)SpringBoot已經(jīng)啟動(dòng)開(kāi)始工作了,與在IDEA開(kāi)發(fā)環(huán)境下的啟動(dòng)信息一樣。項(xiàng)目打包部署說(shuō)明:打包生成的JAR包文件mystore-0.0.1-SNAPSHOT.jar可以根據(jù)需要重命名,只要運(yùn)行時(shí)命令語(yǔ)句“java-jar”后面跟的文件名與之一致即可。JAR包文件可以部署到任何計(jì)算機(jī)上啟動(dòng)運(yùn)行,只要該機(jī)器安裝有版本匹配的JDK就行。若想結(jié)束程序運(yùn)行,只須直接關(guān)閉啟動(dòng)JAR包的這個(gè)命令行窗口。如果項(xiàng)目在先前已經(jīng)打過(guò)包,再次打包前需要先清理原來(lái)舊的target目錄。方法是:點(diǎn)擊IDEA開(kāi)發(fā)環(huán)境右側(cè)邊欄上的“Maven”標(biāo)簽按鈕,在出現(xiàn)的“Maven”子窗口中雙擊“mystore”→“Lifecycle”→“clean”項(xiàng)。①③④②第2章SpringBoot開(kāi)發(fā)入門(mén)——SpringBoot項(xiàng)目結(jié)構(gòu)SpringBoot實(shí)用教程(第4版)SpringBoot項(xiàng)目結(jié)構(gòu)用IDEA開(kāi)發(fā)的SpringBoot項(xiàng)目有著固定的結(jié)構(gòu),【實(shí)例2.1】項(xiàng)目的結(jié)構(gòu)如圖2.21所示。SpringBoot項(xiàng)目結(jié)構(gòu)1.程序開(kāi)發(fā)目錄(1)總程序包用于分門(mén)別類(lèi)地存放程序各個(gè)模塊(層次)的源代碼,本例的總程序包名為com.example.mystore,這個(gè)名稱是在創(chuàng)建項(xiàng)目的時(shí)候由向?qū)Ц鶕?jù)用戶設(shè)置內(nèi)容自動(dòng)生成的,如圖2.22所示,生成規(guī)則為:Group.Artifact,其中Group為組名,默認(rèn)com.example,當(dāng)然也可以由用戶自己命名;Artifact是項(xiàng)目整體的模塊包名,默認(rèn)也就是項(xiàng)目名。(2)主啟動(dòng)類(lèi)這是整個(gè)SpringBoot項(xiàng)目的運(yùn)行啟動(dòng)類(lèi),相當(dāng)于主程序入口,該類(lèi)也是由向?qū)г趧?chuàng)建項(xiàng)目時(shí)自動(dòng)生成的,類(lèi)名構(gòu)成規(guī)則為:項(xiàng)目名+Application,如本例項(xiàng)目名為mystore,主啟動(dòng)類(lèi)名就是MystoreApplication(注意首字母大寫(xiě))。一般在開(kāi)發(fā)時(shí)不要對(duì)主啟動(dòng)類(lèi)的代碼進(jìn)行任何修改。SpringBoot項(xiàng)目結(jié)構(gòu)2.資源文件目錄這個(gè)目錄是專門(mén)用來(lái)存放項(xiàng)目前端頁(yè)面及用到的各種資源的,位于項(xiàng)目目錄的src→main→resources路徑下(與程序開(kāi)發(fā)目錄同級(jí)),其中包含一個(gè)static和一個(gè)templates子目錄、一個(gè)perties配置文件。(1)static目錄用于存放項(xiàng)目靜態(tài)資源,如需要在頁(yè)面上顯示的圖片等。(2)templates目錄用于存放前端頁(yè)面源文件,如HTML5、CSS樣式文件等。(3)perties配置文件這是項(xiàng)目中唯一的配置文件,主要用來(lái)配置程序全局要使用的變量、框架屬性等。SpringBoot項(xiàng)目結(jié)構(gòu)3.測(cè)試目錄IDEA開(kāi)發(fā)的SpringBoot項(xiàng)目支持單元測(cè)試,即在尚未完成整個(gè)項(xiàng)目開(kāi)發(fā)的階段就對(duì)某個(gè)已開(kāi)發(fā)好的模塊(如控制器類(lèi))提前單獨(dú)地進(jìn)行測(cè)試和調(diào)試,為此,在與src→main同級(jí)的項(xiàng)目路徑下自帶了一個(gè)測(cè)試目錄(src→test),其中含有與程序開(kāi)發(fā)目錄幾乎一模一樣的結(jié)構(gòu):一個(gè)總程序包和一個(gè)主類(lèi),程序包的名稱也是com.example.mystore,只不過(guò)主類(lèi)名成了MystoreApplicationTests(后跟Tests表示測(cè)試類(lèi)),用戶可將開(kāi)發(fā)好的模塊先放進(jìn)測(cè)試目錄下對(duì)應(yīng)層次的包中,再在主類(lèi)中編寫(xiě)測(cè)試代碼(以@Test等注解標(biāo)注),然后啟動(dòng)測(cè)試主類(lèi),系統(tǒng)就會(huì)模擬真實(shí)環(huán)境的請(qǐng)求處理過(guò)程對(duì)目標(biāo)模塊執(zhí)行測(cè)試,SpringBoot本身也提供了一些現(xiàn)成的測(cè)試框架方便開(kāi)發(fā)者使用。4.依賴配置文件pom.xmlSpringBoot發(fā)明的初衷就是為了簡(jiǎn)化傳統(tǒng)Spring開(kāi)發(fā)繁瑣復(fù)雜的XML配置,故它的項(xiàng)目中去除了一切不必要的配置文件,所有要用的組件都由SpringBoot框架本身自動(dòng)配置注入,項(xiàng)目中僅僅保留一個(gè)依賴配置文件pom.xml,本例的該文件完整內(nèi)容。第2章SpringBoot開(kāi)發(fā)入門(mén)——SpringBoot注解SpringBoot實(shí)用教程(第4版)目錄01入口類(lèi)注解1.@SpringBootApplication2.@Configuration/@SpringBootConfiguration3.@EnableAutoConfiguration4.@ComponentScan入口類(lèi)注解從上節(jié)項(xiàng)目結(jié)構(gòu)可見(jiàn),SpringBoot應(yīng)用都有一個(gè)名為xxxApplication(xxx為項(xiàng)目名,首字母大寫(xiě))的程序入口類(lèi),例如,【實(shí)例2.1】的入口類(lèi)MystoreApplication.java代碼如下:packagecom.example.mystore;

importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplicationpublicclassMystoreApplication{

publicstaticvoidmain(String[]args){SpringApplication.run(MystoreApplication.class,args);}}入口類(lèi)注解1.@SpringBootApplication它是SpringBoot的核心注解,用于標(biāo)注SpringBoot項(xiàng)目的入口,該注解將MystoreApplication標(biāo)注為整個(gè)應(yīng)用的啟動(dòng)類(lèi),一個(gè)項(xiàng)目有且僅有一個(gè)啟動(dòng)類(lèi),故源代碼中也只能存在一個(gè)@SpringBootApplication注解。@SpringBootApplication是一個(gè)組合注解,它組合了@Configuration/@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan這三個(gè)注解,各自發(fā)揮不同的作用。2.@Configuration/@SpringBootConfiguration@Configuration是SpringBoot應(yīng)用的配置注解,它聲明當(dāng)前的類(lèi)是一個(gè)配置類(lèi),Spring容器處理這個(gè)配置類(lèi)來(lái)為我們的應(yīng)用實(shí)例化和配置Bean,故該注解的作用相當(dāng)于傳統(tǒng)Spring開(kāi)發(fā)中所配置的一個(gè)XML文件。在SpringBoot應(yīng)用中推薦使用@SpringBootConfiguration注解替代@Configuration,它能夠自動(dòng)找到配置所在。入口類(lèi)注解3.@EnableAutoConfiguration@EnableAutoConfiguration注解可以讓SpringBoot根據(jù)當(dāng)前項(xiàng)目所依賴的JAR包自動(dòng)配置與之相關(guān)的組件,它借助注解@Import,將所有符合自動(dòng)配置條件的@Configuration配置的Bean都加載到IoC容器中。例如,在SpringBoot項(xiàng)目的pom.xml文件中有一個(gè)spring-boot-starter-web依賴,SpringBoot就會(huì)進(jìn)一步添加并自動(dòng)配置與之關(guān)聯(lián)的Tomcat和SpringMVC依賴。4.@ComponentScan該注解的功能是讓SpringBoot自動(dòng)掃描入口類(lèi)的同級(jí)包及其下所有子包中的配置,所以建議將入口類(lèi)直接放在項(xiàng)目程序開(kāi)發(fā)目錄的總程序包(本例是com.example.mystore)下,這樣就可以確保SpringBoot能夠自動(dòng)掃描到項(xiàng)目所有包中的配置。入口類(lèi)注解在開(kāi)發(fā)中,用以上三個(gè)注解替代核心注解@SpringBootApplication也是合法的,例如,入口類(lèi)的代碼也可以寫(xiě)成如下形式:packagecom.example.mystore;

importorg.springframework.boot.SpringApplication;importorg.springframework.boot.SpringBootConfiguration;importorg.springframework.boot.autoconfigure.EnableAutoConfiguration;importorg.springframework.context.annotation.ComponentScan;

@SpringBootConfiguration@EnableAutoConfiguration@ComponentScanpublicclassMystoreApplication{

publicstaticvoidmain(String[]args){SpringApplication.run(MystoreApplication.class,args); }}目錄02常

解常用注解(1)@Controller標(biāo)注在控制器類(lèi)上,聲明此類(lèi)是一個(gè)SpringMVCController對(duì)象。該注解所標(biāo)注控制器內(nèi)的方法返回的是一個(gè)字符串(String),指向前端某個(gè)頁(yè)面,例如:@ControllerpublicclassSupController{ ...@GetMapping("/index")publicStringinit(Modelmodel){ ...return"index";}}(2)@Service標(biāo)注一個(gè)業(yè)務(wù)層服務(wù)實(shí)體,聲明此類(lèi)是一個(gè)業(yè)務(wù)處理類(lèi)(實(shí)現(xiàn)業(yè)務(wù)接口),專用于處理業(yè)務(wù)邏輯。例如,【實(shí)例2.1】中SupServiceImpl類(lèi)實(shí)現(xiàn)SupService接口,處理登錄驗(yàn)證邏輯:@ServicepublicclassSupServiceImplimplementsSupService{...}常用注解(3)@Repository標(biāo)注一個(gè)持久層數(shù)據(jù)庫(kù)訪問(wèn)類(lèi)(實(shí)現(xiàn)數(shù)據(jù)接口),例如,【實(shí)例2.1】的SupRepositoryImpl類(lèi)實(shí)現(xiàn)SupRepository接口,從MySQL中查詢用戶信息:@RepositorypublicclassSupRepositoryImplimplementsSupRepository{...}(4)@Component這是個(gè)通用的注解,標(biāo)注在無(wú)法用@Controller、@Service、@Repository描述但又必須交由SpringBoot管理的類(lèi)上,將類(lèi)實(shí)例化到容器中。它可配合CommandLineRunner使用,以便在程序啟動(dòng)后執(zhí)行一些基礎(chǔ)任務(wù)。常用注解(5)@Autowired標(biāo)注在類(lèi)的屬性上,表示被修飾的屬性需要注入對(duì)象。SpringBoot會(huì)掃描所有被@Autowired標(biāo)注的屬性,然后根據(jù)其類(lèi)型在IoC容器中找到匹配的對(duì)象進(jìn)行注入。屬性所屬的類(lèi)可以是控制器、業(yè)務(wù)層服務(wù)實(shí)體、持久層數(shù)據(jù)庫(kù)訪問(wèn)類(lèi)等,例如:@ControllerpublicclassSupController{ //控制器類(lèi)@AutowiredprivateSupServicesupService; //注入服務(wù)實(shí)體對(duì)象 ...}

@ServicepublicclassSupServiceImplimplementsSupService{ //服務(wù)實(shí)體@Autowired privateSupRepositorysupRepository; //注入數(shù)據(jù)庫(kù)訪問(wèn)對(duì)象 ...}

@RepositorypublicclassSupRepositoryImplimplementsSupRepository{ //數(shù)據(jù)庫(kù)訪問(wèn)類(lèi)@Autowired privateJdbcTemplatejdbcTemplate; //注入JDBC模板組件 ...}常用注解(6)@RequestMapping它用來(lái)處理請(qǐng)求地址映射,在程序中可標(biāo)注在類(lèi)和/或方法上。如果用在類(lèi)上,表示該類(lèi)中所有響應(yīng)請(qǐng)求的方法都是以該注解中的地址作為父路徑的;如果僅用在某個(gè)方法上,就只有此方法以注解的地址為路徑;如果同時(shí)用在類(lèi)及其中的方法上,則類(lèi)注解的地址要加上方法自身注解的地址才是完整的響應(yīng)路徑。例如,【實(shí)例2.1】的控制器僅在loginCheck方法上注解:publicclassSupController{ ...@RequestMapping("/check") publicStringloginCheck(Modelmodel,Suppliersupplier){...}運(yùn)行時(shí)請(qǐng)求提交到http://localhost:8080/check(前端頁(yè)面代碼為<formaction="/check"method="post">)。而【實(shí)例2.2】的控制器在類(lèi)和方法上都加了注解:@RequestMapping("index")publicclassSupController{ ...@RequestMapping("/check") publicResultloginCheck(Stringscode,Stringspassword){...} ...}常用注解運(yùn)行時(shí)的訪問(wèn)路徑就變?yōu)閔ttp://localhost:8080/index/check(測(cè)試URL為http://localhost:8080/index/check?scode=SXLC001A&&spassword=888)。@RequestMapping還可以附帶屬性,它有6個(gè)屬性,如下:params:指定Request中必須包含某些參數(shù)值,才讓該方法處理。headers:指定Request中必須包含某些指定的header值,才讓該方法處理。value:指定請(qǐng)求的實(shí)際地址,可以是URITemplate模式。method:指定請(qǐng)求的方法類(lèi)型,如GET、POST、PUT、DELETE等。consumes:指定處理請(qǐng)求的提交內(nèi)容類(lèi)型(Content-Type),如"application/json,text/html"。produces:指定返回的內(nèi)容類(lèi)型。只有當(dāng)Request請(qǐng)求頭中的Accept類(lèi)型中包含該指定類(lèi)型時(shí)才返回。@RequestMapping(value="check",method=RequestMethod.GET)例如,用屬性設(shè)定請(qǐng)求參數(shù):常用注解(7)@Requestbody/@ResponseBody@Requestbody標(biāo)注在方法參數(shù)前,常用來(lái)處理application/json、application/xml等內(nèi)容類(lèi)型(Content-Type)的數(shù)據(jù),意味著HTTP消息是JSON/XML格式,需將其轉(zhuǎn)化為指定類(lèi)型參數(shù)處理。通過(guò)@Requestbody可以將請(qǐng)求體中的(JSON/XML)字符串綁定到相應(yīng)的Bean上,也可以將其分別綁定到對(duì)應(yīng)的字符串上。@ResponseBody通過(guò)轉(zhuǎn)換器將控制器中方法返回的對(duì)象轉(zhuǎn)換為指定的格式(JSON/XML)后,寫(xiě)入Response對(duì)象的body數(shù)據(jù)區(qū)。它常用來(lái)返回JSON格式的數(shù)據(jù),使用該注解后,數(shù)據(jù)直接寫(xiě)進(jìn)輸入流,不需要進(jìn)行視圖渲染。例如,【實(shí)例2.1】返回的商家用戶信息是顯示在頁(yè)面上的,如果我們未開(kāi)發(fā)前端頁(yè)面,而又想從瀏覽器看到數(shù)據(jù)內(nèi)容,就要以JSON格式返回,在控制器中添加代碼:@RequestMapping("/login")@ResponseBodypublicResultloginCheck(Suppliersupplier){ returnsupService.checkSupplier(supplier);}常用注解(8)@RestController這也是用于標(biāo)注控制器類(lèi)的,作用相當(dāng)于@ResponseBody加@Controller,但它返回的是JSON/XML格式的數(shù)據(jù)而非HTML頁(yè)面。例如,【實(shí)例2.2】是通過(guò)URL攜帶的參數(shù)發(fā)起請(qǐng)求,而返回?cái)?shù)據(jù)也未用頁(yè)面渲染(直接JSON格式),故其控制器要以@RestController修飾。(9)@Override這是Spring的系統(tǒng)注解,用于修飾方法,表示此方法重寫(xiě)了父類(lèi)(或接口)的方法。例如,【實(shí)例2.1】的服務(wù)實(shí)體SupServiceImpl實(shí)現(xiàn)業(yè)務(wù)接口的checkSupplier方法、數(shù)據(jù)庫(kù)訪問(wèn)類(lèi)SupRepositoryImpl實(shí)現(xiàn)數(shù)據(jù)接口的findSupplier方法,都必須在方法前加注解如下:publicclassSupServiceImplimplementsSupService{ ...@Override publicResultcheckSupplier(Suppliersupplier){...}}

publicclassSupRepositoryImplimplementsSupRepository{ ...@Override publicSupplierfindSupplier(Suppliersupplier){...}}常用注解(10)@Data這是三層架構(gòu)開(kāi)發(fā)中常用的Lombok框架的注解,標(biāo)注在模型實(shí)體類(lèi)上,在編程時(shí)就可以省略模型類(lèi)的get/set方法以達(dá)到簡(jiǎn)化代碼的目的,注意該注解在使用前一定要先導(dǎo)入Lombok的Data庫(kù),如下:importlombok.Data;

@DatapublicclassSupplier{ //模型中各屬性的聲明 ...}(11)@Bean標(biāo)注在方法上,聲明該方法的返回結(jié)果是一個(gè)由Spring容器管理的Bean。常用注解(12)@PathVariable標(biāo)注在方法參數(shù)前,將URL獲取的參數(shù)映射到方法參數(shù)上以獲取路徑中的參數(shù),例如,【實(shí)例2.2】的URL請(qǐng)求參數(shù)傳遞方式二:@RequestMapping("/checkbypath/{scode}/{spassword}") //處理URL映射的注解語(yǔ)句publicResultloginCheckByPath(@PathVariableStringscode,@PathVariableStringspassword){...}(13)@Value標(biāo)注在屬性上,用于獲取配置文件中的值。目錄03其他注解其他注解(1)@Deprecated:用于修飾方法,表示此方法已經(jīng)過(guò)時(shí),經(jīng)常在版本升級(jí)后會(huì)遇到。(2)@SuppressWarnnings:告訴編譯器忽視某類(lèi)編譯警告。它有以下一些屬性:unchecked:未檢查的轉(zhuǎn)化。unused:未使用的變量。resource:泛型,即未指定類(lèi)型。path:在類(lèi)中的路徑。原文件路徑中有不存在的路徑。deprecation:使用了某些不推薦使用的類(lèi)和方法。fallthrough:switch語(yǔ)句執(zhí)行到底,不會(huì)遇到break關(guān)鍵字。serial:實(shí)現(xiàn)了Serializable,但未定義serialVersionUID。rawtypes:沒(méi)有傳遞帶有泛型的參數(shù)。all:代表全部類(lèi)型的警告。(3)@Resource:標(biāo)注在類(lèi)名、屬性或構(gòu)造函數(shù)參數(shù)上,作用與常用的@Autowired類(lèi)同,兩者都可以用來(lái)裝配Bean,但@Resource默認(rèn)是按名稱注入對(duì)象的。(4)@Transactional:用于處理事務(wù),它可以標(biāo)注在接口、接口方法、類(lèi)及類(lèi)方法上。但SpringBoot不建議在接口或者接口方法上使用該注解,因?yàn)樵撟⒔庵挥性谑褂没诮涌诘拇頃r(shí)才會(huì)生效。其他注解(5)@Qualifier:標(biāo)注在類(lèi)名或?qū)傩陨?,為Bean指定名稱,隨后再通過(guò)名字引用Bean。它的意思是“合格者”,用于標(biāo)注哪一個(gè)實(shí)現(xiàn)類(lèi)才是需要注入的。需要注意的是,@Qualifier的參數(shù)名稱為被注入的類(lèi)中的注解@Service標(biāo)注的名稱。(6)@EnableScheduling:標(biāo)注在入口類(lèi)/類(lèi)名上,用來(lái)開(kāi)啟計(jì)劃任務(wù)。Spring通過(guò)@Scheduled支持多種類(lèi)型的計(jì)劃任務(wù),包含Cron、fixDelay、fixRate等。(7)@EnableAsync:標(biāo)注在入口類(lèi)/類(lèi)名上,用來(lái)開(kāi)啟異步注解功能。(8)@Aspec:用于標(biāo)注切面,也可以用來(lái)配置事務(wù)、日志、權(quán)限驗(yàn)證等。(9)@ControllerAdvice:標(biāo)注在類(lèi)名上,包含@Component,可以被掃描到。統(tǒng)一處理異常。(10)@ExceptionHandler:標(biāo)注在方法上,表示遇到這個(gè)異常就執(zhí)行該方法。第2章SpringBoot開(kāi)發(fā)入門(mén)——SpringBoot配置SpringBoot實(shí)用教程(第4版)目錄01配置文件的讀取方式1.通過(guò)Environment類(lèi)2.通過(guò)@ConfigurationProperties注解3.通過(guò)@Value注解配置文件的讀取方式【實(shí)例2.3】用三種方式分別從perties文件中讀取商家用戶基本信息并顯示。(1)創(chuàng)建SpringBoot項(xiàng)目,項(xiàng)目名為ConfigReader,在出現(xiàn)的向?qū)Ы缑妗癉ependencies”列表中僅需要勾選“Web”→“SpringWeb”、“DeveloperTools”→“Lombok”。(2)在項(xiàng)目perties中編輯用戶基本信息如下:supplier.scode=SXLC001Asupplier.spassword=888supplier.sname=陜西洛川蘋(píng)果有限公司配置文件的讀取方式(3)在項(xiàng)目工程目錄樹(shù)的com.example.configreader節(jié)點(diǎn)下創(chuàng)建entity包,其中創(chuàng)建模型類(lèi)Supplier,代碼為:packagecom.example.configreader.entity;

importlombok.Data;

@DatapublicclassSupplier{ privateStringscode; privateStringspassword; privateStringsname;}配置文件的讀取方式1.通過(guò)Environment類(lèi)Environment是一個(gè)通用的讀取應(yīng)用程序運(yùn)行時(shí)的環(huán)境變量的類(lèi),它用getProperty方法以key-value(鍵-值)的形式讀取數(shù)據(jù),語(yǔ)句為:Environment對(duì)象.getProperty("鍵名")Environment常用于SpringBoot程序獲取全局變量的配置值。在項(xiàng)目工程目錄樹(shù)的com.example.configreader節(jié)點(diǎn)下創(chuàng)建controller包,其中創(chuàng)建控制器類(lèi)EnvReadController,代碼顯示。運(yùn)行程序,訪問(wèn)http://localhost:8080/readenv,顯示結(jié)果如圖2.23所示。配置文件的讀取方式2.通過(guò)@ConfigurationProperties注解(1)先對(duì)模型實(shí)體代碼進(jìn)行修改,在模型類(lèi)Supplier代碼中添加注解,如下:packagecom.example.configreader.entity;

importlombok.Data;importperties.ConfigurationProperties;importorg.springframework.stereotype.Component;

@Data@Component@ConfigurationProperties(prefix="supplier")publicclassSupplier{ privateStringscode; privateStringspassword; privateStringsname;}配置文件的讀取方式(2)在項(xiàng)目工程目錄樹(shù)的com.example.configreader.controller包中,創(chuàng)建控制器類(lèi)CfgReadController,代碼如下:packagecom.example.configreader.controller;

importcom.example.configreader.entity.Supplier;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;

@RestControllerpublicclassCfgReadController{@Autowired Suppliersupplier; //注入模型實(shí)體

@RequestMapping("/readcfg") publicSupplierreadCfg(){ returnsupplier; //注入后直接就可以返回顯示了 }}配置文件的讀取方式3.通過(guò)@Value注解用@ConfigurationProperties注解整體載入模型數(shù)據(jù)的方式雖然簡(jiǎn)單有效,但它也存在局限性,就是要求配置文件中的屬性名、順序和數(shù)目必須與程序模型的嚴(yán)格一一對(duì)應(yīng),否則就無(wú)法正確加載數(shù)據(jù)。而且有的時(shí)候,程序只須用到對(duì)象實(shí)體的一個(gè)或少數(shù)幾個(gè)屬性,用整體注入的方式既沒(méi)必要又浪費(fèi)內(nèi)存,這種情況下適合用@Value注解獲取單個(gè)屬性賦值給程序中的變量,用法為:@Value("${鍵名}")private類(lèi)型變量名;在項(xiàng)目工程目錄樹(shù)的com.example.configreader.controller包中,創(chuàng)建控制器類(lèi)ValReadController,代碼顯示。配置文件的讀取方式注意:為防止程序讀取配置文件中的中文出現(xiàn)亂碼,需要對(duì)SpringBoot項(xiàng)目進(jìn)行配置,操作方法是:IDEA環(huán)境選擇主菜單“File”→“Settings...”,彈出“Settings”窗口左側(cè)選中“Editor”→“FileEncodings”,確保右邊界面上“GlobalEncoding”、“ProjectEncoding”欄及下部“PropertiesFiles(*.properties)”所屬“Defaultencodingforpropertiesfiles”欄的當(dāng)前選項(xiàng)均為“UTF-8”,如圖2.24所示,同時(shí)勾選上“Defaultencodingforpropertiesfiles”欄后面的“Transparentnative-to-asciiconversion”項(xiàng),點(diǎn)“OK”按鈕。目錄02Properties配置Properties配置【實(shí)例2.4】用戶登錄信息(商家編碼和密碼)預(yù)先存儲(chǔ)在perties中,程序初始化時(shí)就將配置文件中的登錄信息讀取出來(lái)填寫(xiě)在頁(yè)面表單上,方便用戶直接登錄。本例在前面已經(jīng)完成【實(shí)例2.1】項(xiàng)目基礎(chǔ)上修改而成。(1)在perties配置文件中添加用戶登錄信息,如下:spring.datasource.url=jdbc:mysql://localhost:3306/netshop?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=truespring.datasource.username=rootspring.datasource.password=123456spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.jackson.serialization.indent-output=true

supplier.scode=SXLC001Asupplier.spassword=888(2)在控制器中通過(guò)@Value注解讀取配置文件中的登錄信息,同時(shí)修改init方法,將讀取的商家編碼和密碼用addAttribute方法添加到頁(yè)面Model屬性。Properties配置控制器SupController.java的代碼改為如下:...@ControllerpublicclassSupController{ @Autowired privateSupServicesupService; @Value("${supplier.scode}") privateStringscode; //商家編碼

@Value("${supplier.spassword}") privateStringspassword; //密碼

@GetMapping("/index") publicStringinit(Modelmodel){ Resultresult=newResult();result.setCode(100);result.setMsg("初始狀態(tài)");model.addAttribute("result",result); //從配置文件讀取的用戶信息自動(dòng)填寫(xiě)在前端頁(yè)面上model.addAttribute("scode",scode);model.addAttribute("spassword",spassword); return"index";} ...}Properties配置(3)運(yùn)行程序,瀏覽器訪問(wèn)http://localhost:8080/index,可以看到登錄頁(yè)的表單里已經(jīng)自動(dòng)填上了用戶名和密碼,可直接點(diǎn)“登錄”按鈕進(jìn)行提交,如圖2.25所示。目錄03YAML配置YAML配置SpringBoot也支持使用YAML語(yǔ)言編輯配置文件,創(chuàng)建的文件格式是application.yml,需要遵循如下語(yǔ)法規(guī)則:(1)以冒號(hào)分隔鍵名和值,且在冒號(hào)后一定要跟一個(gè)空格,寫(xiě)成:鍵名:(空格)值例如:scode:SXLC001A(2)所有數(shù)據(jù)以樹(shù)狀結(jié)構(gòu)組織,用空格的縮進(jìn)來(lái)控制層級(jí)關(guān)系,只要是左對(duì)齊的一列數(shù)據(jù)就是同一層級(jí)。例如:supplier:sname:陜西洛川蘋(píng)果有限公司contactway:sweixin:8123456-tel:0911-812345XYAML配置(3)對(duì)于有多個(gè)屬性的對(duì)象,可在首行先定義對(duì)象名,再?gòu)南乱恍虚_(kāi)始依次分行羅列對(duì)象的各屬性和值(注意縮進(jìn));也可以以“對(duì)象名:值”的形式寫(xiě)在同一行上,但“值”部分的所有屬性要用一個(gè)大括號(hào)括起來(lái),其中每個(gè)屬性也是“鍵名:(空格)

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論