SpringMVC(二)

八、HttpMessageConverter

HttpMessageConverter,報文信息轉換器,將請求報文轉換為Java對象,或將Java對象轉換為響應報文

HttpMessageConverter提供了兩個注解和兩個類型:@RequestBody,@ResponseBody,RequestEntity,

ResponseEntity

1、@RequestBody

@RequestBody可以獲取請求體,需要在控制器方法設置一個形參,使用@RequestBody進行標識,當前請求的請求體就會為當前注解所標識的形參賦值

<form th:action="@{/testRequestBody}" method="post">用戶名:<input type="text" name="username"><br>密碼:<input type="password" name="password"><br><input type="submit">
</form>
@RequestMapping("/testRequestBody")
public String testRequestBody(@RequestBody String requestBody){System.out.println("requestBody:"+requestBody);return "success";
}

輸出結果:

requestBody:username=admin&password=123456

2、RequestEntity

RequestEntity封裝請求報文的一種類型,需要在控制器方法的形參中設置該類型的形參,當前請求的請求報文就會賦值給該形參,可以通過getHeaders()獲取請求頭信息,通過getBody()獲取請求體信息

@RequestMapping("/testRequestEntity")
public String testRequestEntity(RequestEntity<String> requestEntity){System.out.println("requestHeader:"+requestEntity.getHeaders());System.out.println("requestBody:"+requestEntity.getBody());return "success";
}

輸出結果:
requestHeader:[host:“localhost:8080”, connection:“keep-alive”, content-length:“27”, cache-control:“max-age=0”, sec-ch-ua:“” Not A;Brand";v=“99”, “Chromium”;v=“90”, “Google Chrome”;v=“90"”, sec-ch-ua-mobile:“?0”, upgrade-insecure-requests:“1”, origin:“http://localhost:8080”, user-agent:“Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36”]
requestBody:username=admin&password=123

3、@ResponseBody

@ResponseBody用于標識一個控制器方法,可以將該方法的返回值直接作為響應報文的響應體響應到瀏覽器

@RequestMapping("/testResponseBody")
@ResponseBody
public String testResponseBody(){return "success";
}

結果:瀏覽器頁面顯示success

4、SpringMVC處理json

@ResponseBody處理json的步驟:

a>導入jackson的依賴

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.12.1</version>
</dependency>

b>在SpringMVC的核心配置文件中開啟mvc的注解驅動,此時在HandlerAdaptor中會自動裝配一個消息轉換器:MappingJackson2HttpMessageConverter,可以將響應到瀏覽器的Java對象轉換為Json格式的字符串

<mvc:annotation-driven />

c>在處理器方法上使用@ResponseBody注解進行標識

d>將Java對象直接作為控制器方法的返回值返回,就會自動轉換為Json格式的字符串

@RequestMapping("/testResponseUser")
@ResponseBody
public User testResponseUser(){return new User(1001,"admin","123456",23,"男");
}

瀏覽器的頁面中展示的結果:

{“id”:1001,“username”:“admin”,“password”:“123456”,“age”:23,“sex”:“男”}

5、SpringMVC處理ajax

a>請求超鏈接:

<div id="app"><a th:href="@{/testAjax}" @click="testAjax">testAjax</a><br>
</div>

b>通過vue和axios處理點擊事件:

<script type="text/javascript" th:src="@{/static/js/vue.js}"></script>
<script type="text/javascript" th:src="@{/static/js/axios.min.js}"></script>
<script type="text/javascript">var vue = new Vue({el:"#app",methods:{testAjax:function (event) {axios({method:"post",url:event.target.href,params:{username:"admin",password:"123456"}}).then(function (response) {alert(response.data);});event.preventDefault();}}});
</script>

c>控制器方法:

@RequestMapping("/testAjax")
@ResponseBody
public String testAjax(String username, String password){System.out.println("username:"+username+",password:"+password);return "hello,ajax";
}

6、@RestController注解

@RestController注解是springMVC提供的一個復合注解,標識在控制器的類上,就相當于為類添加了@Controller注解,并且為其中的每個方法添加了@ResponseBody注解

7、ResponseEntity

ResponseEntity用于控制器方法的返回值類型,該控制器方法的返回值就是響應到瀏覽器的響應報文

九、文件上傳和下載

1、文件下載

使用ResponseEntity實現下載文件的功能

@RequestMapping("/testDown")
public ResponseEntity<byte[]> testResponseEntity(HttpSession session) throws IOException {//獲取ServletContext對象ServletContext servletContext = session.getServletContext();//獲取服務器中文件的真實路徑String realPath = servletContext.getRealPath("/static/img/1.jpg");//創建輸入流InputStream is = new FileInputStream(realPath);//創建字節數組byte[] bytes = new byte[is.available()];//將流讀到字節數組中is.read(bytes);//創建HttpHeaders對象設置響應頭信息MultiValueMap<String, String> headers = new HttpHeaders();//設置要下載方式以及下載文件的名字headers.add("Content-Disposition", "attachment;filename=1.jpg");//設置響應狀態碼HttpStatus statusCode = HttpStatus.OK;//創建ResponseEntity對象ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes, headers, statusCode);//關閉輸入流is.close();return responseEntity;
}

2、文件上傳

文件上傳要求form表單的請求方式必須為post,并且添加屬性enctype=“multipart/form-data”

SpringMVC中將上傳的文件封裝到MultipartFile對象中,通過此對象可以獲取文件相關信息

上傳步驟:

a>添加依賴:

<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.1</version>
</dependency>

b>在SpringMVC的配置文件中添加配置:

<!--必須通過文件解析器的解析才能將文件轉換為MultipartFile對象-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>

c>控制器方法:

@RequestMapping("/testUp")
public String testUp(MultipartFile photo, HttpSession session) throws IOException {//獲取上傳的文件的文件名String fileName = photo.getOriginalFilename();//處理文件重名問題String hzName = fileName.substring(fileName.lastIndexOf("."));fileName = UUID.randomUUID().toString() + hzName;//獲取服務器中photo目錄的路徑ServletContext servletContext = session.getServletContext();String photoPath = servletContext.getRealPath("photo");File file = new File(photoPath);if(!file.exists()){file.mkdir();}String finalPath = photoPath + File.separator + fileName;//實現上傳功能photo.transferTo(new File(finalPath));return "success";
}

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

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

相關文章

【MySQL】子查詢

文章目錄 子查詢IN運算符子查詢 VS 連接ALL關鍵字ANY關鍵字相關子查詢 !EXISTS運算符select子句中的子查詢from子句中的子查詢 子查詢 獲取價格大于id為3的貨物的商品 用到了內查詢&#xff0c;獲取id為3的商品的單價&#xff0c;把結構傳給外查詢 在where子句中編寫子查詢&am…

【python基礎(四)】if語句詳解

文章目錄 一. 一個簡單示例二. 條件測試1. 檢查多個條件1.1. 使用and關聯多個條件1.2. 使用or檢查多個條件1.3. in的判斷 2. 布爾表達式 三. if語句1. 簡單的if語句2. if-else語句3. if-elif-else結構4. 使用多個elif代碼塊5. 省略else代碼塊 四. 使用if語句處理列表1. 檢查特殊…

2023-11-23 LeetCode每日一題(HTML 實體解析器)

2023-11-23每日一題 一、題目編號 1410. HTML 實體解析器二、題目鏈接 點擊跳轉到題目位置 三、題目描述 「HTML 實體解析器」 是一種特殊的解析器&#xff0c;它將 HTML 代碼作為輸入&#xff0c;并用字符本身替換掉所有這些特殊的字符實體。 HTML 里這些特殊字符和它們…

Endnote軟件添加期刊引用格式

在下述網址中&#xff0c;找到你想要添加的期刊&#xff0c;下載引用格式文件&#xff08;后綴為.ens格式&#xff09; https://endnote.com/downloads/styles/?wpv_post_searchInformationfusion&wpv_aux_current_post_id12829&wpv_view_count12764-TCPID12829 下載…

SQLY優化

insert優化 1.批量插入 手動事務提交 主鍵順序插入&#xff0c;主鍵順序插入性能高于亂序插入 2.大批量插入數據 如果一次性需要插入大批量數據&#xff0c;使用Insert語句插入性能較低&#xff0c;此時可以使用MYSQL數據庫提供的load指令進行插入 主鍵優化 主鍵設計原則 …

Java實現王者榮耀小游戲

主要功能 鍵盤W,A,S,D鍵&#xff1a;控制玩家上下左右移動。按鈕一&#xff1a;控制英雄發射一個矩形攻擊紅方小兵。按鈕控制英雄發射魅惑技能&#xff0c;傷害小兵并讓小兵停止移動。技能三&#xff1a;攻擊多個敵人并讓小兵停止移動。普攻&#xff1a;對小兵造成基礎傷害。小…

vue3 終端實現 (vue3+xterm+websocket)

目錄 一、xterm介紹 二、效果展示 三、vue文件實現代碼 一、xterm介紹 xterm是一個使用

【C++初階】STL詳解(七)Stack與Queue的模擬實現

本專欄內容為&#xff1a;C學習專欄&#xff0c;分為初階和進階兩部分。 通過本專欄的深入學習&#xff0c;你可以了解并掌握C。 &#x1f493;博主csdn個人主頁&#xff1a;小小unicorn ?專欄分類&#xff1a;C &#x1f69a;代碼倉庫&#xff1a;小小unicorn的代碼倉庫&…

力扣labuladong一刷day17天前綴和數組

力扣labuladong一刷day17天前綴和數組 一、303. 區域和檢索 - 數組不可變 題目鏈接&#xff1a;https://leetcode.cn/problems/range-sum-query-immutable/ 思路&#xff1a;本題即為讓寫一個類用于計算指定區間內的數字和&#xff0c;但如果直接采用for循環的方式&#xff0…

Unity調用dll踩坑記

請用寫一段代碼&#xff0c;讓unity無聲無息的崩潰。 你說這怕是有點難哦&#xff0c;誰會這么不幸呢&#xff1f;不幸的是&#xff0c;我幸運的成為了那個不幸的人。 unity里面調用dll的方式是使用 DllImport &#xff0c;比如有一個 Hello.dll&#xff0c;里面有一個 char* …

圖片如何去除水印?試試這三種去水印方法!

從事自媒體行業的小伙伴們&#xff0c;你們是否經常為文章配圖而煩惱呢&#xff1f;下載的圖片大部分帶有各種各樣的水印或者多余元素&#xff0c;讓人感到困擾。今天&#xff0c;我要分享三個去水印的妙招&#xff0c;這是新媒體人必備的圖片處理技能&#xff0c;快來一起學起…

【MATLAB源碼-第87期】基于matlab的Q-learning算法柵格地圖路徑規劃,自主選擇起始點和障礙物。

操作環境&#xff1a; MATLAB 2022a 1、算法描述 Q-learning是一種無模型的強化學習算法&#xff0c;適用于有限的馬爾可夫決策過程&#xff08;MDP&#xff09;。它的核心是學習一個動作價值函數&#xff08;action-value function&#xff09;&#xff0c;即Q函數&#xf…

面試官:【js多維數組扁平化去重并排序】

文章目錄 前言方法一方法二方法三方法四總結后言 前言 hello world歡迎來到前端的新世界 &#x1f61c;當前文章系列專欄&#xff1a;JavaScript &#x1f431;?&#x1f453;博主在前端領域還有很多知識和技術需要掌握&#xff0c;正在不斷努力填補技術短板。(如果出現錯誤&a…

【騰訊云云上實驗室-向量數據庫】Tencent Cloud VectorDB在實戰項目中替換Milvus測試

為什么嘗試使用Tencent Cloud VectorDB替換Milvus向量庫&#xff1f; 亮點&#xff1a;Tencent Cloud VectorDB支持Embedding&#xff0c;免去自己搭建模型的負擔&#xff08;搭建一個生產環境的模型實在耗費精力和體力&#xff09;。 騰訊云向量數據庫是什么&#xff1f; 騰…

rsync配置和守護進程實踐

目錄 一、rsync概念 1.rsync簡介 2.rsync特點 3、增量和全局傳輸 二、Rsync工作方式 1.準備好rsync備份服務器 2.本地的數據傳輸模式 3.遠程的數據傳輸模式 4.rsync數據推拉模式 三、實踐 1.準備三臺虛擬機 2.都安裝rsync服務 3.拉取遠程文件 3.推送文件 4.rsyn…

Oracle用戶(User)和表空間(Tablespace)

3. 用戶和表空間 3.1. 用戶 1)概念 Oracle數據庫中,用戶(User)是訪問數據庫的途徑和認證方式,同時,用戶也是數據庫對象的邏輯集合。我們通過數據庫用戶和密碼來登錄數據庫,然后,可以在該用戶下創建和操作數據庫對象。 2)創建和配置 創建Oracle用戶,需要具備創建…

python系統編程

文章目錄 系統編程系統工具概述sys模塊os模塊 腳本運行上下文當前工作路徑命令行參數shell環境變量標準流 文件和目錄工具文件工具目錄工具 并行系統工具進程分支線程 系統編程 系統工具 概述 python系統模塊: 模塊名作用*sys負責導出與怕以后呢解釋器本身相關的組件*os包含…

Django DRF序列化器serializer

以下案例由淺到深&#xff0c;逐步深入&#xff0c;通過實例介紹了序列化器的使用方法&#xff0c;和其中遇到的常見問題的解決。 一、序列化器serializers.Serializer 1、urls.py urlpatterns [path("api/<str:version>/depart/",views.DepartView.as_vie…

緩存雪崩、擊穿、穿透及解決方案_保證緩存和數據庫一致性

文章目錄 緩存雪崩、擊穿、穿透1.緩存雪崩造成緩存雪崩解決緩存雪崩 2. 緩存擊穿造成緩存擊穿解決緩存擊穿 3.緩存穿透造成緩存穿透解決緩存穿透 更新數據時&#xff0c;如何保證數據庫和緩存的一致性&#xff1f;1. 先更新數據庫&#xff1f;先更新緩存&#xff1f;解決方案 2…

【問題解決】RuntimeError: apex.optimizers.FusedSGD requires cuda extension 問題解決

在使用 apex 庫時&#xff0c;按照官方的方式安裝后&#xff0c;雖然安裝成功&#xff0c;但調用的時候會報錯如下&#xff0c;也就是說其實沒有成功安裝可調用 cuda 的 apex&#xff1a; RuntimeError: apex.optimizers.FusedSGD requires cuda extension我找了很多解決方式&…