Java微服務(wù)架構(gòu)實(shí)戰(zhàn)_第1頁
Java微服務(wù)架構(gòu)實(shí)戰(zhàn)_第2頁
Java微服務(wù)架構(gòu)實(shí)戰(zhàn)_第3頁
Java微服務(wù)架構(gòu)實(shí)戰(zhàn)_第4頁
Java微服務(wù)架構(gòu)實(shí)戰(zhàn)_第5頁
已閱讀5頁,還剩319頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

Java微服務(wù)架構(gòu)實(shí)戰(zhàn)目錄\h第一部分SpringBoot篇\h第1章SpringBoot編程起步\h1.1傳統(tǒng)開發(fā)中痛的領(lǐng)悟\h1.2SpringBoot簡(jiǎn)介\h1.3SpringBoot編程起步\h1.4本章小結(jié)\h第2章SpringBoot程序開發(fā)\h2.1建立統(tǒng)一父pom管理\h2.2SpringBoot程序測(cè)試\h2.3SpringBoot注解分析\h2.4配置訪問路徑\h2.5SpringBoot調(diào)試\h2.6使用內(nèi)置對(duì)象\h2.7使用Jetty容器\h2.8配置環(huán)境屬性\h2.9讀取資源文件\h2.10整合Spring配置\h2.11SpringBoot項(xiàng)目打包發(fā)布\h2.12profile配置\h2.13本章小結(jié)\h第3章Thymeleaf模板渲染\h3.1Thymeleaf簡(jiǎn)介\h3.2Thymeleaf編程起步\h3.3Thyemeleaf靜態(tài)資源\h3.4讀取資源文件\h3.5路徑處理\h3.6內(nèi)置對(duì)象操作支持\h3.7對(duì)象輸出\h3.8頁面邏輯處理\h3.9數(shù)據(jù)迭代處理\h3.10包含指令\h3.11Thymeleaf數(shù)據(jù)處理\h3.12本章小結(jié)\h第4章SpringBoot與Web應(yīng)用\h4.1配置Tomcat運(yùn)行\(zhòng)h4.2https安全訪問\h4.3數(shù)據(jù)驗(yàn)證\h4.4配置錯(cuò)誤頁\h4.5全局異常處理\h4.6文件上傳\h4.6.1基礎(chǔ)上傳\h4.6.2上傳文件限制\h4.6.3上傳多個(gè)文件\h4.7攔截器\h4.8AOP攔截器\h4.9本章小結(jié)\h第5章SpringBoot服務(wù)整合\h5.1SpringBoot整合數(shù)據(jù)源\h5.1.1SpringBoot整合C3P0數(shù)據(jù)庫連接池\h5.1.2SpringBoot整合Druid數(shù)據(jù)庫連接池\h5.2SpringBoot整合ORM開發(fā)框架\h5.2.1SpringBoot整合MyBatis開發(fā)框架\h5.2.2SpringBoot整合JPA開發(fā)框架\h5.2.3事務(wù)處理\h5.3SpringBoot整合消息服務(wù)組件\h5.3.1SpringBoot整合ActiveMQ消息組件\h5.3.2SpringBoot整合RabbitMQ消息組件\h5.3.3SpringBoot整合Kafka消息組件\h5.4SpringBoot整合Redis數(shù)據(jù)庫\h5.4.1SpringBoot整合RedisTemplate操作Redis\h5.4.2Redis對(duì)象序列化操作\h5.4.3配置多個(gè)RedisTemplate\h5.5SpringBoot整合安全框架\h5.5.1SpringBoot整合Shiro開發(fā)框架\h5.5.2SpringBoot基于Shiro整合OAuth統(tǒng)一認(rèn)證\h5.6SpringBoot整合郵件服務(wù)器\h5.7定時(shí)調(diào)度\h5.8Actuator監(jiān)控\h5.9本章小結(jié)\h第二部分SpringCloud篇\h第6章SpringCloud簡(jiǎn)介\h6.1RPC分布式開發(fā)技術(shù)\h6.2RPC實(shí)現(xiàn)技術(shù)\h6.3SpringCloud技術(shù)架構(gòu)\h6.4本章小結(jié)\h第7章SpringCloud與Restful\h7.1搭建SpringCloud項(xiàng)目開發(fā)環(huán)境\h7.2Restful基礎(chǔ)實(shí)現(xiàn)\h7.2.1建立公共API模塊:mldncloud-api\h7.2.2建立部門微服務(wù):mldncloud-dept-service-8001\h7.2.3建立Web消費(fèi)端:mldncloud-consumer-resttemplate\h7.3Restful接口描述\h7.4SpringSecurity安全訪問\h7.4.1微服務(wù)安全驗(yàn)證\h7.4.2消費(fèi)端安全訪問\h7.4.3StatelessSession\h7.4.4安全配置模塊\h7.5本章小結(jié)\h第8章Eureka注冊(cè)服務(wù)\h8.1Eureka簡(jiǎn)介\h8.2定義Eureka服務(wù)端\h8.3向Eureka中注冊(cè)微服務(wù)\h8.4Eureka服務(wù)信息\h8.5Eureka發(fā)現(xiàn)管理\h8.6Eureka安全配置\h8.7Eureka-HA機(jī)制\h8.8Eureka服務(wù)發(fā)布\h8.9本章小結(jié)\h第9章SpringCloud服務(wù)組件\h9.1Ribbon負(fù)載均衡組件\h9.1.1Ribbon基本使用\h9.1.2Ribbon負(fù)載均衡\h9.1.3Ribbon負(fù)載均衡策略\h9.2Feign遠(yuǎn)程接口映射\h9.2.1Feign接口轉(zhuǎn)換\h9.2.2Feign相關(guān)配置\h9.3Hystrix熔斷機(jī)制\h9.3.1Hystrix基本使用\h9.3.2失敗回退\h9.3.3HystrixDashboard\h9.3.4Turbine聚合監(jiān)控\h9.4Zuul路由網(wǎng)關(guān)\h9.4.1Zuul整合微服務(wù)\h9.4.2Zuul訪問過濾\h9.4.3Zuul路由配置\h9.4.4Zuul服務(wù)降級(jí)\h9.4.5上傳微服務(wù)\h9.5本章小結(jié)\h第10章SpringCloudConfig\h10.1SpringCloudConfig簡(jiǎn)介\h10.2配置SpringCloudConfig服務(wù)端\h10.3SpringCloudConfig客戶端抓取配置信息\h10.4單倉庫目錄匹配\h10.5多倉庫自動(dòng)匹配\h10.6倉庫匹配模式\h10.7密鑰加密處理\h10.8KeyStore加密處理\h10.9SpringCloudConfig高可用\h10.10SpringCloudBus服務(wù)總線\h10.11本章小結(jié)\h第11章SpringCloudStream\h11.1SpringCloudStream簡(jiǎn)介\h11.2Stream生產(chǎn)者\(yùn)h11.3Stream消費(fèi)者\(yùn)h11.4自定義消息通道\h11.5分組與持久化\h11.6RoutingKey\h11.7本章小結(jié)\h第12章SpringCloudSleuth\h12.1SpringCloudSleuth簡(jiǎn)介\h12.2搭建SpringCloudSleuth微服務(wù)\h12.3Sleuth數(shù)據(jù)采集\h12.4本章小結(jié)\h第13章OAuth認(rèn)證管理\h13.1SpringCloud與OAuth\h13.2搭建OAuth基礎(chǔ)服務(wù)\h13.3使用數(shù)據(jù)庫保存客戶信息\h13.4使用數(shù)據(jù)庫保存微服務(wù)認(rèn)證信息\h13.5建立訪問資源\h13.6使用Redis保存token令牌\h13.7SpringCloud整合OAuth\h13.8本章小結(jié)\h第三部分微服務(wù)輔助篇\h第14章RabbitMQ消息組件\h14.1RabbitMQ簡(jiǎn)介\h14.2配置Erlang開發(fā)環(huán)境\h14.3安裝并配置RabbitMQ\h14.4使用Java訪問RabbitMQ\h14.4.1創(chuàng)建消息生產(chǎn)者\(yùn)h14.4.2創(chuàng)建消息消費(fèi)者\(yùn)h14.4.3消息持久化\h14.4.4虛擬主機(jī)\h14.5發(fā)布訂閱模式\h14.5.1廣播模式\h14.5.2直連模式\h14.5.3主題模式\h14.6Spring整合RabbitMQ\h14.7鏡像隊(duì)列\(zhòng)h14.8本章小結(jié)\h第15章Docker虛擬化容器\h15.1Docker簡(jiǎn)介\h15.2Docker安裝\h15.3Docker配置與使用\h15.3.1獲取并使用Docker鏡像\h15.3.2Docker鏡像\h15.3.3Docker容器\h15.4Docker鏡像管理\h15.4.1通過文件保存Docker鏡像\h15.4.2DockerHub\h15.4.3構(gòu)建Docker鏡像\h15.5微服務(wù)與Docker\h15.5.1使用Docker發(fā)布微服務(wù)\h15.5.2使用DockerCompose編排順序\h15.6本章小結(jié)第一部分

SpringBoot篇?SpringBoot與Restful標(biāo)準(zhǔn)?SpringBoot微服務(wù)創(chuàng)建?Thymeleaf語法標(biāo)準(zhǔn)?SpringBoot與服務(wù)整合第1章SpringBoot編程起步通過本章學(xué)習(xí),可以達(dá)到以下目標(biāo):1.理解基于Maven的傳統(tǒng)項(xiàng)目開發(fā)問題。2.理解SpringBoot開發(fā)框架的主要作用。3.編寫第一個(gè)SpringBoot程序。SpringBoot是當(dāng)下最為流行的JavaWeb端開發(fā)框架,該框架由Spring(Pivotal公司)開源組織提供,使用該框架可以解決傳統(tǒng)項(xiàng)目之中混亂的Maven依賴管理問題,同時(shí)可以基于Maven快速進(jìn)行項(xiàng)目的打包與發(fā)布。1.1傳統(tǒng)開發(fā)中痛的領(lǐng)悟在Java項(xiàng)目開發(fā)中,MVC已經(jīng)成為了一種深入人心的設(shè)計(jì)模式,幾乎所有正規(guī)的項(xiàng)目之中都會(huì)使用到MVC設(shè)計(jì)模式。采用MVC設(shè)計(jì)模式可以有效地實(shí)現(xiàn)顯示層、控制層、業(yè)務(wù)層、數(shù)據(jù)層的結(jié)構(gòu)分離,如圖1-1所示。圖1-1MVC設(shè)計(jì)模式雖然MVC開發(fā)具有良好的可擴(kuò)展性,但是在實(shí)際的開發(fā)過程中,許多開發(fā)者依然會(huì)感受到如下的問題。采用原生Java程序?qū)崿F(xiàn)MVC設(shè)計(jì)模式時(shí),一旦整體項(xiàng)目設(shè)計(jì)不到位,就會(huì)存在大量的重復(fù)代碼,并且項(xiàng)目維護(hù)困難。為了簡(jiǎn)化MVC各個(gè)層的開發(fā),可以引用大量的第三方開發(fā)框架,如Spring、Hibernate、MyBatis、Shiro、JPA、SpringSecurity等,但這些框架都需要在Spring中實(shí)現(xiàn)整合,其結(jié)果就是會(huì)存在大量的配置文件。當(dāng)使用一些第三方的服務(wù)組件(如RabbitMQ、Kafka、JavaMail等)時(shí),需要編寫大量重復(fù)的配置文件,而且還需要根據(jù)環(huán)境定義不同的profile(如dev、beta、product)。使用Maven作為構(gòu)建工具時(shí),需要配置大量的依賴關(guān)系,且程序需要被打包為*.war文件并部署到應(yīng)用服務(wù)器上才可以執(zhí)行。Restful作為接口技術(shù)應(yīng)用得越來越廣泛,但如果使用Spring來搭建Restful服務(wù),則需要引入大量的Maven依賴庫,并且需要編寫許多的配置文件?;谝陨戏N種因素,很多人開始尋求更加簡(jiǎn)便的開發(fā)方式,而遺憾的是,這種簡(jiǎn)便的開發(fā)沒有被官方的JavaEE所支持。JavaEE官方支持的技術(shù)標(biāo)準(zhǔn)依然只提供最原始的技術(shù)支持。1.2SpringBoot簡(jiǎn)介SpringBoot是Spring開發(fā)框架提供的一種擴(kuò)展支持,其主要目的是希望通過簡(jiǎn)單的配置實(shí)現(xiàn)開發(fā)框架的整合,使開發(fā)者的注意力可以完全放在程序業(yè)務(wù)功能的實(shí)現(xiàn)上,其核心在于通過“零配置”的方式來實(shí)現(xiàn)快速且簡(jiǎn)單的開發(fā)。圖1-2顯示了Spring官方網(wǎng)站中SpringBoot項(xiàng)目,圖1-3顯示了SpringBoot當(dāng)前的開發(fā)版本。圖1-2SpringBoot項(xiàng)目站點(diǎn)圖1-3SpringBoot支持版本SpringBoot開發(fā)框架有如下核心功能。獨(dú)立運(yùn)行的Spring項(xiàng)目:SpringBoot可以以jar包的形式直接運(yùn)行在擁有JDK的主機(jī)上。內(nèi)嵌Web容器:SpringBoot內(nèi)嵌了Tomcat容器與Jetty容器,這樣可以不局限于war包的部署形式。簡(jiǎn)化Maven配置:在實(shí)際開發(fā)中需要編寫大量的Maven依賴,在SpringBoot中會(huì)提供一系列使用starter的依賴配置來簡(jiǎn)化Maven配置文件的定義。自動(dòng)配置Spring:采用合理的項(xiàng)目組織結(jié)構(gòu),使Spring的配置注解自動(dòng)生效。減少XML配置:在SpringBoot中依然支持XML配置,同時(shí)也可以利用Bean和自動(dòng)配置機(jī)制減少XML配置文件的定義。1.3SpringBoot編程起步SpringBoot編程需要依賴于Maven或Gradle構(gòu)建工具完成,這里將直接使用Maven進(jìn)行開發(fā),同時(shí)利用Eclipse來建立Maven項(xiàng)目。1.在Eclipse中創(chuàng)建一個(gè)新的Maven項(xiàng)目,項(xiàng)目類型為quickstart,如圖1-4所示。圖1-4Eclipse創(chuàng)建Maven項(xiàng)目2.設(shè)置Maven項(xiàng)目的信息(GroupId、ArtifactId、Version等),本例建立的項(xiàng)目名稱為bootstart,如圖1-5所示。圖1-5設(shè)置Maven的配置信息3.修改pom.xml配置文件,追加SpringBoot的依賴配置與相關(guān)插件。本程序采用官方文檔給出的配置方式實(shí)現(xiàn)了SpringBoot項(xiàng)目的創(chuàng)建。這里,spring-boot-starter-parent就是官方給出的快速構(gòu)建SpringBoot項(xiàng)目的公共父pom.xml配置文件支持。注意:配置完成后要更新項(xiàng)目。本例的項(xiàng)目開發(fā)是基于Eclipse完成的,開發(fā)者修改完pom.xml配置文件之后,一定要更新項(xiàng)目(快捷鍵為Alt+F5),如圖1-6所示。圖1-6更新Eclipse項(xiàng)目4.編寫第一個(gè)SpringBoot程序。5.這里使用了Eclipse-STS(SpringSourceTool)插件,所以可以直接運(yùn)行,如圖1-7所示。圖1-7運(yùn)行SpringBoot項(xiàng)目提示:采用Maven工具直接運(yùn)行。如果Eclipse工具中沒有安裝STS開發(fā)插件,也可以通過Maven的方式運(yùn)行。直接輸入spring-boot:run,就可以啟動(dòng)SpringBoot項(xiàng)目了,如圖1-8所示。圖1-8使用Maven運(yùn)行SpringBoot程序考慮到代碼編寫的方便,本書強(qiáng)烈建議讀者安裝STS開發(fā)插件。本書中所有的項(xiàng)目也都是通過STS插件的方式開發(fā)的。同時(shí)需要提醒讀者的是,當(dāng)使用Eclipse-STS建立了SpringBoot項(xiàng)目時(shí),會(huì)在項(xiàng)目后面標(biāo)記“[boot]”提示信息。6.SpringBoot項(xiàng)目啟動(dòng)之后,開發(fā)者可以直接通過控制臺(tái)看到如圖1-9所示的信息提示,完成后的項(xiàng)目結(jié)構(gòu)如圖1-10所示。圖1-9SpringBoot啟動(dòng)提示信息圖1-10項(xiàng)目結(jié)構(gòu)同時(shí)也可以在控制臺(tái)中看到如下的日志信息:由于SpringBoot自帶Tomcat容器,所以項(xiàng)目啟動(dòng)后通過瀏覽器輸入http://localhost:8080,就可以直接訪問控制器返回的信息,如圖1-11所示。圖1-11SpringBoot運(yùn)行界面1.4本章小結(jié)1.SpringBoot提倡的是一種簡(jiǎn)潔的開發(fā)模式,可保證用戶不被大量的配置文件和依賴關(guān)系所困擾。2.SpringBoot開發(fā)需要Maven或Gradle構(gòu)建工具支持。3.SpringBoot使用一系列的注解來簡(jiǎn)化開發(fā)過程。第2章SpringBoot程序開發(fā)通過本章學(xué)習(xí),可以達(dá)到以下目標(biāo):1.掌握SpringBoot開發(fā)標(biāo)準(zhǔn)。2.掌握SpringBoot中的常用注解。3.掌握內(nèi)置對(duì)象在SpringBoot中的使用。4.掌握SpringBoot項(xiàng)目的打包與發(fā)布處理。5.掌握Spring多開發(fā)環(huán)境(profile)的配置。6.掌握Spring錯(cuò)誤處理以及錯(cuò)誤跳轉(zhuǎn)處理。7.掌握Spring與Tomcat的結(jié)合使用。SpringBoot項(xiàng)目的實(shí)現(xiàn)主要依賴于構(gòu)建工具,在使用構(gòu)建工具定義的過程中往往需要提供一個(gè)標(biāo)準(zhǔn)的父pom定義。同時(shí),一個(gè)良好的SpringBoot程序中會(huì)使用大量的注解來代替配置文件,以輕松實(shí)現(xiàn)項(xiàng)目的打包與部署。本章將為讀者進(jìn)一步詳細(xì)講解與SpringBoot有關(guān)的開發(fā)支持。2.1建立統(tǒng)一父pom管理在項(xiàng)目中使用SpringBoot,往往會(huì)需要引入一個(gè)標(biāo)準(zhǔn)的父pom配置。利用這個(gè)父pom文件,可以方便地進(jìn)行核心依賴庫的導(dǎo)入,并且由父pom統(tǒng)一管理所有的開發(fā)版本。但在實(shí)際的Maven項(xiàng)目開發(fā)中,開發(fā)團(tuán)隊(duì)往往會(huì)根據(jù)自己的需要來自定義屬于自己的父pom,這樣就會(huì)造成沖突。為了解決這樣的問題,在SpringBoot里面,用戶也可以直接以依賴管理的形式使用SpringBoot。1.【mldnboot項(xiàng)目】建立一個(gè)用于管理父pom的Maven項(xiàng)目mldnboot,如圖2-1所示。圖2-1建立一個(gè)新的Maven項(xiàng)目2.【mldnboot項(xiàng)目】修改pom.xml配置文件,追加相關(guān)依賴配置項(xiàng)。3.【mldnboot項(xiàng)目】在mldnboot父項(xiàng)目之中建立一個(gè)新的Maven模塊mldnboot-base,如圖2-2所示。圖2-2建立mldnboot-base子模塊4.【mldnboot-base項(xiàng)目】修改pom.xml配置文件,追加要引入的SpringBoot依賴配置。5.【mldnboot-base項(xiàng)目】編寫程序,實(shí)現(xiàn)SpringBoot基礎(chǔ)開發(fā)。本程序與第1章中的SpringBoot程序功能相同,正常啟動(dòng)SpringBoot后就可以通過瀏覽器得到相應(yīng)的結(jié)果了。2.2SpringBoot程序測(cè)試SpringBoot程序開發(fā)完成之后,需要對(duì)程序的功能進(jìn)行測(cè)試,這時(shí)需要啟動(dòng)Spring容器。開發(fā)者可以直接利用SpringBoot提供的依賴包來實(shí)現(xiàn)控制層方法測(cè)試。1.【mldnboot-base項(xiàng)目】修改pom.xml配置文件,引入測(cè)試相關(guān)依賴包。2.【mldnboot-base項(xiàng)目】編寫一個(gè)測(cè)試程序類。3.【mldnboot-base】測(cè)試程序編寫完成之后,就可以啟動(dòng)測(cè)試了。如果測(cè)試通過,則返回如圖2-3所示的界面。圖2-3SpringBoot測(cè)試成功2.3SpringBoot注解分析通過前面的學(xué)習(xí)可以發(fā)現(xiàn),在整個(gè)SpringBoot程序里面使用了許多注解,這些注解的作用如表2-1所示。表2-1SpringBoot注解在給定的幾個(gè)注解中,@EnableAutoConfiguration為整個(gè)SpringBoot的啟動(dòng)注解配置,也就是說,這個(gè)注解應(yīng)該隨著程序的主類一起進(jìn)行定義。但是該注解有一個(gè)前提,就是只能夠掃描在同一程序類包中的配置程序,很明顯其功能是不足的。對(duì)于控制器程序類,由于在項(xiàng)目中有許多的控制器,那么最好將這些類統(tǒng)一保存在一個(gè)包中(如將所有的控制器程序類保存在cn.mldn.mldnboot.controller中,這是cn.mldn.mldnboot子包),在這樣的環(huán)境下建議開發(fā)者使用@SpringBootApplication注解實(shí)現(xiàn)啟動(dòng)配置。注意:請(qǐng)嚴(yán)格遵守SpringBoot的自動(dòng)配置約束。在SpringBoot開發(fā)過程中,為了簡(jiǎn)化開發(fā)配置,往往會(huì)在SpringBoot啟動(dòng)類下創(chuàng)建若干個(gè)子包,這樣子包中的注解就都可以自動(dòng)掃描到(@EnableAutoConfiguration注解不支持此功能),并且可以實(shí)現(xiàn)依賴關(guān)系的自動(dòng)配置。以本程序?yàn)槔?,如果要進(jìn)行標(biāo)準(zhǔn)開發(fā),則程序的開發(fā)包結(jié)構(gòu)如圖2-4所示。圖2-4SpringBoot項(xiàng)目結(jié)構(gòu)此時(shí)保存在cn.mldn.mldnboot下的所有子包中配置的注解都可以被Spring容器自動(dòng)掃描。如果不在指定的子包中,程序啟動(dòng)類就需要配置@ComponentScan注解設(shè)置掃描包。這樣的配置會(huì)顯得整個(gè)項(xiàng)目非常啰嗦,如果不是必須的情況下,不建議這樣配置??梢院?jiǎn)單地將@SpringBootApplication理解為:@SpringBootApplication=@EnableAutoConfiguration+@ComponentScan(掃描父包)。1.【mldnboot-base項(xiàng)目】建立一個(gè)控制器類。2.【mldnboot-base項(xiàng)目】編寫程序啟動(dòng)類(SpringBootStartApplication),使用@SpringBootApplication進(jìn)行注解。由于啟動(dòng)程序類保存在cn.mldn.mldnboot父包下,所以該包中所有的子包都將被自動(dòng)掃描,而后自動(dòng)實(shí)現(xiàn)配置。2.4配置訪問路徑在實(shí)際的項(xiàng)目開發(fā)中,控制器的路徑可能會(huì)有許多個(gè)。在進(jìn)行控制器編寫的時(shí)候,也會(huì)有以下兩種運(yùn)行模式。控制器跳轉(zhuǎn)模式:可以使用@Controller注解定義,如果要實(shí)現(xiàn)Restful顯示,也可以聯(lián)合@ResponseBody注解一起使用。Restful顯示:可以使用@RestController注解,里面所有路徑訪問的信息都以Restful形式展示。1.【mldnboot-base項(xiàng)目】定義MessageController控制器程序類,使用Restful風(fēng)格顯示。此時(shí)的控制器程序類上使用了@RestController注解,這樣就可以避免在方法上使用@ResponseBody注解。此時(shí),MessageController類中的所有映射路徑都會(huì)以Restful形式展示。提示:Restful是SpringCloud技術(shù)的實(shí)現(xiàn)核心。在控制器里面一旦使用了@RestController注解,則意味著所有方法都將以Restful風(fēng)格展示。這種做法未必適合于SpringBoot項(xiàng)目,因?yàn)樵诤芏鄷r(shí)候需要通過控制器跳轉(zhuǎn)到顯示層頁面,而Restful是SpringCloud技術(shù)的實(shí)現(xiàn)關(guān)鍵。2.【mldnboot-base項(xiàng)目】前面定義的控制器類只能進(jìn)行簡(jiǎn)單的信息返回,實(shí)際上也可以進(jìn)行參數(shù)的接收處理。傳遞參數(shù)到控制器中最簡(jiǎn)單的做法是使用地址重寫傳遞“訪問路徑?參數(shù)名稱=內(nèi)容”,在MessageController控制器程序類之中擴(kuò)充一個(gè)新的echo()方法。此時(shí)如果要進(jìn)行該路徑的訪問,則可以直接通過地址欄傳遞參數(shù)(http://localhost:8080/echo?msg=),并且參數(shù)的名稱應(yīng)該默認(rèn)使用msg,程序執(zhí)行后的界面如圖2-5所示。圖2-5echo()方法返回信息3.【mldnboot-base項(xiàng)目】由于SpringBoot支持Restful風(fēng)格處理,所以參數(shù)的接收可以采用路徑參數(shù)的形式完成,但是需要在控制器方法的參數(shù)聲明上使用@PathVariable注解與訪問路徑的參數(shù)進(jìn)行關(guān)聯(lián)。本程序需要通過地址傳遞參數(shù),地址設(shè)置為http://localhost:8080/echo/,程序顯示結(jié)果如圖2-6所示。圖2-6通過地址傳遞參數(shù)提示:關(guān)于傳遞參數(shù)的選擇。在Restful架構(gòu)中請(qǐng)求路徑受多類語法支持,開發(fā)者可以結(jié)合HTTP請(qǐng)求模式(GET、POST、PUT、DELETE等)與路徑,實(shí)現(xiàn)多種組合,以處理不同類型的用戶請(qǐng)求。參數(shù)的傳遞模式可以由開發(fā)團(tuán)隊(duì)自行定義。2.5SpringBoot調(diào)試在項(xiàng)目開發(fā)的過程中經(jīng)常需要對(duì)代碼進(jìn)行反復(fù)修改,這樣就會(huì)導(dǎo)致SpringBoot運(yùn)行容器反復(fù)啟動(dòng)。為了解決這種頻繁重啟問題,SpringBoot提供了自動(dòng)加載配置的依賴庫,以實(shí)現(xiàn)代碼的動(dòng)態(tài)加載。范例:【mldnboot-base項(xiàng)目】修改pom.xml配置文件,追加自動(dòng)加載依賴庫配置。項(xiàng)目中配置了以上兩個(gè)開發(fā)包之后,每當(dāng)用戶修改項(xiàng)目中程序類的時(shí)候都會(huì)由SpringBoot自動(dòng)加載更新后的程序代碼,同時(shí)也可以在項(xiàng)目名稱上看到如圖2-7所示的標(biāo)記“[devtools]”。圖2-7SpringBoot動(dòng)態(tài)加載更新程序2.6使用內(nèi)置對(duì)象通過SpringBoot程序可以發(fā)現(xiàn),SpringBoot中控制器的形式和SpringMVC中是一樣的,因此在程序中使用JSP的內(nèi)置對(duì)象也可以按照與SpringMVC同樣的方式進(jìn)行。1.【mldnboot-base項(xiàng)目】在MessageController控制器類之中追加新的方法,用于實(shí)現(xiàn)內(nèi)置對(duì)象獲取。此時(shí)采用了與SpringMVC同樣的方式來獲取內(nèi)置對(duì)象,并且將所有的信息保存在Map集合中,最后以Restful形式返回獲取的信息(將Map集合自動(dòng)變?yōu)镴SON數(shù)據(jù)),程序運(yùn)行界面如圖2-8所示。圖2-8獲取內(nèi)置對(duì)象信息2.【mldnboot-base項(xiàng)目】除了在控制器的方法上使用參數(shù)來接收內(nèi)置對(duì)象外,也可以利用ServletRequestAttributes形式來獲取內(nèi)置對(duì)象。本程序?qū)崿F(xiàn)了與上一程序完全相同的處理效果,唯一的區(qū)別是,控制器的方法不再需要明確地接收內(nèi)置對(duì)象的參數(shù),程序運(yùn)行效果與圖2-8相同。2.7使用Jetty容器SpringBoot在項(xiàng)目啟動(dòng)時(shí)默認(rèn)情況下使用的是Tomcat容器,這一點(diǎn)可以通過日志直觀看到。在實(shí)際的開發(fā)過程中,開發(fā)者往往會(huì)選擇Jetty作為Web容器,由于SpringBoot也支持Jetty容器,所以開發(fā)者只需要修改pom.xml配置文件即可。1.【mldnboot-base項(xiàng)目】修改pom.xml文件,使用Jetty容器運(yùn)行。2.【mldnboot-base項(xiàng)目】修改完pom.xml文件后,需要重新啟動(dòng)SpringBoot項(xiàng)目,此時(shí)就可以在日志中看到如下信息。程序可以使用小巧的Jetty容器來運(yùn)行SpringBoot項(xiàng)目,但是這種做法也僅僅是在開發(fā)過程中使用,在實(shí)際的生產(chǎn)環(huán)境下依然推薦使用Tomcat作為Web容器。2.8配置環(huán)境屬性SpringBoot提倡的是一種“零配置”的設(shè)計(jì)框架,所以提供有許多默認(rèn)的配置項(xiàng)。例如,SpringBoot項(xiàng)目默認(rèn)運(yùn)行的8080端口就是一種默認(rèn)配置。如果開發(fā)者需要修改SpringBoot的這種默認(rèn)配置,可以在項(xiàng)目所在的CLASSPATH下添加perties配置文件。1.【mldnboot-base項(xiàng)目】建立一個(gè)新的源文件目錄src/main/resources。2.【mldnboot-base項(xiàng)目】在src/main/resources源文件目錄中建立perties配置文件,目錄結(jié)構(gòu)如圖2-9所示。圖2-9定義配置文件注意:配置文件名稱要相同。SpringBoot開發(fā)框架對(duì)一些結(jié)構(gòu)(子包掃描)和配置文件(perties)做出了限定,這樣開發(fā)者在使用框架開發(fā)的時(shí)候可以減少配置。如果開發(fā)者定義的配置文件名稱不是perties,那么SpringBoot將無法加載。在本文件中進(jìn)行SpringBoot項(xiàng)目默認(rèn)端口的變更,將其修改為80端口運(yùn)行。修改完成后重新啟動(dòng)SpringBoot項(xiàng)目(使用的是Tomcat容器),可以看到提示信息:Tomcatstartedonport(s):80(http),表示當(dāng)前的項(xiàng)目可以直接運(yùn)行在80端口上。3.【mldnboot-base項(xiàng)目】SpringBoot項(xiàng)目默認(rèn)情況下會(huì)將程序發(fā)布在根目錄下,如果有需要,也可以配置上下文路徑(ContextPath)。本程序追加了一個(gè)context-path配置,所以項(xiàng)目的訪問路徑為http://localhost/mldnjava/echo/(追加了/mldnjava的路徑前綴),頁面運(yùn)行效果如圖2-10所示。圖2-10增加ContextPath配置4.【mldnboot-base項(xiàng)目】在SpringBoot中可以使用的配置文件類型有兩種:perties和application.yml,這兩種配置文件都可以實(shí)現(xiàn)對(duì)SpringBoot環(huán)境的修改。下面將application.properties配置替換為application.yml,內(nèi)容如下:此時(shí)實(shí)現(xiàn)了與之前完全相同的配置,讀者可以發(fā)現(xiàn)使用application.yml配置文件的結(jié)構(gòu)要比使用perties更加清晰。提示:關(guān)于yml配置文件說明。yml實(shí)際上是YAML(YetAnotherMarkupLanguange,一種標(biāo)記語言)文件,這是一種結(jié)構(gòu)化的數(shù)據(jù)文件,大量應(yīng)用在各種開源項(xiàng)目之中,如ApacheStorm。Spring官方推薦使用application.yml來進(jìn)行SpringBoot或SpringCloud框架的配置定義。如果項(xiàng)目中同時(shí)存在application.yml與perties配置文件并且配置沖突,將以perties文件中的配置為參考。在本書后面講解的過程中,如無意外,將全部使用application.yml進(jìn)行SpringBoot項(xiàng)目的配置。2.9讀取資源文件在實(shí)際的項(xiàng)目開發(fā)中,資源文件不可或缺,因?yàn)樗械奶崾疚淖中畔⒍家谫Y源文件中進(jìn)行定義,而且資源文件是實(shí)現(xiàn)國(guó)際化技術(shù)的主要手段。如果想在SpringBoot里面進(jìn)行資源文件的配置,只需要做一些簡(jiǎn)單的application.yml配置即可,而且所有注入的資源文件都可以像最初的Spring處理那樣,直接使用MessageSource進(jìn)行讀取。1.【mldnboot-base項(xiàng)目】在src/main/resources源文件夾下創(chuàng)建一個(gè)i18n的子目錄(包)。2.【mldnboot-base項(xiàng)目】建立src/main/resources/i18n/Mperties文件,文件內(nèi)容定義如下:3.【mldnboot-base項(xiàng)目】修改application.yml配置文件,追加資源文件配置,項(xiàng)目結(jié)構(gòu)如圖2-11所示。圖2-11資源文件配置4.【mldnboot-base項(xiàng)目】在MessageController控制器中注入org.springframework.context.MessageSource接口對(duì)象,并且利用此對(duì)象實(shí)現(xiàn)資源文件讀取。當(dāng)程序中配置了資源文件之后,就可以通過MessageSource接口中提供的getMessage()方法進(jìn)行資源的讀取。本程序的運(yùn)行效果如圖2-12所示。圖2-12讀取資源文件提示:可以借用此機(jī)制實(shí)現(xiàn)國(guó)際化開發(fā)。當(dāng)程序可以實(shí)現(xiàn)資源文件讀取的時(shí)候,就意味著可以實(shí)現(xiàn)國(guó)際化開發(fā)處理了??梢园l(fā)現(xiàn),MessageSource接口中的getMessage()方法里面需要接收一個(gè)Locale類的對(duì)象,此時(shí)就可以通過Locale類的設(shè)置來獲取不同的資源文件。當(dāng)然,也需要在項(xiàng)目中配置好不同語言的資源文件。例如,本程序在src/main/resources/i18n目錄中又創(chuàng)建了Messages_zh_CN.properties和Messages_en_US.properties(注意baseName的名稱相同),如圖2-13所示。圖2-13國(guó)際化配置這樣,當(dāng)讀取時(shí)可以采用不同的Locale對(duì)象實(shí)現(xiàn)指定語言的資源讀取。例如,使用如下代碼就可以實(shí)現(xiàn)Messages_en_US.properties資源文件的讀?。盒枰嵝炎x者的是,即使提供了不同語言的資源文件,在SpringBoot中也依然需要提供Mperties配置文件,否則將無法實(shí)現(xiàn)資源文件的讀取。2.10整合Spring配置在進(jìn)行Spring項(xiàng)目配置的時(shí)候,可以通過*.xml文件配置,也可以通過Bean(@Configuration注解)配置。SpringBoot延續(xù)了Spring這一特點(diǎn),在SpringBoot項(xiàng)目中依然可以使用配置文件定義。1.【mldnboot-base項(xiàng)目】建立一個(gè)MessageUtil的工具類,該類的主要功能是進(jìn)行配置的演示。在MessageUtil類中定義一個(gè)getInfo()方法,該方法的主要功能是返回一個(gè)提示信息。提示:可以使用@Component注解。MessageUtil類直接放在了程序啟動(dòng)類所在包的子包之中。在真實(shí)的開發(fā)中,開發(fā)者選擇@Component或@Repository這樣的注解是最方便的。本部分主要是為讀者講解配置文件與配置Bean的整合,所以沒有采用注解配置。2.【mldnboot-base項(xiàng)目】在src/main/resources目錄中創(chuàng)建spring的子目錄,并且建立spring-util.xml配置文件。3.【mldnboot-base項(xiàng)目】在MessageController程序類中注入MessageUtil類對(duì)象,并且調(diào)用方法返回信息。4.【mldnboot-base項(xiàng)目】修改程序啟動(dòng)主類,定義要導(dǎo)入的Spring配置文件。本程序在定義啟動(dòng)主類時(shí),利用@ImportResource注解導(dǎo)入了所需要的Spring配置文件,而后會(huì)自動(dòng)將配置文件中定義bean對(duì)象注入到MessageController類的屬性中,程序運(yùn)行結(jié)果如圖2-14所示。圖2-14Spring配置文件5.【mldnboot-base項(xiàng)目】SpringBoot強(qiáng)調(diào)的就是“零配置”,雖然其本身支持配置文件定義,但很明顯這樣的處理形式不是最好的。如果確定要引入其他配置,強(qiáng)烈建議使用Bean的配置形式來完成。DefaultConfig定義在程序主類所在的子包之中,這樣就可以在SpringBoot程序啟動(dòng)時(shí)自動(dòng)掃描配置并進(jìn)行加載。對(duì)于程序的主類,也就沒有必要使用@ImportResource注解讀取配置文件了。提問:實(shí)際開發(fā)中使用配置文件還是使用Bean類配置?在編寫SpringBoot項(xiàng)目的過程之中,是采用*.xml配置更好,還是利用Bean類配置會(huì)更好?回答:崇尚“零配置”的SpringBoot項(xiàng)目建議使用Bean配置。在SpringBoot項(xiàng)目中進(jìn)行配置的時(shí)候,實(shí)際上有3種支持,按照優(yōu)先選擇順序?yàn)椋篴pplication.yml、Bean配置和*.xml配置文件。大部分的配置都可以在application.yml(相當(dāng)于傳統(tǒng)項(xiàng)目中的profile配置作用)里面完成,但很多情況下會(huì)利用Bean類來進(jìn)行擴(kuò)展配置(本書主要使用此形式來作為擴(kuò)展配置)。之所以提供*.xml配置文件的支持,主要目的是幫助開發(fā)者用已有代碼快速整合SpringBoot開發(fā)框架。2.11SpringBoot項(xiàng)目打包發(fā)布SpringBoot作為微架構(gòu)的主要實(shí)現(xiàn)技術(shù),其發(fā)布項(xiàng)目的方式極為簡(jiǎn)單,只需要在項(xiàng)目中配置好插件,然后打包執(zhí)行就可以了,并且這個(gè)執(zhí)行不需要特別復(fù)雜的配置。1.【mldnboot-base項(xiàng)目】修改pom.xml配置文件,配置SpringBoot的打包插件。2.【mldnboot-base項(xiàng)目】由于Maven增加了新的插件配置,所以需要對(duì)項(xiàng)目進(jìn)行更新,如圖2-15所示。更新時(shí)選擇mldnboot-base項(xiàng)目,如圖2-16所示。圖2-15Maven項(xiàng)目更新圖2-16選擇要更新的項(xiàng)目3.【mldnboot-base項(xiàng)目】將當(dāng)前項(xiàng)目模塊進(jìn)行打包處理(cleanpackage),如圖2-17所示。打包完成后,會(huì)在項(xiàng)目的target目錄下生成mldnboot-base.jar程序文件。圖2-17SpringBoot項(xiàng)目打包4.【mldnboot-base項(xiàng)目】將mldnboot-base.jar文件復(fù)制到D盤根目錄下,隨后通過命令行方式執(zhí)行此文件。此時(shí),SpringBoot項(xiàng)目將以一個(gè)獨(dú)立的*.jar文件的方式執(zhí)行。將此jar文件上傳到任何配置有JDK的系統(tǒng)內(nèi),可以輕松實(shí)現(xiàn)項(xiàng)目的發(fā)布。2.12profile配置在項(xiàng)目開發(fā)過程中需要考慮不同的運(yùn)行環(huán)境:開發(fā)環(huán)境(dev)、測(cè)試環(huán)境(beta)和生產(chǎn)環(huán)境(product)。在以往的開發(fā)過程中通常使用Maven構(gòu)建工具進(jìn)行控制,但卻需要進(jìn)行大量的配置。SpringBoot考慮到此類問題,專門設(shè)計(jì)了profile支持。1.【mldnboot-base項(xiàng)目】修改application.yml配置文件,讓其支持多profile配置。在本配置文件中一共定義了3個(gè)環(huán)境(不同的profile之間使用“---”分割)。開發(fā)環(huán)境(profiles=dev、默認(rèn)):端口定義為7070。測(cè)試環(huán)境(profiles=beta):端口定義為8080。生產(chǎn)環(huán)境(profiles=product):端口定義為80。2.【mldnboot項(xiàng)目】如果要正常進(jìn)行打包,還需要修改pom.xml文件,追加resource配置。本程序主要的功能是進(jìn)行源文件夾中內(nèi)容的打包輸出,配置完成后可以將配置文件打包到*.jar文件中。3.【mldnboot-base項(xiàng)目】為項(xiàng)目打包,這里直接通過Eclipse進(jìn)行打包配置(此時(shí)無法設(shè)置profile),如圖2-18所示。圖2-18項(xiàng)目打包4.【mldnboot-base項(xiàng)目】項(xiàng)目打包完成后一定要運(yùn)行程序,如果不做出任何的指派,那么默認(rèn)配置的活躍profile(dev)就將直接起作用(java-jarmldnboot-base.jar)。5.【mldnboot-base項(xiàng)目】如果要切換到不同的profile環(huán)境,可以在啟動(dòng)時(shí)動(dòng)態(tài)配置。此時(shí)在程序運(yùn)行時(shí)將使用product作為運(yùn)行環(huán)境配置。提示:*.properties與*.yml配置不同。使用application.yml進(jìn)行多profile配置的時(shí)候,只需要在一個(gè)配置文件中使用“---”分割不同的profile配置。但是此類模式不適合于perties配置,此時(shí)應(yīng)該采用不同的*.properties保存不同的配置,才可以實(shí)現(xiàn)多profile。范例:定義3個(gè)針對(duì)不同運(yùn)行環(huán)境的perties配置文件。隨后還是需要有一個(gè)公共的perties配置文件,用于指派可以使用的profile配置。范例:定義公共的perties配置文件。

files.active=beta

隨后的使用形式與application.yml配置相同。2.13本章小結(jié)1.SpringBoot的依賴管理除了可以作為項(xiàng)目的父pom引入之外,也可以采用依賴管理的形式進(jìn)行配置。2.SpringBoot程序測(cè)試專門提供了spring-boot-starter-test依賴庫,在測(cè)試時(shí)需要使用@SpringBootTest注解。3.在定義SpringBoot程序主類時(shí)使用@SpringBootApplication注解,可以自動(dòng)掃描子包中的配置項(xiàng),實(shí)現(xiàn)自動(dòng)配置。4.@Controller注解采用的是普通控制器的形式定義,而@RestController注解可以直接以Restful方式運(yùn)行。5.SpringBoot默認(rèn)使用的是Tomcat容器,開發(fā)時(shí)也可以配置spring-boot-starter-jetty依賴庫,使用Jetty容器。但是在實(shí)際部署時(shí),建議使用Tomcat容器。6.SpringBoot支持*.properties和*.yml兩類配置文件,在實(shí)際開發(fā)中建議通過application.yml實(shí)現(xiàn)環(huán)境配置。7.SpringBoot項(xiàng)目可以通過spring-boot-maven-plugin實(shí)現(xiàn)打包處理,這樣就可以方便地通過*.jar文件來實(shí)現(xiàn)項(xiàng)目的發(fā)布。第3章Thymeleaf模板渲染通過本章學(xué)習(xí),可以達(dá)到以下目標(biāo):1.掌握Thymeleaf模板的作用以及相關(guān)配置。2.掌握Thymeleaf中路徑訪問處理支持。3.掌握Thymeleaf頁面處理語法。SpringBoot除了可以進(jìn)行Restful運(yùn)行之外,也可以像傳統(tǒng)MVC設(shè)計(jì)模式那樣,實(shí)現(xiàn)控制層與顯示層的跳轉(zhuǎn)處理。但SpringBoot所支持的顯示層不再只是簡(jiǎn)單的JSP頁面,而是Thymeleaf模板頁面。此頁面下利用模板語法,可以在HTML文件中實(shí)現(xiàn)JSP的相關(guān)邏輯。3.1Thymeleaf簡(jiǎn)介傳統(tǒng)的JSP開發(fā)需要編寫大量的Scriptlet程序代碼,這樣就使得頁面非?;靵y。雖然在JSP的后續(xù)發(fā)展中提供了標(biāo)簽編程與JSTL標(biāo)簽庫,但其頁面處理邏輯仍然是復(fù)雜的。為了解決JSP代碼過于臃腫的問題,在SpringBoot中默認(rèn)引入了Thymeleaf模板程序。Thymeleaf是XML、XHTML、HTML5模板引擎,可以用于Web與非Web應(yīng)用。Thymeleaf提供了一種可以被瀏覽器正確顯示、格式良好的模板創(chuàng)建方式,開發(fā)者可以通過它來創(chuàng)建經(jīng)過驗(yàn)證的XML與HTML模板。相對(duì)于傳統(tǒng)的邏輯程序代碼,開發(fā)者只需將標(biāo)簽屬性添加到模板中即可,而后這些標(biāo)簽屬性就會(huì)在DOM(文檔對(duì)象模型)上執(zhí)行預(yù)先制定好的邏輯,這樣就極大地簡(jiǎn)化了顯示層的程序邏輯代碼。1.【mldnboot項(xiàng)目】本程序?yàn)榱伺c之前的項(xiàng)目有所區(qū)分,將創(chuàng)建一個(gè)新的mldnboot-thymeleaf模塊,并修改父pom.xml的定義,追加新模塊配置。2.【mldnboot-thymeleaf項(xiàng)目】修改pom.xml配置文件,追加Thymeleaf依賴庫的配置。這樣就可以在項(xiàng)目中使用Thymeleaf語法來實(shí)現(xiàn)顯示層邏輯處理。3.2Thymeleaf編程起步Thymeleaf需要按照傳統(tǒng)MVC設(shè)計(jì)模式的方式來進(jìn)行處理,所以在定義控制器的時(shí)候必須使用@Controller注解來完成。通過控制器的Model類對(duì)象,可以傳遞相應(yīng)屬性到頁面中顯示。1.【mldnboot-thymeleaf項(xiàng)目】建立ThymeleafController程序類,該類將跳轉(zhuǎn)到Thyemelaf模板頁面。2.【mldnboot-thymeleaf項(xiàng)目】ThymeleafController控制器會(huì)跳轉(zhuǎn)到message目錄下的message_show.html頁面進(jìn)行顯示,而該頁面一定要在CLASSPATH路徑下配置。為了結(jié)構(gòu)清晰,本程序?qū)⒔⒁粋€(gè)src/main/view的源文件,并且必須建立templates目錄,隨后在這個(gè)目錄下創(chuàng)建所需要的子目錄(本程序需要?jiǎng)?chuàng)建message子目錄)。項(xiàng)目最終的目錄結(jié)構(gòu)如圖3-1所示。圖3-1Thymeleaf模板目錄結(jié)構(gòu)提示:修改Thymeleaf的默認(rèn)配置。SpringBoot項(xiàng)目中Thymeleaf的動(dòng)態(tài)頁面需要保存在templates目錄中,頁面的擴(kuò)展名默認(rèn)使用的是*.html,如果開發(fā)者覺得這樣的設(shè)計(jì)不合理,也可以通過application.yml配置文件自行修改。范例:修改Thyemeleaf的配置項(xiàng)。雖然SpringBoot中可以修改Thymeleaf的默認(rèn)配置項(xiàng),但是在實(shí)際開發(fā)中不建議修改,還是遵從默認(rèn)配置比較合理。3.【mldnboot-thymeleaf項(xiàng)目】編寫message_show.html頁面,實(shí)現(xiàn)控制層傳遞屬性輸出。本程序使用<p>元素設(shè)定了要輸出的內(nèi)容。要想使用Thymeleaf的功能,必須以“th:屬性”的形式處理,th:text的主要作用是進(jìn)行文本輸出。而要想輸出request屬性中的內(nèi)容,則需要采用“${屬性名稱}”的語法格式完成。隨后啟動(dòng)程序,輸入訪問地址http://localhost/view?mid=mldnjava,頁面運(yùn)行效果如圖3-2所示。圖3-2Thymeleaf模板運(yùn)行提示:傳遞HTML元素信息。在本程序中,如果控制器傳遞的是一個(gè)HTML元素,那么對(duì)于Thymeleaf頁面而言,就需要使用th:utext來顯示HTML元素內(nèi)容。范例:【mldnboot-thymeleaf項(xiàng)目】修改ThymeleafController控制器,傳遞HTML元素。范例:【mldnboot-thymeleaf項(xiàng)目】修改message_show.html頁面。本程序?yàn)榱苏f明問題,特意使用了th:text和th:utext來輸出url屬性內(nèi)容,程序執(zhí)行結(jié)果如圖3-3所示。圖3-3傳遞HTML元素另外需要注意的是,在Thymeleaf語法里面也可以直接使用各種運(yùn)算符。此時(shí),Thyemeleaf模板頁面會(huì)自動(dòng)根據(jù)運(yùn)算的數(shù)據(jù)類型和運(yùn)算符進(jìn)行計(jì)算。3.3Thyemeleaf靜態(tài)資源在進(jìn)行Web信息顯示的過程中,除了可以配置動(dòng)態(tài)顯示頁面之外,也可以配置靜態(tài)資源(如*.html、*.css、*.js等)。對(duì)于靜態(tài)資源,要求其必須放在源文件夾的static目錄中。本項(xiàng)目的頁面結(jié)構(gòu)如圖3-4所示。圖3-4項(xiàng)目結(jié)構(gòu)1.【mldnboot-thymeleaf項(xiàng)目】建立項(xiàng)目所需要的CSS樣式文件以及JS腳本文件。messge_index.js文件的主要功能是在控制臺(tái)進(jìn)行提示信息輸出。2.【mldnboot-thymeleaf項(xiàng)目】在src/main/view/static目錄下建立message_index.html頁面。本程序修改了頁面運(yùn)行的icon圖標(biāo),并且引入了相應(yīng)的靜態(tài)資源,頁面運(yùn)行效果如圖3-5所示。圖3-5Thymeleaf靜態(tài)頁面3.4讀取資源文件SpringBoot項(xiàng)目中的資源文件會(huì)統(tǒng)一在application.yml配置文件中定義。當(dāng)頁面需要使用的時(shí)候,可以像輸出屬性一樣完成,唯一的區(qū)別是需要通過“#{key}”的形式來獲取資源內(nèi)容。1.【mldnboot-thymeleaf項(xiàng)目】在application.yml配置文件中定義資源文件配置。2.【mldnboot-thymeleaf項(xiàng)目】在Mperties配置文件里面定義資源內(nèi)容。3.【mldnboot-thymeleaf項(xiàng)目】要讀取資源文件,需要?jiǎng)討B(tài)頁面的支持。在ThyemeleafController控制器中建立一個(gè)新的方法,用于跳轉(zhuǎn)到前端頁面。4.【mldnboot-thymeleaf項(xiàng)目】在src/main/view/templates/message目錄中創(chuàng)建message_value.html頁面,用于讀取資源文件內(nèi)容并進(jìn)行顯示。在Thyemeleaf模板頁面中直接使用資源的key獲取資源信息,頁面運(yùn)行效果如圖3-6所示。圖3-6Thyemeleaf模板頁面讀取資源文件3.5路徑處理Web開發(fā)過程中,路徑的處理操作是最為麻煩的。如果要進(jìn)行準(zhǔn)確的路徑定位,最好使用完整的路徑,并明確寫上用戶的協(xié)議、主機(jī)名稱、端口以及虛擬目錄的名稱。這些處理的難點(diǎn)在于Thymeleaf徹底消失了,因?yàn)槠渎窂皆L問變得相當(dāng)容易,只需要在動(dòng)態(tài)頁面中使用“@{路徑}”即可訪問。提示:回顧原始實(shí)現(xiàn)。在進(jìn)行Web項(xiàng)目開發(fā)的過程中,相信不少開發(fā)者都編寫過如下的類似代碼:而后再使用<base>元素(<basehref="<%=basePath%>"/>)進(jìn)行引用,可以解決路徑操作問題。1.【mldnboot-thymeleaf項(xiàng)目】在ThymeleafController中創(chuàng)建一個(gè)新的方法,用于跳轉(zhuǎn)。2.【mldnboot-thymeleaf項(xiàng)目】建立src/main/view/templates/message/message_path.html頁面。在message_path.html頁面中繼續(xù)引用之前定義了的資源,而采用“@{路徑}”的形式使得資源引用也十分簡(jiǎn)單,頁面運(yùn)行效果如圖3-7所示。圖3-7Web資源引入3.6內(nèi)置對(duì)象操作支持在模板頁面中,最為常用的功能就是輸出控制器傳遞的屬性。為了方便用戶開發(fā),Thymeleaf支持內(nèi)置對(duì)象的直接使用,也可以直接調(diào)用內(nèi)置對(duì)象所提供的處理方法。在通過控制器傳遞屬性到Thymeleaf操作的時(shí)候,默認(rèn)支持的屬性獲取范圍為request(${屬性名稱})。如果要接收其他屬性范圍的內(nèi)容,則需要指明范圍,如session范圍(${session.屬性名稱})、application范圍(${application.屬性名稱})。1.【mldnboot-thymeleaf項(xiàng)目】修改ThymeleafController控制器程序類,追加屬性傳遞。本程序?qū)鬟frequest、session和application3種屬性范圍的信息。2.【mldnboot-thymeleaf項(xiàng)目】定義src/main/view/templates/message/message_attr.html頁面,進(jìn)行屬性內(nèi)容輸出。本程序在Thymeleaf模板頁面中輸出了控制器中傳遞的不同范圍的屬性內(nèi)容。可以發(fā)現(xiàn),只有request范圍的屬性可以直接通過表達(dá)式語法輸出,而session與application范圍的屬性輸出時(shí),必須要有相應(yīng)的范圍標(biāo)記,否則獲取的內(nèi)容就是null。本程序的執(zhí)行結(jié)果如圖3-8所示。圖3-8Thymeleaf輸出不同屬性范圍的信息3.【mldnboot-thymeleaf項(xiàng)目】在Thymeleaf中也支持對(duì)內(nèi)置對(duì)象的直接處理。修改message_attr.html頁面,增加內(nèi)置對(duì)象的方法調(diào)用。本程序利用內(nèi)置對(duì)象提供的方法獲取了IP地址、request屬性、sessionId以及項(xiàng)目真實(shí)路徑,程序運(yùn)行結(jié)果如圖3-9所示。圖3-9直接調(diào)用內(nèi)置對(duì)象方法3.7對(duì)象輸出在實(shí)際頁面中進(jìn)行信息顯示的時(shí)候,需要通過VO對(duì)象進(jìn)行信息的傳遞。此時(shí)可以直接利用“${屬性名稱.成員屬性}”的格式在頁面中進(jìn)行對(duì)象內(nèi)容的輸出。1.【mldnboot-thymeleaf項(xiàng)目】定義一個(gè)VO類Member。2.【mldnboot-thymeleaf項(xiàng)目】修改ThymeleafController控制器程序,向頁面?zhèn)鬟f對(duì)象信息。3.【mldnboot-thymeleaf項(xiàng)目】建立src/main/view/templates/message/message_member.html頁面,進(jìn)行對(duì)象輸出。本程序在頁面中使用“${屬性名稱.成員屬性}”獲取了request屬性范圍中傳遞的member對(duì)象的全部信息,頁面執(zhí)行結(jié)果如圖3-10所示。圖3-10頁面輸出對(duì)象提示:Thymeleaf支持有簡(jiǎn)化的對(duì)象輸出處理。在Thyemleaf模板頁面中可以發(fā)現(xiàn),默認(rèn)支持的對(duì)象成員獲取語法需要頻繁使用屬性名稱。為了簡(jiǎn)化輸出,可以采用th:object標(biāo)簽處理。范例:對(duì)象信息輸出。本程序使用了一個(gè)<div>元素,并在此元素中利用th:object="${member}"將需要輸出的對(duì)象信息定義在父元素上,而后此元素的所有子元素就可以利用“*{成員屬性}”獲取對(duì)象中全部屬性的內(nèi)容。另外需要提醒讀者的是,$訪問完整對(duì)象信息,*訪問指定對(duì)象中的屬性內(nèi)容。如果訪問的只是普通的內(nèi)容(如傳遞字符串信息),兩者在使用效果上沒有區(qū)別。3.8頁面邏輯處理Thymeleaf頁面模板支持邏輯處理功能,如判斷、循環(huán)處理等操作。開發(fā)者在頁面中處理邏輯時(shí),可以使用and、or、關(guān)系比較(>、<、>=、<=、==、!=、lt、gt、le、ge、eq、ne)等運(yùn)算符來完成。1.【mldnboot-thymeleaf項(xiàng)目】修改src/main/view/templates/message/message_member.html頁面,追加邏輯判斷。本程序在頁面中追加了判斷邏輯(年齡是否為大于或等于18歲、姓名是否為指定的字符串),這樣會(huì)根據(jù)傳遞過來的Member對(duì)象的屬性進(jìn)行判斷,頁面運(yùn)行效果如圖3-11所示。圖3-11頁面邏輯判斷2.【mldnboot-thymeleaf項(xiàng)目】在Thymeleaf之中,如果使用th:if判斷條件不滿足時(shí),也可以使用th:unless處理。3.【mldnboot-thymeleaf項(xiàng)目】頁面中可以使用switch-case來實(shí)現(xiàn)開關(guān)邏輯處理。本程序使用th:switch="*{mid}"語句對(duì)mid屬性的內(nèi)容進(jìn)行switch判斷。如果有匹配的信息,則進(jìn)行內(nèi)容輸出;如果沒有,則執(zhí)行th:case="*"的信息輸出,頁面運(yùn)行效果如圖3-12所示。圖3-12switch判斷3.9數(shù)據(jù)迭代處理數(shù)據(jù)迭代顯示是顯示層的一個(gè)重要技術(shù)手段,在Thymeleaf模板中可以使用th:each指令實(shí)現(xiàn)List與Map集合的迭代輸出。1.【mldnboot-thymeleaf項(xiàng)目】在ThymeleafController控制器中追加一個(gè)方法,該方法將創(chuàng)建一個(gè)List集合,隨后通過request屬性傳遞到頁面。2.【mldnboot-thymeleaf項(xiàng)目】建立src/main/view/templates/message/message_list.html頁面。本程序在頁面中使用了th:each指令進(jìn)行List集合輸出,而后將每一次迭代的結(jié)果都賦值給member對(duì)象,并將每一次迭代的基本信息都賦值給memberStat對(duì)象(可根據(jù)需要選擇是否要使用此對(duì)象),這樣就可以實(shí)現(xiàn)List集合顯示,頁面運(yùn)行效果如圖3-13所示。圖3-13迭代輸出List集合除了支持List集合輸出之外,也可以采用同樣的形式實(shí)現(xiàn)Map集合的輸出。3.【mldnboot-thymeleaf項(xiàng)目】在ThymeleafController控制器中追加Map集合設(shè)置。4.【mldnboot-thymeleaf項(xiàng)目】建立src/main/view/templates/message/message_map.html頁面。在進(jìn)行Map集合輸出時(shí),每一次迭代所取出的對(duì)象類型都是Map.Entry接口實(shí)例,所以本程序使用memberEntry接收該接口對(duì)象,隨后輸出每一個(gè)Map.Entry對(duì)象中所保存的key與value信息,頁面運(yùn)行效果如圖3-14所示。圖3-14輸出Map集合3.10包含指令在頁面開發(fā)中,包含是一個(gè)重要的指令,利用包含指令可以實(shí)現(xiàn)頁面代碼的重用處理。Thymeleaf也同樣支持?jǐn)?shù)據(jù)的包含處理,而對(duì)于包含操作,在Thymeleaf模板中提供了兩種支持語法。th:replace:使用標(biāo)簽進(jìn)行替換,原始的宿主標(biāo)簽還在,但是包含標(biāo)簽不在。th:include:進(jìn)行包含,原始的宿主標(biāo)簽消失,只保留包含的標(biāo)簽。1.【mldnboot-thymeleaf項(xiàng)目】建立src/main/view/templates/commons/footer.html頁面。本程序設(shè)置了一個(gè)包含的名稱信息為companyInfo,同時(shí)還需要包含頁面向本頁面?zhèn)鬟ftitle與url兩個(gè)參數(shù)信息。2.【mldnboot-thymeleaf項(xiàng)目】在ThymeleafController控制器類中追加一個(gè)新的方法,用于頁面跳轉(zhuǎn)。3.【mldnboot-thymeleaf項(xiàng)目】建立src/main/view/templates/message/message_include.html頁面。本程序使用th:include指令(替換掉父元素<div>)實(shí)現(xiàn)了頁面的包含處理,同時(shí)利用th:with命令向被包含頁面?zhèn)鬟f了兩個(gè)參數(shù)。此時(shí)的頁面運(yùn)行效果如圖3-15所示。圖3-15頁面包含3.11Thymeleaf數(shù)據(jù)處理在Thymeleaf模板中還支持集合方法調(diào)用、字符串方法調(diào)用、日期格式化等操作。例如,在使用List集合的時(shí)候可以考慮采用get()方法獲取指定索引的數(shù)據(jù),那么在使用Set集合的時(shí)候會(huì)考慮使用contains()來判斷某個(gè)數(shù)據(jù)是否存在,使用Map集合的時(shí)候也可以使用containsKey()判斷某個(gè)key是否存在,以及使用get()根據(jù)key獲取對(duì)應(yīng)的value。1.【mldnboot-thymeleaf項(xiàng)目】修改src/main/view/templates/message/message_map.html頁面,調(diào)用Map方法。2.【mldnboot-thymeleaf項(xiàng)目】如果傳遞的是Set集合,也可以利用Set接口中的contains()方法判斷某個(gè)值是否存在。在ThymeleafController控制器中追加一個(gè)新的方法,利用Set傳遞屬性。建立src/main/view/templates/message/message_set.html頁面,判斷某一個(gè)內(nèi)容是否在集合中存在。

<pth:if=

"${#sets.contains(allInfos,'mldn')}"

>存在有“mldn”的信息!</p>

此時(shí)會(huì)判斷在allInfos集合中是否存在mldn的內(nèi)容,同時(shí)也可以利用size()方法獲取集合長(zhǎng)度,頁面運(yùn)行效果如圖3-16所示。圖3-16判斷Set集合是否有指定數(shù)據(jù)3.【mldnboot-thymeleaf項(xiàng)目】在進(jìn)行數(shù)據(jù)處理的時(shí)候,也可以直接使用字符串String類中定義的方法。在ThymeleafController控制器中追加一個(gè)新的方法,用于傳遞字符串屬性。建立src/main/view/templates/message/message_string.html頁面,以處理字符串。在進(jìn)行字符串?dāng)?shù)據(jù)處理時(shí),可以直接使用控制器傳遞過來的屬性,也可以直接定義具體的字符串內(nèi)容。本程序處理后的結(jié)果如圖3-17所示。圖3-17字符串處理4.【mldnboot-thymeleaf項(xiàng)目】在Thyemeleaf中還可以對(duì)輸出的日期類型進(jìn)行格式化處理。在ThymeleafController控制器中追加一個(gè)新的方法,用于傳遞Date屬性。建立src/main/view/templates/message/message_date.html頁面,以格式化日期顯示。本程序使用兩種方式實(shí)現(xiàn)了日期時(shí)間的格式化處理,頁面運(yùn)行效果如圖3-18所示。圖3-18格式化日期時(shí)間3.12本章小結(jié)1.在SpringBoot中如果要引入Thymeleaf模板,需要配置spring-boot-starter-thymeleaf依賴包。2.Thymeleaf可以有效地取代JSP頁面,實(shí)現(xiàn)頁面動(dòng)態(tài)邏輯處理。3.Thymeleaf分為動(dòng)態(tài)頁面(templates)和靜態(tài)資源(static)兩類資源。4.Thymeleaf不僅僅可以實(shí)現(xiàn)控制器傳遞的屬性輸出,也可以實(shí)現(xiàn)資源文件的內(nèi)容輸出。5.在Thymeleaf中可以使用“@{路徑}”的形式實(shí)現(xiàn)資源引入與跳轉(zhuǎn)配置。6.Thymeleaf中可以使用判斷、循環(huán)邏輯進(jìn)行處理,也可以利用各種內(nèi)置操作在頁面上實(shí)現(xiàn)List、Map、Set、字符串等數(shù)據(jù)處理,還可以使用日期格式化指令進(jìn)行日期顯示格式的處理。第4章SpringBoot與Web應(yīng)用通過本章學(xué)習(xí),可以達(dá)到以下目標(biāo):1.掌握SpringBoot項(xiàng)目war包的生成與Tomcat發(fā)布。2.掌握SpringBoot基于https運(yùn)行模式的配置。3.掌握SpringBoot錯(cuò)誤處理。4.掌握SpringBoot與文件上傳處理。5.掌握SpringBoot與攔截器的使用。SpringBoot雖然極大地簡(jiǎn)化了Web項(xiàng)目開發(fā)與部署環(huán)節(jié)的配置,但是其依然屬于Web項(xiàng)目,因此在實(shí)際工作中需要考慮與Tomcat的整合,當(dāng)需要安全訪問時(shí)還應(yīng)該提供https支持。在本章中將為讀者講解SpringBoot項(xiàng)目與Tomcat的結(jié)合處理、錯(cuò)誤處理機(jī)制、文件上傳處理以及攔截器的使用。4.1配置Tomcat運(yùn)行在SpringBoot中默認(rèn)支持Tomcat容器,所以當(dāng)一個(gè)SpringBoot項(xiàng)目打包生成*.jar文件并且直接執(zhí)行的時(shí)候就會(huì)自動(dòng)啟動(dòng)內(nèi)部的Tomcat容器。除了此種模式之外,也可以將Web項(xiàng)目打包為*.war文件,采用部署的形式通過Tomcat進(jìn)行發(fā)布處理。提示:Tomcat部署時(shí)的配置。在將SpringBoot打包為*.war文件的時(shí)候,如果想正常部署一定要注意以下兩點(diǎn):1.取消項(xiàng)目中的Jetty容器的配置。2.將所有的源文件夾目錄設(shè)置輸出資源,修改父pom.xml中的<resource>配置。1.【mldnboot-web項(xiàng)目】修改pom.xml配置文件,將程序的打包類型定義為*.war。

<packaging>war</packaging><!--項(xiàng)目打包類型-->

2.【mldnboot-web項(xiàng)目】修改pom.xml配置文件,追加war文件打包插件。3.【mldnboot-web項(xiàng)目】更新Maven項(xiàng)目,隨后會(huì)提醒開發(fā)者當(dāng)前項(xiàng)目中缺少WEB-INF/web.xml配置文件,此時(shí)需要開發(fā)者手工創(chuàng)建。創(chuàng)建完成的目錄結(jié)構(gòu)如圖4-1所示。圖4-1創(chuàng)建Web項(xiàng)目4.【mldnboot-web項(xiàng)目】如果現(xiàn)在項(xiàng)目要以Tomcat的形式運(yùn)行,那么需要修改SpringBoot程序啟動(dòng)類定義,該類必須要繼承SpringBootServletInitializer父類,同時(shí)還需要覆寫configure()方法。5.【mldnboot-web項(xiàng)目】對(duì)項(xiàng)目進(jìn)行打包部署(cleanpackage),成功之后會(huì)在target目錄中形成mldn.war程序文件,隨后可以將此文件直接復(fù)制到Tomcat所在目錄之中,而后啟動(dòng)Tomcat進(jìn)行項(xiàng)目發(fā)布。4.2https安全訪問SpringBoot啟動(dòng)時(shí)默認(rèn)采用http進(jìn)行通信協(xié)議定義,考慮到安全,往往會(huì)使用https進(jìn)行訪問。正常來講,https的訪問是需要證書的,并且為了保證這個(gè)證書的安全,一定要在項(xiàng)目中使用CA進(jìn)行認(rèn)證。下面只是在本機(jī)做一個(gè)簡(jiǎn)單的模擬,利用Java提供的keytool命令實(shí)現(xiàn)證書的生成。1.【操作系統(tǒng)】利用keytool生成一個(gè)證書。該程序執(zhí)行完成后會(huì)生成一個(gè)名稱為keystore.p12的證書文件,該證書的別名為mytomcat,訪問密碼為mldnjava。2.【mldnboot-web項(xiàng)目】將生成的keystore.p12復(fù)制到src/main/resources目錄中,如圖4-2所示。圖4-2配置安全訪問3.【mldnboot-web項(xiàng)目】修改application.yml文件,配置ssl安全訪問。4.【mldnboot項(xiàng)目】資源目錄中增加了*.p12文件,要想讓其正常執(zhí)行,還需要修改resource配置,追加輸出文件類型配置。5.【mldnboot-web項(xiàng)目】雖然現(xiàn)在程序配置了https支持,但考慮到用戶訪問時(shí)可能會(huì)使用http訪問,所以需要做一個(gè)Web配置,使得通過http的80端口訪問的請(qǐng)求直接映射到https的443端口上。此時(shí)程序在通過80端口訪問時(shí),會(huì)自動(dòng)跳轉(zhuǎn)到https訪問的443端口上。4.3數(shù)據(jù)驗(yàn)證在進(jìn)行Web開發(fā)過程中,用戶提交數(shù)據(jù)的合法性是最基礎(chǔ)的驗(yàn)證手段,在SpringBoot中可以直接使用hibernate-vidator組件包實(shí)現(xiàn)驗(yàn)證處理,而此組件包中支持的驗(yàn)證注解如表4-1所示。表4-1hibernate-vidator驗(yàn)證注解1.【mldnboot-web項(xiàng)目】在src/main/resources目錄下創(chuàng)建ValidationMperties(文件名稱為默認(rèn)設(shè)置,不可更改)文件,該文件中要保留所有的錯(cuò)誤提示信息。2.【mldnboot-web項(xiàng)目】建立一個(gè)Member程序類,并且在該類上使用驗(yàn)證注解。同時(shí),驗(yàn)證出錯(cuò)時(shí)的錯(cuò)誤信息引用之前ValidationMperties文件中的定義。3.【mldnboot-web項(xiàng)目】建立一個(gè)MemberController控制器程序類。本程序?yàn)榱朔奖阕x者理解,除了將錯(cuò)誤提示信息以Restful方式返回之外,還直接在后臺(tái)進(jìn)行了錯(cuò)誤信息的打印。如果用戶輸入的內(nèi)容全部正確,則會(huì)返回用戶輸入的信息。4.【mldnboot-web項(xiàng)目】在src/main/view源文件夾中創(chuàng)建templates/member_add.html頁面,定義用戶信息增加表單。本程序由于存在Member數(shù)據(jù)驗(yàn)證邏輯,在用戶信息輸入正確時(shí)將返回如圖4-3所示的界面。如果輸入錯(cuò)誤,則會(huì)返回如圖4-4所示的界面。圖4-3信息輸入正確時(shí)返回Member對(duì)象圖4-4信息輸入錯(cuò)誤時(shí)返回錯(cuò)誤信息4.4配置錯(cuò)誤頁在Web項(xiàng)目開發(fā)過程中,錯(cuò)誤信息提示頁是一個(gè)重要的組成部分。無論多么合理的項(xiàng)目,也很難保證不出現(xiàn)類似于404或500的錯(cuò)誤問題,而讓用戶直接看見滿是異常信息的頁面明顯不是一個(gè)好的選擇。這時(shí),就需要有一個(gè)錯(cuò)誤信息提示頁。1.【mldnboot-web項(xiàng)目】錯(cuò)誤頁面一般都屬于靜態(tài)頁面,這里在src/main/view/static目錄下創(chuàng)建error-404.html和error-500.html兩個(gè)頁面,項(xiàng)目結(jié)構(gòu)如圖4-5所示。圖4-5錯(cuò)誤頁結(jié)構(gòu)2.【mldnboot-web項(xiàng)目】建立錯(cuò)誤頁配置。配置完錯(cuò)誤頁之后,會(huì)根據(jù)用戶請(qǐng)求時(shí)的http狀態(tài)碼跳轉(zhuǎn)到不同的頁面進(jìn)行顯示。4.5全局異常處理全局異常處理指的是針對(duì)程序中產(chǎn)生

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論