在以前咱們使用Swift的Perfect框架來開發服務端程序時,聊到了Perfect中的路由配置。而在SpringMVC中的路由配置與其也是大同小異的。說到路由,其實就是將URL映射到Java的具體類中的具體方法,或者映射到具體的JSP文件上。本篇博客主要就闡述瞭如何在SpringMVC中配置路由以及REST配置。下方將會聊到路由到JSP文件、路由到Java中具體的方法、獲取路由參數、獲取路由的get屬性、已經返回json和xml數據等。html
本篇博客的案例是在上篇博客建立的工程的基礎上來實現的,關於Maven管理下的SpringMVC工程的內容,請移步於《JavaEE開發使用Maven管理的SpringMVC工程》。本篇博客對如何使用Maven來管理SpringMVC就不作過多贅述了。spring
1、基本路由配置json
接下來咱們將聊一下經常使用的幾種路由配置方式,而後給出每種路由的具體實例。固然本部分仍是比較簡單的,雖然簡單,可是仍是比較重要的。一些後端經常使用的框架中,都會有各式各樣的路由配置方法,可是這些路由的做用都是大同小異的。像ThinkPHP框架中的路由配置也是ThinkPHP運做的基礎之一。本部分咱們就好好的聊一下SpringMVC的路由配置。後端
一、配置路由前的準備數組
在配置路由前,咱們得先建立一個Java類,咱們所配置的路由都會映射到該Java類中的特定方法。建立一個Java的普通類,命名爲RouteController。下方截圖中,上方圓框中就是咱們SpringMVC的配置文件了。由於在SpringMVCConfig中咱們指定了該配置文件的做用域是com.zeluli.springmvc這個包,因此咱們建立的路由控制器RouteController類也必須在此包下方。以下所示。下方會對RouteController類中的內容進行詳細的介紹。瀏覽器
二、路由到JSP文件mvc
接下來咱們就來看一下在SpringMVC中是如何路由到JSP文件的。首先咱們使用spring中的@Controller註解將RouteController類聲明爲控制器類,而後在經過@RequestMapping配置路由映射。將路由"/route"映射到RouteController類上。也就是說在瀏覽器中訪問該工程下的/route路徑,就會訪問到RouteController類。稍後會介紹到訪問方式。app
聲明並映射完相應的Controller類後,咱們在RouteController中建立了一個index()方法。該index()方法比較簡單就返回個「index」字符串。而後也是使用@RequestMapping來配置路由。咱們能夠看出index()方法所對應的路由值爲"/",也就是說,訪問/route這個路由,就會映射到index()這個方法上。框架
而index()方法返回的這個字符串其實就是該路由所對應的JSP文件的名稱,由於咱們在SpringMVCConfig配置文件中爲其添加了前綴和後綴,因此當返回「index」時,咱們訪問的就是「/WEB-INF/classes/views/index.jsp」這個資源文件。下方就是SpringMVCConfig中的配置項。jsp
上面實現完方法配置路由後,咱們就能夠部署到Tomcat上而後用瀏覽器訪問了,下方截圖就是咱們訪問/route路由的具體效果。
三、追加路由並設置ResponseBody
接着,咱們繼續往/route這個路由上追加字路徑。下方咱們建立了一個sub1()方法,該方法有一個參數並返回了一個字符串的值。該參數就是用來接收HttpServletRquest對象的,經過這個對象咱們能夠獲取到用戶發起請求時的一些參數。
咱們將此方法的路由配置爲「/sub1」,由於RounteController類的路由是「/route」,因此咱們sub1()方法的總體路由就是「/route/sub1」。而在sub1()方法的前方,咱們使用了@ResponseBody註解將該方法的返回值放在響應體(Response Body)返回給用戶。那麼用戶在訪問該路由時,就會獲取到該方法返回的值。以下所示。
上面,咱們配置好路由已經響應體後,咱們就能夠進行該路由的訪問了,下方是該路徑訪問的效果。從下方效果咱們能夠看出路由能夠正常訪問,而且有返回參數。不過咱們返回的一些中文卻產生了碼,因此咱們要指定ResponseBody的編碼方式。
咱們能夠查看一下上述請求的編碼方式,從下方內容中咱們能夠看出,charset的值是ISO-8859-1。咱們能夠將其設置成咱們想要的編碼方式。
咱們在配置路由時不只能夠指定路由的值(value),並且能夠指定路由所響應內容的文本格式已經編碼方式。由於sub1()方法是在RouteController類中的,因此咱們能夠指定整個類的編碼方式。下方就是經過produces屬性來指定文本格式已經編碼方式的,以下所示。
添加完文本類型以及編碼格式後,咱們從新看一下運行結果。從下方的運行結果,咱們不難看出,Response Body中的內容再也不是亂碼了,並且Response Header中的Content-Type也變成了咱們設置的值,以下所示。
四、多個路由映射到同一方法上
咱們能夠將多個路由映射到同一個Controller的方法上。當咱們給@RequestMapping的value屬性賦值一個數組時,數組中的路徑都會映射到該註解所修飾的方法中。以下所示。下方的/name1和/name2都會映射到該方法中。以下所示。
2、獲取路由及請求參數
咱們在聊Swift的Perfect框架時,其中配置的路由中是能夠加一些變量的,而後咱們能夠在路由映射中獲取路由的參數。在SpringMVC中也是如此,本部分,咱們就來看一下如何獲取路由中的參數。以及如何獲取用戶經過Get方式提交的參數的。
一、配置路由參數
在路由配置中,咱們能夠爲路由添加參數,而後使用@PathVariable註解來獲取該路徑變量的值。下方建立的sub2()方法的路由配置中就帶有路徑變量的,使用{路徑變量}來聲明路徑變量,使用@PathVariable來獲取路徑變量。
在下方方法中,咱們聲明瞭兩個路由變量,一個名爲value1,另外一個爲value2,在sub2()方法的參數中使用@PathVariable來取出相應變量的值。固然在取值是變量名要和路由中的變量名一致。以下所示。
配置完路由以及路徑變量後,咱們就能夠進行訪問了。下方就是咱們訪問的具體結果,已經返回的Response Body的內容。從該實例中咱們不難看出,路徑變量在開發中是很是實用的一項功能。
2.獲取Get請求的單個參數
獲取用戶在Get請求中所添加的參數,能夠說是在開發中常用的。接下來咱們就來看一下咱們的方法是如何來獲取Get請求中的相應參數的值的。本小結的內容比較簡單。直接在所映射的方法中添加相應的參數便可。下方sub3()方法的param參數,就是用來接收Get請求參數中名爲「param」參數的值的,以下所示。
下方是咱們訪問上述路由並傳入相應的參數的請求,結果以下所示:
三、獲取Get請求的多個參數
上面是獲取的Get請求的單個參數,若是一個Get請求有多個參數怎麼辦呢?確定不能再用上述方法類獲取參數的值了。在Spring框架中,支持將獲取的參數直接映射成Model。前提是參數的名稱必須和特定Model中的屬性名稱相同,接下來咱們就來作這件事情。將用戶傳入的參數直接映射成Model。
首先咱們得建立一個Model,下方這段代碼就是咱們建立的Model,該Model比較簡單,只有兩個屬性,一個是studentNumber,另外一個則是name。Model類中還對應着各個屬性的getter和setter方法。具體代碼以下所示。
package com.zeluli.model; public class StudentModel { private String studentNumber; private String name; public StudentModel() { super(); } public String getStudentNumber() { return studentNumber; } public void setStudentNumber(String studentNumber) { this.studentNumber = studentNumber; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
建立好Model後,咱們就能夠在Controller裏邊直接使用了。在路由對應的方法中直接使用相應的Model對象進行接收便可,在接收的過程當中會將參數中相應的值賦給該Model對象中相應的屬性。在以前的博客中,咱們講過iOS中將Json數據直接映射爲Model類的方式,是使用Objective-C的Runtime的方式來實現的。固然在Java中也是使用該機制來實現的,不過Java中的Runtime咱們稱之爲「反射機制」。
咱們對上述路由進行訪問,訪問結果以下所示。可見,Model的對象中存儲的就是咱們URL中傳入的參數。
3、JSON及XML數據的返回
在Spring框架中支持JSON和XML的數據綁定,也就是說JOSN或者XML能夠與數據對象進行互轉。不過咱們要添加相應的依賴庫。本部分咱們就來看一下Spring框架中的JSON和XML的數據綁定。
一、依賴庫的引入
由於咱們的項目是使用Maven進行管理的,因此依賴庫的引入是至關簡單的,下方就是pom.xml文件中添加的JSON以及XML數據綁定所依賴的庫。固然,下方的依賴庫的版本不必定是最新的,不過你能夠從Maven的Repository中查找你想要的依賴庫的版本。
<!-- 添加對象向json或xml轉換的支持 --> <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.dataformat/jackson-dataformat-xml --> <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> <version>2.8.6</version> </dependency> <!-- 添加json數據綁定支持 --> <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.8.6</version> </dependency>
2.JSON的數據綁定
引入完上述依賴庫後,咱們就能夠進行JSON的數據綁定了。本部分作的就是將Model的數據轉成JSON直接返回給客戶端。依然是在RouteController中進行實現。在下方代碼片斷中,客戶端收到的就是JSON格式的數據。在使用@RequestMapping來配置路由時,咱們使用produces屬性來配置Response Body的文本類型,下方咱們將文本類型設置成「application/json」,編碼格式依然選擇UTF-8。將接受到的數據對象之間返回給用戶,這時候用戶收到的就是json格式的數據信息。
咱們對上述配置的路徑進行訪問、從下方的訪問結果不難看出,用戶收到的是JSON格式的數據、以下所示:
三、XML的數據格式的綁定
固然XML的數據綁定與JOSN相似,只不過是講produces屬性的文本類型轉換成「application/xml」。返回的仍是StudentModel的對象,以下所示。
下方就是訪問該路由所對應的結果:
4、REST-Controller的建立
當咱們建立的Controller了是專門爲做爲App接口或者其餘API的話,能夠將咱們的Controller聲明爲RestController。由於從上述實例中咱們不難看出,普通的Controller中,若是要將返回的數據放到Response Body中,須要在相應的方法前面使用@ResponseBody來進行註解。
可是當咱們使用@RestController註解將咱們的Controller聲明爲RestController時,就不用在每一個方法前面添加上@ResponseBody註解了,由於在RestController中路由所映射的方法的返回值就會直接放入到Response Body 中。
下方就是咱們建立的RestController, 其中路由所映射的方法是不須要@ResponseBody來進行註解的,以下所示:
下方就是咱們訪問「/rest」路由所返回的內容:
5、路由的快捷設置
咱們也能夠在SpringMVC的配置文件中來快速的設置路由與JSP頁面的映射關係,固然實現起來也是比較簡單的。只須要咱們的Spring的配置類繼承於WebMvcConfigurerAdapter而後重寫addViewControllers()方法便可。在addViewController()的方法中來進行路由到JSP頁面的映射關係。以下所示:
咱們直接訪問"/indextest"路由,訪問的就是index.jsp頁面了。該功能會在後幾篇博客中常常用到。
好今天博客的內容也夠多的了,就先到這兒吧。關於JavaEE的東西,會繼續更新的。