1. 程式人生 > >JavaEE開發之SpringMVC中的路由配置及引數傳遞詳解

JavaEE開發之SpringMVC中的路由配置及引數傳遞詳解

在之前我們使用Swift的Perfect框架來開發服務端程式時,聊到了Perfect中的路由配置。而在SpringMVC中的路由配置與其也是大同小異的。說到路由,其實就是將URL對映到Java的具體類中的具體方法,或者對映到具體的JSP檔案上。本篇部落格主要就闡述瞭如何在SpringMVC中配置路由以及REST配置。下方將會聊到路由到JSP檔案、路由到Java中具體的方法、獲取路由引數、獲取路由的get屬性、已經返回json和xml資料等

本篇部落格的案例是在上篇部落格建立的工程的基礎上來實現的,關於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的方法上。當我們給@RequestMappingvalue屬性賦值一個數組時,陣列中的路徑都會對映到該註解所修飾的方法中。如下所示。下方的/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的東西,會繼續更新的。