最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringMVC 請求參數(shù)綁定的核心場景與解決方案

 更新時間:2025年11月29日 12:05:45   作者:gAlAxy...  
本文介紹了SpringMVC請求參數(shù)綁定的實(shí)現(xiàn)方式,包括基本類型、JavaBean、集合、自定義轉(zhuǎn)換器和原生ServletAPI等6大核心場景,重點(diǎn)講解了每個場景的綁定機(jī)制和核心要求,并提供了完整的示例代碼,此外,還特別強(qiáng)調(diào)了中文亂碼的解決方法和一些注意事項(xiàng),感興趣的朋友一起看看吧

       在 SpringMVC 開發(fā)中,請求參數(shù)綁定是銜接前端表單與后端業(yè)務(wù)邏輯的核心環(huán)節(jié)。本文將從綁定機(jī)制、核心場景、亂碼解決等維度,全面講解 SpringMVC 請求參數(shù)綁定的實(shí)現(xiàn)方式,覆蓋基本類型、JavaBean、集合、自定義轉(zhuǎn)換器、原生 Servlet API 等 6 大核心場景,幫助開發(fā)者高效處理各類參數(shù)綁定需求。

一、核心綁定機(jī)制

       SpringMVC 的參數(shù)綁定本質(zhì)是自動映射:前端表單提交的 k=v 格式數(shù)據(jù)(如 username=haha

&password=123),會被框架自動匹配到控制器方法的參數(shù)或 JavaBean 的屬性中。

核心要求:請求參數(shù)名(表單 name 屬性)與綁定目標(biāo)名稱(方法參數(shù)名 / JavaBean 屬性名)完全一致(區(qū)分大小寫),框架通過反射調(diào)用 setter 方法完成賦值。

二、6 大核心綁定場景

1. 基本數(shù)據(jù)類型 + 字符串類型綁定

適用場景:單個簡單參數(shù)(如姓名、年齡、手機(jī)號)的直接綁定,無需封裝。核心要求:表單 name 屬性與控制器方法參數(shù)名一致。

示例代碼

  • 前端 JSP 表單:
<form action="/user/save1.do" method="post">
    姓名:<input type="text" name="username" />

    年齡:<input type="text" name="age" />

    <input type="submit" value="提交" />
</form>
  • 后端控制器方法:
@RequestMapping("/save1.do")
public String save(String username, Integer age) {
    System.out.println("姓名:"+username + ",年齡:"+age);
    return "suc"; // 跳轉(zhuǎn)成功頁面
}

2. 簡單 JavaBean 綁定

適用場景:參數(shù)較多時(如用戶注冊),將參數(shù)封裝到實(shí)體類中,簡化方法參數(shù)列表。核心要求:表單 name 與 JavaBean 的屬性名一致,且 JavaBean 提供無參構(gòu)造和 setter 方法。

示例代碼

  • 定義 User 實(shí)體類:
public class User {
    private String username;
    private Integer age;
    // 無參構(gòu)造(默認(rèn)生成,顯式聲明更規(guī)范)
    public User() {}
    // getter/setter 方法
    public String getUsername() { return username; }
    public void setUsername(String username) { this.username = username; }
    public Integer getAge() { return age; }
    public void setAge(Integer age) { this.age = age; }
    // toString 便于打印對象
    @Override
    public String toString() {
        return "User{username='" + username + "', age=" + age + "}";
    }
}
  • 控制器方法接收 User 對象:
@RequestMapping("/save2.do")
public String save2(User user) {
    System.out.println("user對象:"+user);
    return "suc";
}

3. 嵌套 JavaBean 綁定(含引用類型)

適用場景:實(shí)體類包含其他引用類型屬性(如 User 包含 Address 地址信息)。核心要求:表單 name 格式為 引用對象名.屬性名(如 address.money)。

示例代碼

  • 定義嵌套實(shí)體類:
// 地址實(shí)體
public class Address {
    private Double money; // 金額
    // getter/setter/toString 省略
}
// 用戶實(shí)體(包含 Address 屬性)
public class User {
    private String username;
    private Address address; // 嵌套引用類型
    // getter/setter/toString 省略
}
  • 前端表單:
<form action="/user/save3.do" method="post">
    姓名:<input type="text" name="username" /><br/>
    金額:<input type="text" name="address.money" /><br/>
    <input type="submit" value="提交" />
</form>
  • 控制器方法:
@RequestMapping("/save3.do")
public String save3(User user) {
    System.out.println("user對象(含地址):"+user);
    return "suc";
}

4. 集合類型綁定(List 嵌套 JavaBean)

適用場景:批量提交同類型數(shù)據(jù)(如批量添加地址、批量導(dǎo)入訂單)。核心要求:表單 name 格式為 集合名[索引].屬性名(如 list[0].money)。

示例代碼

  • 修改 User 實(shí)體,添加 List 集合屬性:
public class User {
    private String username;
    private List<Address> list; // 地址集合
    // getter/setter/toString 省略
}
  • 前端表單:
<form action="/user/save4.do" method="post">
    姓名:<input type="text" name="username" /><br/>
    地址1金額:<input type="text" name="list[0].money" /><br/>
    地址2金額:<input type="text" name="list[1].money" /><br/>
    <input type="submit" value="提交" />
</form>
  • 控制器方法:
@RequestMapping("/save4.do")
public String save4(User user) {
    System.out.println("user對象(含List):"+user);
    return "suc";
}

5. 自定義類型轉(zhuǎn)換器綁定

適用場景:解決框架默認(rèn)不支持的類型轉(zhuǎn)換(如 String 轉(zhuǎn) Date,默認(rèn)不識別 yyyy-MM-dd 格式)。實(shí)現(xiàn)方式:提供兩種方案,按需選擇。

方式 1:@DateTimeFormat 注解(簡單高效)

直接在 JavaBean 的 Date 類型屬性上添加注解,指定日期格式:

public class User {
    private String username;
    // 指定日期格式為 yyyy-MM-dd
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date birthday;
    // getter/setter/toString 省略
}

方式 2:自定義 Converter(靈活通用)

適用于全局統(tǒng)一的類型轉(zhuǎn)換規(guī)則,步驟如下:

  1. 實(shí)現(xiàn) Converter<S, T> 接口(S 為源類型,T 為目標(biāo)類型):
package springmvc; // 包名替換為 springmvc
import org.springframework.core.convert.converter.Converter;
import java.text.SimpleDateFormat;
import java.util.Date;
public class StringToDate implements Converter<String, Date> {
    @Override
    public Date convert(String s) {
        if (s == null || s.isEmpty()) {
            return null; // 處理空值
        }
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try {
            return sdf.parse(s);
        } catch (Exception e) {
            throw new RuntimeException("日期轉(zhuǎn)換失?。? + e.getMessage());
        }
    }
}

       2.在 springmvc.xml 中注冊轉(zhuǎn)換器:

<!-- 配置類型轉(zhuǎn)換服務(wù) -->
<bean id="conversionService" 
      class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters">
        <set>
            <!-- 注冊自定義轉(zhuǎn)換器 -->
            <bean class="springmvc.StringToDate" />
        </set>
    </property>
</bean>
<!-- 啟用注解驅(qū)動,并指定自定義轉(zhuǎn)換服務(wù) -->
<mvc:annotation-driven conversion-service="conversionService"/>

6. 原生 Servlet API 綁定

適用場景:需要直接操作 HttpServletRequest、HttpServletResponse 等原生對象(如獲取請求頭、操作會話、手動處理參數(shù))。核心要求:控制器方法參數(shù)直接聲明原生 API 類型,SpringMVC 自動注入實(shí)例。

完整示例代碼

@RequestMapping("/save6.do")
public String save6(HttpServletRequest request, HttpServletResponse response) {
    // 1. 獲取會話對象
    HttpSession session = request.getSession();
    System.out.println("request:" + request + ",session:" + session);
    // 2. 獲取單個參數(shù)(手動轉(zhuǎn)換類型)
    String username = request.getParameter("username");
    String ageStr = request.getParameter("age");
    Integer age = ageStr != null ? Integer.parseInt(ageStr) : null;
    System.out.println("姓名:" + username + ",年齡:" + age);
    // 3. 獲取多值參數(shù)(如 checkbox)
    String[] hobbies = request.getParameterValues("hobby");
    System.out.println("愛好:" + Arrays.toString(hobbies));
    // 4. 獲取所有參數(shù)(封裝為 Map)
    Map<String, String[]> paramMap = request.getParameterMap();
    paramMap.forEach((key, value) -> {
        System.out.println("參數(shù)名:" + key + ",參數(shù)值:" + Arrays.toString(value));
    });
    return "suc";
}

配套 JSP 表單

<form action="/user/save6.do" method="post">
    姓名:<input type="text" name="username" /><br/>
    年齡:<input type="text" name="age" /><br/>
    愛好:<input type="checkbox" name="hobby" value="籃球" />籃球
          <input type="checkbox" name="hobby" value="游戲" />游戲
          <input type="checkbox" name="hobby" value="看書" />看書<br/>
    <input type="submit" value="提交" />
</form>

關(guān)鍵 API 說明

API 方法功能描述注意事項(xiàng)
request.getParameter("name")獲取單個參數(shù)(返回 String)參數(shù)不存在返回 null,多值參數(shù)僅返回第一個值
request.getParameterValues("name")獲取多值參數(shù)(如 checkbox)返回 String [],適用于同名多輸入框
request.getParameterMap()獲取所有參數(shù)的 Map 集合key 為參數(shù)名,value 為 String []
request.getSession()獲取 HttpSession 對象用于存儲用戶會話數(shù)據(jù)

三、關(guān)鍵問題:中文亂碼解決

       前端提交中文參數(shù)時,易出現(xiàn)亂碼問題,解決方案是配置 Spring 字符編碼過濾器(需放在 web.xml 最前面,保證優(yōu)先執(zhí)行):

<!-- 中文亂碼過濾器 -->
<filter>
    <filter-name>characterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <!-- 強(qiáng)制響應(yīng)編碼(可選) -->
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern> <!-- 攔截所有請求 -->
</filter-mapping>

四、核心總結(jié)

綁定場景核心要求 / 格式適用場景
基本類型 + 字符串表單 name = 方法參數(shù)名單個簡單參數(shù)
簡單 JavaBean表單 name = JavaBean 屬性名多參數(shù)封裝
嵌套 JavaBean表單 name = 引用對象。屬性名實(shí)體包含引用類型
List 集合(嵌套 Bean)表單 name = 集合名 [索引]. 屬性名批量數(shù)據(jù)封裝
自定義類型轉(zhuǎn)換@DateTimeFormat 注解 或 實(shí)現(xiàn) Converter 接口特殊類型(如 String→Date)
原生 Servlet API方法參數(shù)聲明 API 類型(如 HttpServletRequest)需原生對象操作(請求頭、會話、手動參數(shù)處理)

五、注意事項(xiàng)

  1. 參數(shù)名大小寫敏感:表單 name 與綁定目標(biāo)名稱必須完全一致(如 UserName ≠ username);
  2. 基本類型非空:綁定 int 等基本類型時,前端需傳值(否則報空指針),建議用 Integer 包裝類;
  3. 轉(zhuǎn)換器優(yōu)先級:自定義 Converter 優(yōu)先級高于 @DateTimeFormat 注解;
  4. 亂碼過濾器順序:必須放在 web.xml 所有過濾器最前面,否則可能失效。

       通過本文的講解,相信你已掌握 SpringMVC 請求參數(shù)綁定的核心場景與解決方案。在實(shí)際開發(fā)中,可根據(jù)參數(shù)復(fù)雜度選擇合適的綁定方式,兼顧開發(fā)效率與代碼可讀性。

到此這篇關(guān)于SpringMVC 請求參數(shù)綁定全解析的文章就介紹到這了,更多相關(guān)SpringMVC 請求參數(shù)綁定內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot整合SpringSecurity和JWT和Redis實(shí)現(xiàn)統(tǒng)一鑒權(quán)認(rèn)證

    SpringBoot整合SpringSecurity和JWT和Redis實(shí)現(xiàn)統(tǒng)一鑒權(quán)認(rèn)證

    Spring Security是一個可以為Java應(yīng)用程序提供全面安全服務(wù)的框架,同時它也可以輕松擴(kuò)展以滿足自定義需求,本文主要介紹了SpringBoot整合SpringSecurity和JWT和Redis實(shí)現(xiàn)統(tǒng)一鑒權(quán)認(rèn)證,感興趣的可以了解一下
    2023-11-11
  • Java 信息摘要加密MD2、MD4、MD5實(shí)現(xiàn)詳解

    Java 信息摘要加密MD2、MD4、MD5實(shí)現(xiàn)詳解

    這篇文章主要介紹了Java 信息摘要加密MD2、MD4、MD5實(shí)現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07
  • Java?Web?Axios實(shí)現(xiàn)前后端數(shù)據(jù)異步交互實(shí)例代碼

    Java?Web?Axios實(shí)現(xiàn)前后端數(shù)據(jù)異步交互實(shí)例代碼

    Axios作為一個流行的前端?HTTP?通信庫,可以極大地簡化前端與后端之間的數(shù)據(jù)交互,這篇文章主要介紹了Java?Web?Axios實(shí)現(xiàn)前后端數(shù)據(jù)異步交互的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-09-09
  • Spring詳細(xì)講解FactoryBean接口的使用

    Spring詳細(xì)講解FactoryBean接口的使用

    這篇文章主要為大家介紹了Spring容器FactoryBean工廠實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • java jdbc連接mysql數(shù)據(jù)庫實(shí)現(xiàn)增刪改查操作

    java jdbc連接mysql數(shù)據(jù)庫實(shí)現(xiàn)增刪改查操作

    這篇文章主要為大家詳細(xì)介紹了java jdbc連接mysql數(shù)據(jù)庫實(shí)現(xiàn)增刪改查操作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-07-07
  • JPA-JpaRepository方法命名語法說明

    JPA-JpaRepository方法命名語法說明

    這篇文章主要介紹了JPA-JpaRepository方法命名語法說明,具有很好的參考價值。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • SpringBoot整合Redis管道的示例代碼

    SpringBoot整合Redis管道的示例代碼

    本文將結(jié)合實(shí)例代碼,介紹SpringBoot整合Redis管道,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • 利用Java實(shí)現(xiàn)圖片馬賽克效果

    利用Java實(shí)現(xiàn)圖片馬賽克效果

    馬賽克效果是一種常見的圖像處理技術(shù),通過將圖像劃分為多個小塊并對每個小塊進(jìn)行平均色處理,模擬馬賽克的效果,在本項(xiàng)目中,我們將使用Java的Swing庫和圖像處理技術(shù)來實(shí)現(xiàn)圖片的馬賽克特效,需要的朋友可以參考下
    2025-02-02
  • 引入SpringCloud-gateway報錯的解決方案

    引入SpringCloud-gateway報錯的解決方案

    這篇文章主要介紹了引入SpringCloud-gateway報錯的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java編程實(shí)現(xiàn)基于TCP協(xié)議的Socket聊天室示例

    Java編程實(shí)現(xiàn)基于TCP協(xié)議的Socket聊天室示例

    這篇文章主要介紹了Java編程實(shí)現(xiàn)基于TCP協(xié)議的Socket聊天室,結(jié)合實(shí)例形式詳細(xì)分析了java基于TCP協(xié)議的Socket聊天室客戶端與服務(wù)器端相關(guān)實(shí)現(xiàn)與使用技巧,需要的朋友可以參考下
    2018-01-01

最新評論

瓦房店市| 五家渠市| 措美县| 广宗县| 施秉县| 青岛市| 镇原县| 简阳市| 民权县| 抚顺县| 梁山县| 会泽县| 海晏县| 巨野县| 凉城县| 安吉县| 海口市| 宁明县| 新巴尔虎左旗| 卢湾区| 玉门市| 建阳市| 修水县| 张家港市| 成安县| 永清县| 弥渡县| 唐河县| 且末县| 平顺县| 获嘉县| 松阳县| 广饶县| 昆明市| 多伦县| 洪湖市| 高阳县| 赣榆县| 泰来县| 华安县| 怀来县|