在之前我們使用Swift的Perfect框架來開發服務端程式時,聊到了Perfect中的路由配置。而在SpringMVC中的路由配置與其也是大同小異的。說到路由,其實就是將URL映射到Java的具體類中的具體方法,或者映射到具體的JSP文件上。本篇博客主要就闡述瞭如何在SpringMVC中配置路由以 ...
在之前我們使用Swift的Perfect框架來開發服務端程式時,聊到了Perfect中的路由配置。而在SpringMVC中的路由配置與其也是大同小異的。說到路由,其實就是將URL映射到Java的具體類中的具體方法,或者映射到具體的JSP文件上。本篇博客主要就闡述瞭如何在SpringMVC中配置路由以及REST配置。下方將會聊到路由到JSP文件、路由到Java中具體的方法、獲取路由參數、獲取路由的get屬性、已經返回json和xml數據等。
本篇博客的案例是在上篇博客創建的工程的基礎上來實現的,關於Maven管理下的SpringMVC工程的內容,請移步於《JavaEE開發使用Maven管理的SpringMVC工程》。本篇博客對如何使用Maven來管理SpringMVC就不做過多贅述了。
一、基本路由配置
接下來我們將聊一下常用的幾種路由配置方式,然後給出每種路由的具體實例。當然本部分還是比較簡單的,雖然簡單,但是還是比較重要的。一些後端常用的框架中,都會有各式各樣的路由配置方法,但是這些路由的作用都是大同小異的。像ThinkPHP框架中的路由配置也是ThinkPHP運作的基礎之一。本部分我們就好好的聊一下SpringMVC的路由配置。
1、配置路由前的準備
在配置路由前,我們得先創建一個Java類,我們所配置的路由都會映射到該Java類中的特定方法。創建一個Java的普通類,命名為RouteController。下方截圖中,上方圓框中就是我們SpringMVC的配置文件了。因為在SpringMVCConfig中我們指定了該配置文件的作用域是com.zeluli.springmvc這個包,所以我們創建的路由控制器RouteController類也必須在此包下方。如下所示。下方會對RouteController類中的內容進行詳細的介紹。
2、路由到JSP文件
接下來我們就來看一下在SpringMVC中是如何路由到JSP文件的。首先我們使用spring中的@Controller註解將RouteController類聲明為控制器類,然後在通過@RequestMapping配置路由映射。將路由"/route"映射到RouteController類上。也就是說在瀏覽器中訪問該工程下的/route路徑,就會訪問到RouteController類。稍後會介紹到訪問方式。
聲明並映射完相應的Controller類後,我們在RouteController中創建了一個index()方法。該index()方法比較簡單就返回個“index”字元串。然後也是使用@RequestMapping來配置路由。我們可以看出index()方法所對應的路由值為"/",也就是說,訪問/route這個路由,就會映射到index()這個方法上。
而index()方法返回的這個字元串其實就是該路由所對應的JSP文件的名稱,因為我們在SpringMVCConfig配置文件中為其添加了首碼和尾碼,所以當返回“index”時,我們訪問的就是“/WEB-INF/classes/views/index.jsp”這個資源文件。下方就是SpringMVCConfig中的配置項。
上面實現完方法配置路由後,我們就可以部署到Tomcat上然後用瀏覽器訪問了,下方截圖就是我們訪問/route路由的具體效果。
3、追加路由並設置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也變成了我們設置的值,如下所示。
4、多個路由映射到同一方法上
我們可以將多個路由映射到同一個Controller的方法上。當我們給@RequestMapping的value屬性賦值一個數組時,數組中的路徑都會映射到該註解所修飾的方法中。如下所示。下方的/name1和/name2都會映射到該方法中。如下所示。
二、獲取路由及請求參數
我們在聊Swift的Perfect框架時,其中配置的路由中是可以加一些變數的,然後我們可以在路由映射中獲取路由的參數。在SpringMVC中也是如此,本部分,我們就來看一下如何獲取路由中的參數。以及如何獲取用戶通過Get方式提交的參數的。
1、配置路由參數
在路由配置中,我們可以為路由添加參數,然後使用@PathVariable註解來獲取該路徑變數的值。下方創建的sub2()方法的路由配置中就帶有路徑變數的,使用{路徑變數}來聲明路徑變數,使用@PathVariable來獲取路徑變數。
在下方方法中,我們聲明瞭兩個路由變數,一個名為value1,另一個為value2,在sub2()方法的參數中使用@PathVariable來取出相應變數的值。當然在取值是變數名要和路由中的變數名一致。如下所示。
配置完路由以及路徑變數後,我們就可以進行訪問了。下方就是我們訪問的具體結果,已經返回的Response Body的內容。從該實例中我們不難看出,路徑變數在開發中是非常實用的一項功能。
2.獲取Get請求的單個參數
獲取用戶在Get請求中所添加的參數,可以說是在開發中經常使用的。接下來我們就來看一下我們的方法是如何來獲取Get請求中的相應參數的值的。本小結的內容比較簡單。直接在所映射的方法中添加相應的參數即可。下方sub3()方法的param參數,就是用來接收Get請求參數中名為“param”參數的值的,如下所示。
下方是我們訪問上述路由並傳入相應的參數的請求,結果如下所示:
3、獲取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中傳入的參數。
三、JSON及XML數據的返回
在Spring框架中支持JSON和XML的數據綁定,也就是說JOSN或者XML可以與數據對象進行互轉。不過我們要添加相應的依賴庫。本部分我們就來看一下Spring框架中的JSON和XML的數據綁定。
1、依賴庫的引入
因為我們的項目是使用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格式的數據、如下所示:
3、XML的數據格式的綁定
當然XML的數據綁定與JOSN類似,只不過是講produces屬性的文本類型轉換成“application/xml”。返回的還是StudentModel的對象,如下所示。
下方就是訪問該路由所對應的結果:
四、REST-Controller的創建
當我們創建的Controller了是專門為作為App介面或者其他API的話,可以將我們的Controller聲明為RestController。因為從上述實例中我們不難看出,普通的Controller中,如果要將返回的數據放到Response Body中,需要在相應的方法前面使用@ResponseBody來進行註解。
但是當我們使用@RestController註解將我們的Controller聲明為RestController時,就不用在每個方法前面添加上@ResponseBody註解了,因為在RestController中路由所映射的方法的返回值就會直接放入到Response Body 中。
下方就是我們創建的RestController, 其中路由所映射的方法是不需要@ResponseBody來進行註解的,如下所示:
下方就是我們訪問“/rest”路由所返回的內容:
五、路由的快捷設置
我們也可以在SpringMVC的配置文件中來快速的設置路由與JSP頁面的映射關係,當然實現起來也是比較簡單的。只需要我們的Spring的配置類繼承於WebMvcConfigurerAdapter然後重寫addViewControllers()方法即可。在addViewController()的方法中來進行路由到JSP頁面的映射關係。如下所示:
我們直接訪問"/indextest"路由,訪問的就是index.jsp頁面了。該功能會在後幾篇博客中經常用到。
好今天博客的內容也夠多的了,就先到這兒吧。關於JavaEE的東西,會繼續更新的。