SpringMvc(二)- 請求處理參數 和 響應數據處理

来源:https://www.cnblogs.com/xiaoqigui/archive/2022/09/03/16653624.html
-Advertisement-
Play Games

1、請求處理參數 1.1 請求參數 @RequestParam 1.1.1 不使用 @RequestParam 註解 請求參數處理,不使用參數註解: 1.如果請求參數名和請求處理的形參名一致,springMvc 框架會自動將你的請求參數名對應的參數值,綁定到請求方法的形參中,方法內就可以直接使用,不 ...


1、請求處理參數

1.1 請求參數 @RequestParam

1.1.1 不使用 @RequestParam 註解

請求參數處理,不使用參數註解
1.如果請求參數名和請求處理的形參名一致,springMvc 框架會自動將你的請求參數名對應的參數值綁定到請求方法的形參中方法內就可以直接使用,不用手動獲取;

2.如果你的請求沒有攜帶參數,不會報錯,只不過,請求處理方法的形參值都是null或其他值,如果請求處理方法形參是一個實體參數,原理和單個類型參數一致(只要請求參數名和實體名一致也可以自動綁定);

測試不使用 @RequestParam 註解

@RequestMapping("/testSpringMvcNoRequestParam")
public String testSpringMvcNoRequestParam( String userId,String userName){

    System.out.println(String.format("------ 請求參數:uid :%s ,uname:%s------",userId,userName));

    return "success";
}

測試 請求不帶參數

測試 請求帶參數

1.1.3 使用 @RequestParam 註解

@RequestParam 只能寫在請求方法的形參上
required = false 設置參數不是必傳
defaultValue 預設值

  • 1.如果請求處理方法,形參前,只增加了此註解,沒有指定任何屬性:
    • 作用:當前形參必傳,且參數名形參名必須一致,如果不一致,參數綁定失敗,請求直接報400錯誤,提示你的參數沒有提供;
  • 2.如果請求處理方法,形參前,只增加了此註解,並添加了value屬性值
    • 作用:請求的參數名必須和value屬性指定的名稱一致,此value屬性可以省略(只寫 請求參數別名時,如果有其他的屬性,value屬性必須指定);
  • 3.如果要取消每個參數的必傳校驗,可以給此註解增加屬性 required=false(預設是true,必傳),參數可以不傳,不需要參數值的綁定;
  • 4.如果某個參數必傳,但是為了防止請求沒有攜帶此參數,可以通過指定屬性defaultValue增加預設值,如果調用當前請求方法處理,沒有提供參數,自動使用預設值,綁定到方法的對應形參中;

測試

@RequestMapping("/testSpringMvcRequestParam")
public String testSpringMvcRequestParam(@RequestParam("uid") String userId,
                                        @RequestParam(value = "uname",required = false,defaultValue = "KH96-mvc") String userName,
                                        @RequestParam String userPwd){

    System.out.println(String.format("------ 請求參數:uid :%s ,uname:%s,uPwd:%s------",userId,userName,userPwd));

    return "success";
}

測試結果

1.2 請求頭參數 @RequestHeader

請求頭參數@RequestHeader:

  • 處理請求頭攜帶參數;
  • 作用:從請求頭中獲取參數,根據別名或者參數形參名,將請求頭對應參數值,綁定到請求處理方法的形參中,直接使用,用法跟@RequestParam類似,也可以指定是否必傳,預設值;

測試

@RequestMapping("/testSpringMvcNoRequestHeader")
public String testSpringMvcNoRequestHeader(@RequestHeader(value = "token",required = false,defaultValue = "KH96_mvc") String token){

    System.out.println(String.format("------ 請求頭參數:token :%s ------",token));

    return "success";
}

測試結果

@CookieValue:

cookie中獲取參數,根據別名或者參數形參名,將請求頭對應參數值綁定到請求處理方法的形參中,直接使用,用法跟@RequestParam,@RequestHeader類似,也可以指定是否必傳預設值

測試

@RequestMapping("/testSpringMvcCookieValue")
public String testSpringMvcCookieValue(@CookieValue("JSESSIONID") String sessionId){

    System.out.println(String.format("------ 請求cookie參數:JSESSIONID :%s ------",sessionId));

    return "success";
}

測試結果:

1.4 實體參數

請求參數處理 實體參數
自動將請求參數自動將實體的屬性名與形參綁定,原理和單個參數類型一致;

測試

@RequestMapping("/testSpringMvcBeanParam")
public String testSpringMvcBeanParam(UserVO userVO){

    System.out.println(String.format("------ 請求實體參數:userVO :%s ------",userVO));

    return "success";
}

測試結果

1.5 原生servlet的API介面作為請求參數

用法和javaWeb截斷學習的用法完全一致;

@RequestMapping("testSpringMvcServletAPI")
public  void testSpringMvcServletAIP(HttpServletRequest request, HttpServletResponse response,HttpSession session) throws IOException, ServletException {
    //獲取請求方式
    System.out.println(String.format("------ 請求方式:%s ------",request.getMethod()));

    //獲取請求參數
    System.out.println(String.format("------ 請求參數:%s ------",request.getParameter("userTel")));

    //手動轉發
    // request.getRequestDispatcher("/WEB-INF/views/success.jsp").forward(request,response);

    //獲取session對象
    //手動添加參數
    HttpSession sessionHad = request.getSession();

    //sessionHad.setAttribute("userTel",request.getParameter("userTel"));

    //方式2;直接將HttpSession對象聲明在請求處理方法的形參中,可以自動獲取 session

    //重定向到
    //        response.sendRedirect("http://www.baidu.com");

}

2、響應數據處理

2.1 ModelAndView

ModelAndView 的數據模型放在request的作用域中視圖模型,放在request.getRequestDispatcher(首碼+視圖名字+尾碼);

結論:SpringMVC框架的前端核心控制器,會自動將返回的ModelAndView對象中的數據模型,添加到request作用域使用內部轉發方式,轉發到目標視圖;

測試

@RequestMapping("/testSpringMvcModelAndView")
public ModelAndView testSpringMvcModelAndView(String userEmail){

    //創建一個 ModelAndView 對象
    ModelAndView mav = new ModelAndView();

    //添加模型數據
    mav.addObject("uemail",userEmail);
    //可以添加多個模型數據,內部使用ModelMap集合存放的
    mav.addObject("uage",18);

    //設置目標視圖
    mav.setViewName("ok");

    //返回  ModelAndView 對象
    return  mav;

}

測試結果

2.2 Map

要求:使用map返回模型數據,必須將map聲明在請求處理方法的形參中,定義在方法的內部是無效的;

總結:

  • 1.springMVC底層在調用目標請求處理方法前,會自動創建一個Model介面的隱含對象作為模型數據存儲對象,如果目標請求處理方法定義了一個map介面自動將隱含對象使用引用傳遞方式傳遞到目標請求處理方法中,方法體內就可以直接添加模型數據
  • 2.SpringMvc底層,在調用完你的請求處理方法後,不管返回什麼類型,都會被轉換為一個ModelAndView對象

測試

@RequestMapping("/testSpringMvcMap")
public  String testSpringMvcMap(String userEmail, Map<String,Object> map){

    //輸出map的目標類型
    System.out.println(map.getClass().getName());
    //org.springframework.validation.support.BindingAwareModelMap

    //添加模型數據
    map.put("uemail",userEmail);

    //返回目標視圖名稱
    return "ok";

}

測試結果

2.3 Model

Model,可以添加模型數據;
必須將 Model 聲明在請求處理方法的形參中,定義在方法的內部是無效的,用法跟Map 一致;

測試

@RequestMapping("/testSpringMvcModel")
public  String testSpringMvcModel(String userEmail, Model model){

    //添加模型數據
    model.addAttribute("uemail",userEmail);

    //返回目標視圖名稱
    return "ok";

}

測試結果

2.4 forward: 轉發 和 redirect: 重定向

2.4.1forward 轉發

只需要在返回的視圖名稱前,增加一個首碼:forward 即可,直接轉發到目標資源;
當前請求處理方法中的模型對象可以帶走;

@RequestMapping("/testSpringMvcForward")
public String testSpringMvcForward(Map<String,Object> map){

    //轉發頁面跳轉
    //return "forward:/forward.jsp";

    //轉發到其他請求中
    //return "forward:/[email protected]";

    //自定義轉發,攜帶模型數據
    map.put("uaddr","nj_wd_kh96");

    return "forward:/[email protected]";
}

2.4.2 redirect 重定向

只需要在返回的視圖名稱前,增加一個首碼:redirect 即可,不做視圖解析器,直接重定向

註意,重定向,當前請求處理方法中的模型對象不能帶走

@RequestMapping("/testSpringMvcRedirect")
public String testSpringMvcRedirect(){

    //重定向頁面跳轉
    //return "redirect:/redirect.jsp";

    //重定向 可以重定向到 其他請求中
    return "redirect:/[email protected]";

}

2.5 @ResponseBody

返回JSON數據;

  • 註意:返回不需要手動轉換為json字元串,直接返回對象;
  • @ResponseBody 將返回請求處理方法返回的源對象數據,直接轉換為json格式字元串,返回,不走視圖解析;
  • 註意:必須增加Jackson依賴的jar包,否者報錯,且必須要增加註解掃描<mvc:annotation-driven></mvc:annotation-driven> 才可以;
  • 位置:可以寫在請求處理方法上或者類上,寫在類上,就是對當前類中所有請求處理方法生效,寫在方法上,只有對當前方法生效;

2.5.1 jar包

<!-- JSON begin -->
<!--jackson-->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.8.4</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.8.4</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.8.4</version>
</dependency>
<!--jackson-->
<!-- JSON end -->

2.5.2 配置

<beans xmlns=
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
">
    <!-- 開啟MVC 的註解掃描 -->
    <mvc:annotation-driven></mvc:annotation-driven>

</beans>

2.5.3 測試

@RequestMapping("/testSpringMvcJson")
@ResponseBody
public UserVO testSpringMvcJson(){

    //模擬獲取去用戶詳情對象
    UserVO userVO = new UserVO();

    userVO.setUserId("KH96_01");
    userVO.setUserName("GKC");
    userVO.setUserPwd("123");

    return userVO;

}

測試結果


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

-Advertisement-
Play Games
更多相關文章
  • GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。 GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。 一. XDP Socket示例解析 源碼參見:https://github.com/xdp-project/xdp-tutorial/tree/mast ...
  • 我的另一篇博文中提到JavaScript 有哪些是假值,哪些是真值。對於 null、undefined、"",等一些假值,JavaScript 直接視為 false。 我有一個需求,判斷從瀏覽器中獲取的 Cookie 是否存在,如果存在我就返回 true,否則返回 false。useCookies( ...
  • 每日 3 題 13 以下代碼執行後,控制臺中的輸出內容為? Object.prototype.a = 1; Function.prototype.b = 2; function F() {} var f = new F(); console.log(F.a); console.log(F.b); c ...
  • Array.apply(null, { length: 1000 }) 點擊打開視頻講解更加詳細 在閱讀VueJS教程時有這麼段demo code: render: function (createElement) { return createElement('div', Array.apply( ...
  • JavaScript 對象 對象 在JavaScript中,對象是一組無序的相關屬性和方法的集合,所有的事物都是對象,例如字元串、數值、數組、函數等。 對象是由屬性和方法組成的。 屬性:事物的特征,在對象中用屬性來表示(常用名詞) 方法:事物的行為,在對象中用方法來表示(常用動詞) 保存一個值時,可 ...
  • 網頁偽靜態 1.什麼是偽靜態網頁? 偽靜態是相對於靜態文件來說的,例如https://www.cnblogs.com/hesujian/p/11165818.html 將一個動態網頁偽裝成靜態網頁 將url地址模擬成html結尾的樣子,看上去像是一個靜態文件,只是改變了URL的表現形式,實際上還是動 ...
  • 使用pyhive的時候出現了這個問題,我使用的是anaconda3。查了很多帖子都不能解決。 參考: https://blog.csdn.net/weixin_43142260/article/details/115198097 https://blog.csdn.net/wenjun_xiao/a ...
  • 線程基礎01 1.程式 進程 線程 程式(program):是為完成的特定任務,用某種語言編寫的一組指令的集合。簡單來說,就是我們寫的代碼。 進程: 進程是指運行中的程式,比如我們使用QQ,就啟動了一個進程,操作系統就會為該進程分配空間。當我們使用迅雷,又啟動了一個進程,操作系統將為迅雷分配新的記憶體 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...