Spring MVC2

在Spring MVC1中,我們知道了MVC的定義,同時也知道了@RequestMapping和@RestController這個注解的作用。

本篇文章,我們將學習使用Spring MVC獲取請求參數和返回不同的響應等等

請求

傳遞單個參數

如圖所示,創建RequestController類:

?在類中實現傳遞單個參數:

@RestController
public class RequestController {@RequestMapping("/r1")public String r1(String name){return "獲取參數"+name;}
}

我們可以使用Postman對代碼進行測試 :

傳int和Integer對比(傳錯誤類型和不傳參數):

傳遞Integer:

  @RequestMapping("/r2")public String r2(Integer num){return "獲取參數"+num;}

傳遞int:

   @RequestMapping("/r3")public String r3(int num){return "獲取參數"+num;}

可以看到在不傳參時int直接報了個500(500屬于客戶端的問題,是要我們后端開發人員負責的),因此在實際開發中建議多使用包裝類型

傳遞多個參數

@RequestMapping("/r4")public String r4(String name,Integer age){return "獲取參數:"+name+" age:"+age;}

Postman測試:?

傳遞對象?

當我們需要傳遞兩個以上的參數時,就可以使用對象來進行傳遞,使代碼更加簡潔。

先在目錄下創建一個學生類:

public class Student {private String name;private Integer age;private Integer id;
}

我們可以使用Lombok的@Data注解來減少Getter和Setter方法的書寫:

首先,我們需要在pom.xml中添加Lombok的依賴,這里建議使用插件進行添加:?在pom.xml文件中右鍵-生成:

選中我們剛才安裝的插件:

?

繼續按圖示點擊,然后OK即可:?回到剛才的Student代碼處,添加上@Data注解。

@Data
public class Student {private String name;private Integer age;private Integer id;
}

這是Lombok中所包含的一些其他注解:?@Data=@Getter+@Setter+@ToString+@EqualsAndHashCode+@RequiredArgsConstructor+@NoArgsContryctor

    @RequestMapping("/r5")public String r5(Student student){return student.toString();}
}

測試:?

后端參數映射(后端參數重命名)

后端參數映射需要使用@RequestParam這個注解:

    @RequestMapping("/r6")public String r6(@RequestParam("name")String userName){return "獲取參數"+userName;}

測試:?

傳遞數組

    @RequestMapping("/r7")public String r7(int[] arr){return Arrays.toString(arr);}

測試:

方式1:?
方式2:?

傳遞集合

    @RequestMapping("/r8")public String r8(@RequestParam List<String> list){return list.toString();}

?測試:

方式1:
方式2:

傳遞Json對象

傳遞Json對象需要使用@RequestBody這個注解

    @RequestMapping("/r10")public String r10(@RequestBody Student student){return student.toString();}

測試:?

Json字符串轉對象和對象轉字符串

代碼:

public class TestJson {public static void main(String[] args) throws JsonProcessingException {ObjectMapper mapper = new ObjectMapper();//json字符串轉對象String jsonstr = "{\"name\":\"張三\",\"age\":15,\"id\":5}";Student student = mapper.readValue(jsonstr,Student.class);System.out.println(student);//json對象轉字符串String s = mapper.writeValueAsString(student);System.out.println(s);}
}

?運行結果:

傳遞URL中的對象

注意這里的參數一個都不能少,Spring是無法識別出缺失的參數的。?

    @RequestMapping("r9/{name}/{age}")public String r9(@PathVariable("name")String userName,@PathVariable Integer age){return "獲取參數:"+userName+" age:"+age;}

測試:?

?傳遞文件

這里的注解@RequestPart可加也可不加。

   @RequestMapping("/r11")public String r11(MultipartFile file){return file.getOriginalFilename();}

測試:?

獲取Cookie

Spring中內置了HttpSeverletRequest和HttpSeverletResponse兩個對象(這兩個對象包含了Http請求/響應中的所有屬性)。因為Cookie一般是在請求中的,所以我們可以通過HttpSeverletRequest來獲取到Cookie。

方式1:?
    @RequestMapping("/getC1")public String getCookie1(HttpServletRequest request){Cookie[] cookies = request.getCookies();if(cookies != null){Arrays.stream(cookies).forEach((ck)->{System.out.println(ck.getName()+":"+ck.getValue());});}return "獲取cookie成功";}

點擊這里創建一個Cookie:?輸入127.0.0.1后Add Domain即可:

點擊這里創建Cookie:

測試:

方式2:
 @RequestMapping("/getC2")public String getCookie2(@CookieValue("xmy") String xmy){return xmy;}

測試:

設置Session

方式1:
    @RequestMapping("/setSess")public String setSess(HttpServletRequest request){HttpSession session = request.getSession();session.setAttribute("name","zhangsan");return "設置session成功";}
方式2:
  @RequestMapping("/setSess1")public String setSess1(HttpSession session) {session.setAttribute("name","zhangsan");return "設置session成功";}

獲取Session?

方式1:
    @RequestMapping("/getSess1")public String getSess1(HttpServletRequest request){HttpSession session = request.getSession();String name = (String) session.getAttribute("name");return name;}

測試:

?方式2:
   @RequestMapping("/getSess2")public String getSess2(HttpSession session){String name = (String) session.getAttribute("name");return name;}

測試:

?方式3:
    @RequestMapping("/getSess3")public String getSess3(@SessionAttribute("name")String name){return name;}

獲取Header中的元素

這里我們獲取的是Header中的User-Agent元素。

方式1:
 @RequestMapping("/getHeader")public String getHeader(HttpServletRequest request){String header = request.getHeader("User-Agent");return header;}

測試:

?方式2:
    @RequestMapping("/getHeader2")public String getHeader2(@RequestHeader("User-Agent")String header){return header;}

測試:

響應

返回靜態頁面

先在static目錄下創建一個HTML文件:?

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h1>我是一個標題</h1>
</body>
</html>

這里我們需要把類上面的@RestController變成@Controller,@Controller是定義?個控制器, Spring 框架啟動時加載, 把這個對象交給Spring管理(返回的是視圖),而@RestController = @ResponseBody(返回數據)+@Controller,因此RestController返回的是數據。

@Controller
public class ResponseController {@RequestMapping("/index")public String index(){return "/index.html";}

測試:

注意:因為在這里使用的是@Controller,所以我們后面需要返回數據的內容都要加上@ResponseBody 。

返回數據

@RequestMapping("/index2")@ResponseBodypublic String index2(){return "返回數據";}

測試:?

返回HTML代碼片段

    //返回html@RequestMapping("/index3")@ResponseBodypublic String index3(){return "<h1>hello springmvc<h1>";}

?測試:

返回Json?

    //返回json@RequestMapping("/index4")@ResponseBodypublic HashMap<String,String> index4(){HashMap<String,String> map = new HashMap<>();map.put("k1","v1");map.put("k2","v2");map.put("k3","v3");map.put("k4","v4");return map;}

?測試:

設置狀態碼

設置狀態碼需要使用HttpSeverletResponse對象?

    //設置狀態碼@ResponseBody@RequestMapping("/index5")public String setStatus(HttpServletResponse response){response.setStatus(418);return "設置狀態碼";}

測試:

設置返回類型

//設置返回類型@RequestMapping(value = "return",produces = "applicatin/json")@ResponseBodypublic String returnJson(){return "{\"success\":true}";}

?測試:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/91200.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/91200.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/91200.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

項目文章(IF:9.3)轉錄因子ChIP-seq助力揭示CsphyB-CsPIF4-CsBRC1模塊調控ABA合成和腋芽生長發育

分枝生長是作物農業特性中的一項重要指標&#xff0c;它直接影響植株的結構和作物的產量。黃瓜&#xff08;學名&#xff1a;Cucumis sativus L.&#xff09;是一種在全球范圍內具有重要經濟價值和營養價值的重要蔬菜作物。在田間環境中&#xff0c;具有更多側枝的黃瓜植株更受…

NSSCTF Web 一點學習

[SWPUCTF 2021 新生賽]jicao連接&#xff1a;利用hackbar&#xff0c;按照php的判斷條件來得到flag[SWPUCTF 2021 新生賽]easyrce連接&#xff1a;url讀取并且執行先用ls查看flag位置&#xff1a;找到了個看起來是flag的文件cat一下&#xff1a;得到flag[SWPUCTF 2021 新生賽]c…

【STM32項目】環境監測設計

????大家好&#xff0c;這里是5132單片機畢設設計項目分享&#xff0c;今天給大家分享的是基于《基于STM32的環境監測設計》。 目錄 1、系統功能 2.1、硬件清單 2.2、功能介紹 2.3、控制模式 2、演示視頻和實物 3、系統設計框圖 4、軟件設計流程圖 5、原理圖 6、主…

不同系統記錄項目進度不一致,如何統一口徑

不同系統記錄項目進度不一致&#xff0c;會造成項目管理混亂、信息混淆和決策失誤。統一口徑的方法包括&#xff1a;采用統一的項目管理平臺、明確數據記錄與更新規范、建立進度數據對接與整合機制。特別是采用統一的項目管理平臺&#xff0c;通過統一的信息輸入與輸出渠道&…

玩轉Docker | 使用Docker部署Drawnix在線白板工具

玩轉Docker | 使用Docker部署Drawnix在線白板工具 前言一、Drawnix介紹Drawnix簡介Drawnix主要特點二、系統要求環境要求環境檢查Docker版本檢查檢查操作系統版本三、部署Drawnix服務下載Drawnix鏡像編輯部署文件創建容器檢查容器狀態檢查服務端口安全設置四、訪問Drawnix服務訪…

Linux操作系統從入門到實戰(九)Linux開發工具(中)自動化構建-make/Makefile知識講解

Linux操作系統從入門到實戰&#xff08;九&#xff09;Linux開發工具&#xff08;中&#xff09;自動化構建-make/Makefile前言一、 make/Makefile是什么&#xff1f;1. 我們先想個問題&#xff1a;手動編譯代碼有多麻煩&#xff1f;2. 為了解決麻煩&#xff0c;才有了自動化工…

開源b2b2c商城源碼 支持多端適用 含完整代碼包和圖文搭建教程

在電商行業蓬勃發展的當下&#xff0c;b2b2c商城系統成為眾多企業拓展業務版圖的有力工具。這種支持自營與商家入駐并存的系統&#xff0c;含豐富平臺商品種類&#xff0c;能通過多元化運營提升平臺競爭力。本文分享一個開源b2b2c商城源碼的相關知識&#xff0c;并詳細介紹其搭…

Vue3入門-指令補充

&#x1f3e0;個人主頁&#xff1a;Yui_ &#x1f351;操作環境&#xff1a;vscode\node.js &#x1f680;所屬專欄&#xff1a;Vue3 文章目錄1. 指令修飾符1.1 按鍵修飾符1.2 事件修飾符1.3 v-model修飾符2. v-model用在其他表單元素上3. 樣式綁定3.1 操作class4. 操作style5.…

UDP類型套接字

理解UDP協議&#xff1a;互聯網世界的"明信片"通信 UDP是什么&#xff1f;為什么需要它&#xff1f; 想象一下&#xff0c;你正在給朋友寄送兩種不同的東西&#xff1a;一份重要的合同文件和一疊度假時的風景明信片。對于合同文件&#xff0c;你會選擇掛號信&#xf…

redis快速入門教程

更新中基本概念安裝centOS安裝redis&#xff1a;yum install redis -y啟動&#xff1a;systemctl start redis設置開機啟動&#xff1a;systemctl enable redis檢查運行狀態&#xff1a;systemctl status redis遠程訪問編輯配置文件 vi /etc/redis.conf在其中修改為bind 0.0.0.…

UDP和TCP的主要區別是什么

UDP&#xff08;用戶數據報協議&#xff09;和 TCP&#xff08;傳輸控制協議&#xff09;是互聯網傳輸層的兩大核心協議&#xff0c;主要區別體現在??連接方式、可靠性、傳輸效率、頭部開銷??及??適用場景??上。以下是具體對比&#xff1a;??一、核心區別對比表???…

ASP .NET Core 8結合JWT輕松實現身份驗證和授權

身份驗證和授權是每一個后端服務必不可少的&#xff0c;可以實現對非法請求進行攔截&#xff0c;能夠有效保護數據的安全性。 JSON Web Token&#xff08;JWT&#xff09;是一項開放標準&#xff08;RFC 7519&#xff09;&#xff0c;它定義了一種緊湊且自包含的方法&#xff…

5G時代的智慧燈桿:塔能“一桿多用”方案如何激活城市新基建?

在《5G應用“揚帆”行動計劃》持續推進的進程之中&#xff0c;智慧桿已然成為了5G基站部署環節極為重要的載體&#xff0c;并且被明確地歸入到新型基礎設施建設的重點范疇之內。相關政策提出&#xff0c;要在2025年達成重點區域5G網絡全面且深度覆蓋的目標&#xff0c;與此同時…

護照閱讀器:國外證件識別的 OCR “解碼師”

國外證件版式多樣、語種繁雜&#xff0c;人工識別不僅耗時&#xff0c;還易因翻譯誤差、格式不熟悉導致信息錯漏。尤其在跨境業務場景中&#xff0c;傳統識別方式嚴重影響效率與準確性。護照閱讀器搭載的 OCR 技術成為破局關鍵。它能精準提取國外護照、駕照等證件上的多語種文字…

Linux部署Python服務

1、創建項目目錄與虛擬環境#確保安裝 Python 和 python3-venv 工具 sudo apt update sudo apt install python3 python3-pip python3-venvmkdir myproject cd myproject python3 -m venv venv # 創建虛擬環境#Linux source venv/bin/activate # 激活虛擬環境#Windowds venv\S…

【Python辦公】使用Python和Tkinter構建Excel數據導入MySQL工具(GUI版)

目錄 專欄導讀前言項目概述技術棧環境準備核心代碼實現1. 導入必要的庫2. 主應用類設計3. 用戶界面設計數據庫配置區域數據庫選擇區域4. 數據庫連接功能測試連接獲取數據庫列表5. 數據導入功能關鍵技術點解析1. SQLAlchemy 2.x 兼容性2. MySQL 8.0 認證問題3. 避免啟動時連接錯…

華為OD機試_2025 B卷_猜數字(Python,100分)(附詳細解題思路)

題目描述 一個人設定一組四碼的數字作為謎底&#xff0c;另一方猜。 每猜一個數&#xff0c;出數者就要根據這個數字給出提示&#xff0c;提示以XAYB形式呈現&#xff0c;直到猜中位置。 其中X表示位置正確的數的個數&#xff08;數字正確且位置正確&#xff09;&#xff0c;而…

【網絡安全】理解安全事件的“三分法”流程:應對警報的第一道防線

1. 簡介 在網絡安全領域&#xff0c;每天都會產生大量安全警報。作為一名安全分析師&#xff0c;識別、評估并優先處理這些警報的能力至關重要。三分法&#xff08;Triage&#xff09; 是確保安全團隊高效響應安全事件的核心流程&#xff0c;它能夠幫助我們合理分配資源、集中精…

AI大模型計數能力的深度剖析:從理論缺陷到技術改進

AI大模型計數能力的深度剖析&#xff1a;從理論缺陷到技術改進 AI大模型在計數任務上表現出明顯的局限性&#xff0c;這不僅反映了模型架構的核心缺陷&#xff0c;也揭示了當前深度學習技術在處理結構化信息時的本質挑戰。通過對文本計數、圖像計數以及相關技術改進方向的全面分…

[C語言初階]結構體初階

目錄一、結構體的聲明二、結構體的定義和初始化三、結構體成員訪問四、結構體傳參五、函數調用的參數壓棧&#xff08;了解&#xff09;在C語言中&#xff0c;我們知道數組是一組相同類型元素的集合&#xff0c;而結構體則更為靈活&#xff0c;它允許我們將不同類型的數據組合在…