Spring MVC數據綁定和響應——復雜數據綁定(四)JSON數據綁定

一、消息轉換器—HttpMessageConverter接口

????????客戶端不同的請求,HttpServletRequest中數據的MediaType可能會不同,如果想將HttpServletRequest中的數據轉換成指定對象,或者將對象轉換成指定格式的數據,就需要使用對應的消息轉換器來實現。Spring中提供了一個HttpMessageConverter接口作為消息轉換器。因為數據的類型有多種,所以Spring中提供了多個HttpMessageConverter接口的實現類,其中MappingJackson2HttpMessageConverter是HttpMessageConverter接口的實現類之一,在處理請求時,可以將請求的JSON報文綁定到處理器的形參對象,在響應請求時,將處理器的返回值轉換成JSON報文。

二、HttpMessageConverter與Converter類型轉換器的區別

????????需要注意的是,HttpMessageConverter消息轉換器和之前所學習的Converter類型轉換器是有區別的。HttpMessageConverter消息轉換器用于將請求消息中的報文數據轉換成指定對象,或者將對象轉換成指定格式的報文進行響應;Converter類型轉換器用于對象之間的類型轉換。

????????接下來通過一個異步提交商品信息案例,演示Spring MVC中的JSON數據綁定,案例具體實現步驟如下。?

1、在項目的pom.xml文件中導入Jackson的依賴。

    <!--Jackson轉換核心包依賴--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.9.2</version></dependency><!--Jackson轉換的數據綁定包依賴--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.2</version></dependency><!--Jackson JSON轉換注解包--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.9.0</version></dependency>

????????2、在項目中導入jQuery文件

????????由于本次演示的是異步數據提交,需要使用jQuery,所以需要將jQuery文件導入到項目中,以便發送ajax請求。在項目的/webapp文件夾下創建名稱為js的文件夾,在js文件夾中導入jQuery文件。?

????????3、創建一個商品信息頁面product.jsp,在product.jsp中創建一個表單用于填寫商品信息,表單提交時,表單發送異步請求將表單的商品信息發送到處理器。product.jsp的部分代碼如下所示。

<script type="text/javascript">function sumbmitProduct() {var proId = $(“#proId").val();  var proName = $("#proName").val();$.ajax({ url: "${pageContext.request.contextPath }/getProduct",type: "post",data: JSON.stringify({proId: proId, proName: proName}),contentType: "application/json;charset=UTF-8",dataType: "json",success: function (response) {alert(response);}  });		}
</script>

4、修改ProductController.java類,在ProductController類中新增getProduct()方法和getProductList()方法,分別用于獲取客戶端提交的單個商品信息和多個商品信息。

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<html>
<head><title>異步提交商品</title><script type="text/javascript"src="${pageContext.request.contextPath }/js/jquery-3.6.0.js"></script>
</head>
<body>
<form id="products"><table border="1"><tr><th>商品id</th><th>商品名稱</th><th>提交</th></tr><tr><td><input name="proId" value="1" id="proId" type="text"></td><td><input name="proName" value="三文魚"id="proName" type="text"></td><td><input type="button" value="提交單個商品"onclick="sumbmitProduct()"></td></tr><tr><td><input name="proId" value="2" id="proId2"type="text"></td><td><input name="proName" value="紅牛"id="proName2" type="text"></td><td><input type="button" value="提交多個商品"onclick="submitProducts()"></td></tr></table>
</form>
<script type="text/javascript">function sumbmitProduct() {var proId = $("#proId").val();var proName = $("#proName").val();$.ajax({url: "${pageContext.request.contextPath }/getProduct",type: "post",data: JSON.stringify({proId: proId, proName: proName}),contentType: "application/json;charset=UTF-8",dataType: "json",success: function (response) {alert(response);}});}function submitProducts() {var pro1 = {proId: $("#proId").val(), proName: $("#proName").val()}var pro2 = {proId: $("#proId2").val(), proName: $("#proName2").val()}$.ajax({url: "${pageContext.request.contextPath }/getProductList",type: "post",data: JSON.stringify([pro1, pro2]),contentType: "application/json;charset=UTF-8",dataType: "json",success: function (response) {alert(response);}});}
</script>
</body>
</html>

5、在項目的web.xml文件中配置的DispatcherServlet會攔截所有URL,導致項目中的靜態資源(如css、jsp、js等)也被DispatcherServlet攔截。如果想放行靜態資源,可以在Spring MVC的配置文件中進行靜態資源配置。Spring MVC配置文件的部分配置代碼如下所示。

<!-- 配置要掃描的包 --><context:component-scan base-package="com.test.controller"/><!-- 配置視圖解析器 --><bean class= “org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/pages/"/><property name="suffix" value=".jsp"/></bean><!-- 配置注解驅動 --><mvc:annotation-driven /><!--配置靜態資源的訪問映射,此配置中的文件,將不被前端控制器攔截 --><mvc:resources mapping="/js/**" location="/js/" />

三、<mvc:resources …/>的兩個重要屬性

屬性說明

location

用于定位需要訪問的本地靜態資源文件路徑,具體到某個文件夾

mapping

匹配靜態資源全路徑,其中“/**”表示文件夾及其子文件夾下的某個具體文件

????????6、啟動chapter12項目,在瀏覽器中訪問商品信息頁面product.jsp,訪問地址為http://localhost:8080/chapter12/product.jsp。

????????7、在product.jsp的顯示效果圖所示的頁面中,單擊右側“提交單個商品”按鈕,product.jsp表單中的單個商品信息以JSON格式異步發送到服務器端getProduct()方法中。提交單個商品時控制臺打印信息如圖所示。

獲取到的Id為1名稱為三文魚的商品

????????從圖中所示的打印信息可以得出,客戶端異步提交的JSON數據,按照形參product屬性的格式進行關聯映射,并賦值給product對應的屬性,完成了JSON數據的綁定。

????????8、在product.jsp的顯示效果圖所示的頁面中,單擊“提交多個商品”按鈕,product.jsp表單中的2個商品信息以JSON格式異步發送到服務器端getProductList()方法中。提交多個商品時控制臺打印信息如圖所示。

獲取到的Id為1名稱為三文魚的商品
獲取到的Id為2名稱為紅牛的商品

????????從圖中所示的打印信息可以得出,客戶端異步提交的JSON數據,按照形參products的存儲結構進行關聯映射,并賦值給products中對象的對應屬性,完成了JSON數據的綁定。

四、JSON轉換器配置和靜態資源訪問配置

????????JSON轉換器配置和靜態資源訪問配置,除了之前講解的配置方案之外,還可以通過其他方式完成,下面講解兩種配置方式,使用<bean>元素配置JSON轉換器和靜態資源訪問的配置方式。

(一)使用<bean>元素配置JSON轉換器

????????在配置JSON轉換器時,除了常用的<mvc:annotation-driven />元素,還可以使用<bean>元素進行顯示的配置,<bean>元素配置JSON轉換器方式具體如下所示。

<!-- 使用<bean>元素配置注解方式的處理器映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />
<!-- 使用<bean>元素配置注解方式的處理器適配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"><property name="messageConverters"><list><!-- 配置JSON轉換器 --><bean  class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/></list></property>
</bean>

(二)靜態資源訪問的配置方式

????????除了使用<mvc:resources>元素實現對靜態資源的訪問外,Spring MVC還提供了另外2種靜態資源訪問的配置方式。

(1)使用<mvc:default-servlet-handler>配置靜態資源

在Spring MVC的配置文件中,使用<mvc:default-servlet-handler>元素配置靜態資源,也可以實現對靜態資源的訪問。配置靜態資源的具體代碼如下:

<mvc:default-servlet-handler />

????????在Spring MVC的配置文件中配置<mvc:default-servlet-handler />后,Spring MVC會在Spring MVC上下文中定義一個默認的Servlet請求處理器DefaultServletHttpRequestHandler,該處理器會對進入DispatcherServlet的URL進行篩查,如果發現是靜態資源的請求,就將該請求轉由Web服務器默認的Servlet處理,默認的Servlet會對靜態資源放行;如果不是靜態資源的請求,就由DispatcherServlet繼續處理。

(2)激活Tomcat默認的Servlet來處理靜態資源訪問

在web.xml文件中激活Tomcat默認的Servlet去處理對應的靜態資源,web.xml配置代碼如下所示:

<servlet-mapping><servlet-name>default</servlet-name><url-pattern>*.js</url-pattern>
</servlet-mapping><servlet-mapping><servlet-name>default</servlet-name><url-pattern>*.css</url-pattern>
</servlet-mapping>	...

????????在上述代碼中, <servlet-mapping>元素可以激活Tomcat默認的Servlet來處理靜態文件。在配置時,可以根據需要繼續追加<servlet-mapping>。此種配置方式和第(1)種方式本質上是一樣的,都是使用Web服務器默認的Servlet來處理靜態資源文件的訪問。

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

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

相關文章

服務器硬件以及RAID配置

目錄 一、RAID磁盤陣列原理&#xff08;嘎嘎重要&#xff09; 1、RAID的概述 2、常用的RAID 2.1、RAID 0 2.2、RAID 1 2.3、RAID 5 2.5、RAID 10 3、陣列卡介紹 二、建立軟件RAID磁盤陣列 1、添加硬盤 2、使用fdisk分區&#xff0c;類型為fd 3、mdata命令使用參數 …

安全與加密常識(3)什么是數字簽名和數字證書

文章目錄 數字簽名工作原理關鍵特點應用實例 數字證書數字證書和數字簽名趣味實例 數字簽名 數字簽名是一種通過密碼運算生成的數據&#xff0c;用于驗證信息的完整性和來源&#xff0c;確保數據在傳輸過程中未被篡改&#xff0c;同時提供發送者的身份認證和防止抵賴的功能。它…

Qt: QPushButton 按鈕實現 上圖標下文字

效果如下&#xff1a; 實現有如下幾種方式&#xff1a; 1. 使用 QPushButton 設置 setStyleSheet 例&#xff1a; ui->recorder->setStyleSheet("QPushButton{"\"border: 1px solid #00d2ff; "\"min-height: 60px; "\"col…

python多繼承的3C算法

python多繼承的3C算法 有很多地方都說python多繼承的繼承順序&#xff0c;是按照深度遍歷的方式&#xff0c;其實python多繼承順序的算法&#xff0c;不是嚴格意義上的深度遍歷&#xff0c;而是基于深度遍歷基礎上優化出一種叫3C算法 python多繼承的深度遍歷 class C:def ru…

MySQL高級-MVCC-原理分析(RR級別)

文章目錄 1、RR隔離級別下&#xff0c;僅在事務中第一次執行快照讀時生成ReadView&#xff0c;后續復用該ReadView2、總結 1、RR隔離級別下&#xff0c;僅在事務中第一次執行快照讀時生成ReadView&#xff0c;后續復用該ReadView 而RR 是可重復讀&#xff0c;在一個事務中&…

Django 配置靜態文件

1&#xff0c;DebugTrue 調試模式 Test/Test/settings.py DEBUG True...STATICFILES_DIRS [os.path.join(BASE_DIR, static),] STATIC_URL /static/ 1.1 創建靜態文件 Test/static/6/images/Sni1.png 1.2 添加視圖函數 Test/app6/views.py from django.shortcuts impor…

uniapp,uni-fab組件拖動屬性,替代方案

文章目錄 1. 背景2. 替代方案2.1 方案一2.2 方案二 參考 1. 背景 最近基于uniapp開發一款設備參數調試的APP軟件&#xff0c;其中有使用到懸浮按鈕&#xff0c;快速開發階段&#xff0c;為了能盡快上線&#xff0c;直接使用了uni-ui的擴展組件uni-fab&#xff0c;參考【1】&am…

C++ 設計模式之迭代器模式

C 設計模式之迭代器模式 簡介 1、迭代器模式&#xff08;Iterator&#xff09;是一種行為型設計模式&#xff0c;它允許我們順序訪問一個聚合對象中的各個元素&#xff0c;而又不暴露該對象的內部表示。迭代器模式提供了一種方法來遍歷容器&#xff08;容器對象&#xff0c;如…

Configure C/C++ debugging

Configure C/C debugging launch.json 文件用于在 Visual Studio Code 中配置調試器。 Visual Studio Code 會生成一個 launch.json (位于項目的 .vscode 文件夾下),其中幾乎包含了所有必需的信息。要開始調試,您需要填寫 program 字段,指定要調試的可執行文件的路徑。這必須…

如何通過流式渲染提升用戶體驗?

什么是流式渲染&#xff1f; 流式渲染的核心理念是將 HTML 文檔分割成小塊&#xff08;chunk&#xff09;&#xff0c;并逐步地發送給客戶端&#xff0c;而非等待整個頁面完整生成后再進行傳輸。這種方式能夠極大地提升用戶的初始加載體驗&#xff0c;特別是在網絡條件不佳或者…

【從零開始學架構 架構基礎】四 架構設計的復雜度來源:可擴展性復雜度來源

架構設計的復雜度來源其實就是架構設計要解決的問題&#xff0c;主要有如下幾個&#xff1a;高性能、高可用、可擴展、低成本、安全、規模。復雜度的關鍵&#xff0c;就是新舊技術之間不是完全的替代關系&#xff0c;有交叉&#xff0c;有各自的特點&#xff0c;所以才需要具體…

新書速覽|Linux C與C++一線開發實踐

《Linux C與C一線開發實踐》 本書內容 Linux C/C編程在Linux應用程序開發中占有重要的地位&#xff0c;掌握這項技術將在就業競爭中立于不敗之地。《Linux C與C一線開發實踐》內容針對初中級讀者&#xff0c;貼近軟件公司一線開發實踐。全書厚達620多頁&#xff0c;知識點豐富…

Java中String和StringBuilder的區別

當然可以&#xff0c;我們可以通過面試問答的形式來探討String和StringBuilder的區別。 面試官&#xff1a;請解釋一下Java中String和StringBuilder的區別。 面試回答&#xff1a; 1. 不可變性&#xff08;Immutability&#xff09; String&#xff1a;String對象是不可變的…

微信小程序添加點擊事件

在微信小程序中&#xff0c;給<view>組件添加點擊事件非常直接&#xff0c;你可以使用bindtap屬性來綁定一個事件處理函數。下面是添加點擊事件的基本步驟和示例代碼&#xff1a; 步驟&#xff1a; 在WXML文件中&#xff1a;給需要添加點擊事件的<view>標簽添加bi…

第六周周報

摘要 本周重點跟著網課學習了pytorch框架下張量的各種常用操作API&#xff0c;為后面跑模型做準備&#xff0c;因為看的視頻比較偏向原理&#xff0c;現在對張量有了一個新的認識。其次在時序的研究上&#xff0c;最近我在看圖神經網絡跟時序結合的方向&#xff0c;所以本周學…

Qt自定義類型

概述 在使用Qt創建用戶界面時&#xff0c;特別是那些具有特殊控件和特性的界面時&#xff0c;開發人員有時需要創建新的數據類型&#xff0c;以便與Qt現有的值類型集一起使用或代替它們。 QSize、QColor和QString等標準類型都可以存儲在QVariant對象中&#xff0c;作為基于qo…

51單片機第6步_stdlib.h庫函數

本章重點學習stdlib.h庫函數。 #include <REG51.h> //包含頭文件REG51.h,使能51內部寄存器; #include <stdlib.h> //float atof (char *s1); //參數s1字符串可包含正負號,小數點或E(e)來表示指數部分,如123.456或123e-2; //若首字符是非數據字符,或為正負號…

es6語法復習一

es6語法 1.var 變量提升 2.let 不存在變量提升&#xff0c;只能定義一次 3.const 先定義再使用&#xff0c;定義好來不能修改 4.解構賦值 [a,b,c][1,2,3],{a,b,c}{a:1,b:2,c:3} 5.模版字符串 let aaa; ${a} is ok 6.對象簡化寫法 const school{ name, change, improve(){ cons…

力扣2438.二的冪數組中查詢范圍內的乘積

力扣2438.二的冪數組中查詢范圍內的乘積 lowbit求所有2的冪 accumulate函數(begin,end,start,way)求和/積的方式求積并取模 const int N 1e9 7;class Solution {public:int lowbit(int x){return x & -x;}vector<int> productQueries(int n, vector<vector&l…

[NSSCTF]-Reverse:[SWPUCTF 2021 新生賽]easyapp(安卓逆向,異或)

無殼 把后綴名改為zip&#xff0c;找到apk 查看jadx 這里調用了MainActivity的lambda$onCreate$0$MainActivity&#xff0c;然后又調用了Encoder進行異或。 exp&#xff1a; result棿棢棢棲棥棷棊棐棁棚棨棨棵棢棌 key987654321 flag for i in range(len(result)):flagchr(…