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

来源:http://www.cnblogs.com/ludashi/archive/2017/04/18/6513478.html
-Advertisement-
Play Games

在之前我們使用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的方法上。當我們給@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的東西,會繼續更新的。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一.繼承的類型 在面向對象的編程中,有兩種截然不同繼承類型:實現繼承和介面繼承 1.實現繼承和介面繼承 *實現繼承:表示一個類型派生於基類型,它擁有該基類型的所有成員欄位和函數。在實現繼承中,派生類型採用基類型的每個函數的實現代碼,除非在派生類型的定義中指定某個函數的實現代碼。在需要給現有的類型添加 ...
  • 本次隨筆連載,主要用於記錄本人在項目中,用Xamarin.Forms開發APP中所使用的第三方技術或一些技巧。 準備: 1、VS2017(推薦)或VS2015; 2、JDK 1.8以上; 3、Xamarin.Forms 最新版; 4、Prism 擴展,打開VS的擴展和更新,在聯機中,搜索Prism, ...
  • 通常我們在做資料庫設計時都會有兩張表是多對多關係的時候,在資料庫做多對多關係時候我們通常通過中間關聯表來處理,那我們現在在EF中是如何處理的呢? 假設我們有如下關係,用戶(User)包含多個角色(Role),角色包含多個用戶的情況下,我們如何用EF來處理這樣的資料庫設計呢? 接下來看如下代碼清單: ...
  • 迴文數的判定 很多人糾結迴文數的數學概念 忘了可以直接分割字元串 如此連中文都可以分割 純給萌新看 ...
  • 效果圖: ...
  • public function getContract($value=''){ App::uses ( 'UserContractController', 'Controller' ); $Contract = new UserContractController(); $pdfs = $Contr ...
  • 核心開發介面介紹1、hibernate_0500_CoreAPI2、HiberanteAPI 文檔需要單獨下載 線上api鏈接:http://docs.jboss.org/hibernate/core/3.3/api3、Configuration a) AnnotationConfiguration ...
  • 關於這個問題我糾結了很久,每次打開網頁yii\db\Connection::open幾乎都耗時1000ms。 其實這個問題很好解決:只要把config\db.php配置信息里的localhost,改成ip地址就好,可能是地址解析的原因才會耗時那麼久。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...