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

SpringMVC中參數(shù)綁定問題實例詳解

 更新時間:2022年04月06日 11:44:56   作者:武哥聊編程  
springmvc是用來處理頁面的一些請求,然后將數(shù)據(jù)再通過視圖返回給用戶的,下面這篇文章主要給大家介紹了關(guān)于SpringMVC中參數(shù)綁定問題的相關(guān)資料,需要的朋友可以參考下

前言

眾所周知,springmvc是用來處理頁面的一些請求,然后將數(shù)據(jù)再通過視圖返回給用戶的,前面的幾篇博文中使用的都是靜態(tài)數(shù)據(jù),為了能快速入門springmvc,在這一篇博文中,我將總結(jié)一下springmvc中如何接收前臺頁面的參數(shù),即springmvc中的參數(shù)綁定問題。

1. 參數(shù)綁定的過程

我們可以回憶一下,在struts2中,是通過在Action中定義一個成員變量來接收前臺傳進(jìn)來的參數(shù),而在springmvc中,接收頁面提交的數(shù)據(jù)是通過方法形參來接收的。從客戶端請求的key/value數(shù)據(jù),經(jīng)過參數(shù)綁定,將key/value數(shù)據(jù)綁定到controller方法的形參上,然后就可以在controller中使用該參數(shù)了。來看一下這個過程:

參數(shù)綁定

所以我們知道,是springmvc提供了很多轉(zhuǎn)換器來將頁面參數(shù)綁定到controller方法的形參上,關(guān)于自定義converter,我下面會提到。大概了解了該過程后,下面開始做具體的總結(jié)。

2. 默認(rèn)支持的類型

springmvc中,有支持的默認(rèn)類型的綁定。也就是說,直接在controller方法形參上定義默認(rèn)類型的對象,就可以使用這些對象。

HttpServletRequest對象HttpServletResponse對象HttpSession對象Model/ModelMap對象

在參數(shù)綁定過程中,如果遇到上面類型就直接進(jìn)行綁定。也就是說,我們可以在controller的方法的形參中直接定義上面這些類型的參數(shù),springmvc會自動綁定。這里要說明一下的就是Model/ModelMap對象,Model是一個接口,ModelMap是一個接口實現(xiàn) ,作用是將Model數(shù)據(jù)填充到request域,跟ModelAndView類似,關(guān)于它的使用,我在下面和簡單類型參數(shù)綁定一起說。

3. 簡單類型的綁定

總結(jié)這個還是以需求為例吧,這樣比較容易理解,假設(shè)現(xiàn)在有個需求:根據(jù)商品的id來修改對應(yīng)點商品信息。所以前臺頁面肯定要傳進(jìn)來該商品的id,然后springmvc的controller進(jìn)行處理,返回一個修改商品信息的頁面。關(guān)于前臺頁面的東西都很簡單,我就不貼代碼了,主要部分截個圖,具體的代碼在文章最后有下載地址。

前臺頁面通過url將參數(shù)傳遞過來,請求的是editItems.action。

簡單類型

下面寫controller中的editItems方法:

@RequestMapping("/editItems")
public String editItems(Model model, Integer id) throws Exception {
    //根據(jù)id查詢對應(yīng)的Items
    ItemsCustom itemsCustom = itemsService.findItemsById(id);

    model.addAttribute("itemsCustom", itemsCustom);

    //通過形參中的model將model數(shù)據(jù)傳到頁面
    //相當(dāng)于modelAndView.addObject方法
    return "/WEB-INF/jsp/items/editItems.jsp";
}

這是個很簡單的demo,從上面的代碼中可以看出model可以直接作為參數(shù),springmvc默認(rèn)會綁定它,然后使用model將查詢到的數(shù)據(jù)放到request域中,這樣就可以在前臺頁面取出該數(shù)據(jù)了。

要注意一點的是,簡單類型的綁定中,方法形參中的參數(shù)名要和前臺傳進(jìn)來的名一樣才能完成參數(shù)的綁定。那有人要問了,如果有特殊需求(比如更好的可讀性?),這里定義的參數(shù)名就是不一樣,那咋整呢?有解決辦法么?有!我們可以使用注解@RequestParam對簡單的類型進(jìn)行參數(shù)綁定,如下:

requestParam注解

所以說,如果不使用@RequestParam,要求request傳入?yún)?shù)名稱和controller方法的形參名稱一致,方可綁定成功。如果使用@RequestParam,不用限制request傳入?yún)?shù)名稱和controller方法的形參名稱一致。通過@RequestParam中的required屬性指定參數(shù)是否必須要傳入,如果設(shè)置為true,沒有傳入?yún)?shù)就會報錯。

4. pojo類型的綁定

4.1 普通pojo類型

再來總結(jié)下pojo類型的綁定,繼續(xù)上面的案例,當(dāng)頁面展示了商品詳細(xì)信息后,我做了修改,然后點擊提交,后臺應(yīng)該將我提交的這些參數(shù)全部更新到數(shù)據(jù)庫的items表中,也就是說,我提交的這些參數(shù)要綁定到Items對象或者其擴(kuò)展對象中。先看一下Items中都有哪些屬性:

屬性

可以看到,有各種類型的屬性,當(dāng)我們提交后,要將這些屬性全部封裝到一個pojo中,然后去更新數(shù)據(jù)庫。

綁定很簡單,對于基本類型,要求頁面中input標(biāo)簽的name屬性值和controller的pojo形參中的屬性名稱一致,即可將頁面中數(shù)據(jù)綁定到pojo。也就是說前臺頁面?zhèn)鬟M(jìn)來的name要和要封裝的pojo屬性名一模一樣,然后就可以將該pojo作為形參放到controller的方法中,如下:

pojo類型

這樣就能將前臺表單傳進(jìn)來的不同屬性值封裝到ItemsCustom中了。但是運行一下就會發(fā)現(xiàn)報錯,報錯的信息是無法將String類型轉(zhuǎn)換成java.util.Date類型,因為上面Items中有一個屬性是Date類型的createtime。這就需要我們自己定義轉(zhuǎn)換器了,這也是這部分的重點,下面我們自己定義一個日期轉(zhuǎn)換器:

//需要實現(xiàn)Converter接口,這里是將String類型轉(zhuǎn)換成Date類型
public class CustomDateConverter implements Converter<String, Date> {

    @Override
    public Date convert(String source) {
        //實現(xiàn) 將日期串轉(zhuǎn)成日期類型(格式是yyyy-MM-dd HH:mm:ss)
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        try {
            //轉(zhuǎn)成直接返回
            return simpleDateFormat.parse(source);
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //如果參數(shù)綁定失敗返回null
        return null;

    }
}

定義好了轉(zhuǎn)換器后,需要在springmvc.xml中進(jìn)行如下配置:

轉(zhuǎn)換器

轉(zhuǎn)換器配置

現(xiàn)在就可以了,springmvc就能根據(jù)這個轉(zhuǎn)換器將String類型正確轉(zhuǎn)換成Date類型,然后封裝到ItemsCustom中去了。

這里說一個小小的插曲:修改商品詳細(xì)信息后提交,可能會有中文亂碼問題,表達(dá)提交都是post方式,springmvc中關(guān)于post方式的中文亂碼問題可以在web.xml中配置一個過濾器來解決,如下:

post亂碼解決

4.2. 包裝的pojo類型

這個包裝類型pojo與上面普通的pojo有啥區(qū)別呢?包裝類型pojo指的是pojo中有另一個也是pojo的屬性,即pojo套pojo,為什么會設(shè)計這種pojo呢?在前面的博文中我也有提到,這種組合的設(shè)計方法對于后期程序的擴(kuò)展很有用,比如復(fù)雜的查詢條件就需要包裝到這種包裝類型中。

那么該如何綁定呢?有兩個思路:

在形參中添加HttpServletRequest request參數(shù),通過request接收查詢條件參數(shù)。在形參中讓包裝類型的pojo接收查詢條件參數(shù)。

第一種方式就跟原始servlet差不多,這里使用第二種方法,我們傳進(jìn)來一個包裝類型的pojo。看一下這個包裝類型的pojo:

包裝類型pojo

這個包裝pojo中還有一個ItemsCustom類,這個類繼承了Items類,并且用來擴(kuò)展與Items相關(guān)的User對象中的相關(guān)信息。所以這個ItemsCustom中有name屬性,假如我們要想將前臺傳進(jìn)來的name屬性封裝到ItemsCustom中的name屬性中,該如何傳入呢?這就是包裝類型的pojo參數(shù)綁定問題。

很簡單,在前臺我們可以通過這種方式來傳:

包裝pojo參數(shù)

然后controller中方法的形參傳入包裝類型的pojo,即ItemsQueryVo,打個斷點,即可查看值有沒有傳進(jìn)來。如下:

后臺接收

這樣就能根據(jù)用戶傳進(jìn)來的參數(shù),進(jìn)行復(fù)制的查詢操作了。

5. 集合類型的綁定

5.1 數(shù)組的綁定

數(shù)組的綁定指的是前臺傳來多個同一類型的數(shù)據(jù),我們在controller中使用數(shù)組形參來接收前臺傳來的數(shù)據(jù)。還是以案例來驅(qū)動這部分內(nèi)容,比如現(xiàn)在我們要批量刪除商品,那么我們需要勾選好幾個商品,這些商品都有id號,在controller中,我們需要將這些id號全部獲取并放到一個數(shù)組中,然后再根據(jù)數(shù)組中的id號挨個刪除數(shù)據(jù)庫中對應(yīng)的項。那么該如何綁定呢?其實也很簡單,如下:

controller的方法定義為:

數(shù)組

對應(yīng)前臺傳入的參數(shù)為:

前臺傳入id

這樣就能將前臺傳入的多個id綁定到數(shù)組中,然后我們就可以從數(shù)組中拿出要刪除的商品的id了。

5.2 List的綁定

通常在需要批量提交數(shù)據(jù)時,將提交的數(shù)據(jù)綁定到list<pojo>中,比如:成績錄入(錄入多門課成績,批量提交),在這里我們假設(shè)有需求:批量商品修改,在頁面輸入多個商品信息,將多個商品信息提交到controller方法中,即一次性更新多個商品信息。

所以思路是在擴(kuò)展類ItemsQueryVo中新添加一個List<ItemsCustom>,然后將不同商品的信息都存到這個List中,所以修改如下:

List

controller方法的定義:

1、進(jìn)入批量商品修改頁面
2、批量修改商品提交

所以controller中應(yīng)該有兩個方法,如下:

批量更新

前臺jsp頁面中是如何傳入?yún)?shù)的呢?這是我們所關(guān)心的問題,因為后臺形參中接收數(shù)據(jù)用的就是包裝類ItemsQueryVo。看下面:

傳參

所以我們知道了,前臺是通過類似于list[i].name這種形式來傳遞參數(shù)的。list[i]表示第i個ItemsCustom,然后 list[i].屬性 表示第i個ItemsCustom中對應(yīng)的屬性。

5.2 Map的綁定

Map的綁定其實和List的綁定是差不多的,首先也是在包裝的pojo中新添加一個Map類型的屬性,如(我隨便舉個例子,跟本例無關(guān)了)

Public class QueryVo {
private Map<String, Student> itemInfo = new HashMap<String, Student>();
  //get/set方法..
}

關(guān)鍵是前臺傳參的時候和List不太一樣,Map是這樣傳的,比如:

<tr>
    <td>學(xué)生信息:</td>
    <td>
        姓名:<input type="text" name="itemInfo['name']"/>
        年齡:<input type="text" name="itemInfo['price']"/>
    .. .. ..
    </td>
</tr>

我們可以看到,Map的參數(shù)綁定傳來的是Map中的key,然后value會自動綁定到Map中的那個對象的屬性中。在controller中的方法里,形參就直接使用QueryVo接收即可,也很簡單。

關(guān)于springmvc的參數(shù)綁定基本就總結(jié)到這了,其實原理都差不多,只是針對于不同的類型,綁定的方式有些區(qū)別而已,多想想多寫寫,基本就能掌握這些了。

學(xué)習(xí)筆記源碼下載地址:https://github.com/eson15/SpringMVC_Study

總結(jié)

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

相關(guān)文章

  • Java實現(xiàn)簡易五子棋小游戲

    Java實現(xiàn)簡易五子棋小游戲

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)簡易五子棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Spring HTTP緩存應(yīng)用場景舉例

    Spring HTTP緩存應(yīng)用場景舉例

    這篇文章詳細(xì)介紹了Spring Framework中HTTP緩存的基本概念和實現(xiàn)方式,包括Cache-Control頭、條件請求(ETag/Last-Modified)、CacheControl類的使用,以及在控制器和靜態(tài)資源中應(yīng)用HTTP緩存,本文結(jié)合實例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2025-11-11
  • Java那些鮮為人知的關(guān)鍵字volatile詳析

    Java那些鮮為人知的關(guān)鍵字volatile詳析

    這篇文章主要給大家介紹了關(guān)于Java那些鮮為人知的關(guān)鍵字volatile的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • SpringMVC接收頁面表單參數(shù)

    SpringMVC接收頁面表單參數(shù)

    本篇文章主要介紹了SpringMVC接收頁面表單參數(shù)的相關(guān)知識,具有很好的參考價值。下面跟著小編一起來看下吧
    2017-05-05
  • SpringMVC實現(xiàn)賬號只能在一處登陸

    SpringMVC實現(xiàn)賬號只能在一處登陸

    這篇文章主要為大家詳細(xì)介紹了SpringMVC如何實現(xiàn)賬號只能在一處登陸,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • java實現(xiàn)字符串反轉(zhuǎn)

    java實現(xiàn)字符串反轉(zhuǎn)

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)字符串反轉(zhuǎn),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Java Spring @Autowired的這些騷操作,你都知道嗎

    Java Spring @Autowired的這些騷操作,你都知道嗎

    這篇文章主要介紹了徹底搞明白Spring中的自動裝配和Autowired注解的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-09-09
  • SpringBoot實現(xiàn)HTTPS加密通信的詳細(xì)指南

    SpringBoot實現(xiàn)HTTPS加密通信的詳細(xì)指南

    這篇文章主要為大家詳細(xì)介紹了Spring?Boot中HTTPS的實現(xiàn)方案與實戰(zhàn)避坑指南,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-06-06
  • java非公平鎖知識點實例詳解

    java非公平鎖知識點實例詳解

    在本篇文章里小編給大家整理了一篇關(guān)于java非公平鎖知識點實例詳解,有興趣的朋友們可以學(xué)習(xí)參考下。
    2021-10-10
  • 新手必備的IDEA常用設(shè)置總結(jié)

    新手必備的IDEA常用設(shè)置總結(jié)

    今天給大家總結(jié)了一些IDEA的常用設(shè)置,文中有非常詳細(xì)的圖文介紹,對正在學(xué)習(xí)使用IDEA的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05

最新評論

南澳县| 阿拉善盟| 久治县| 宁武县| 理塘县| 嵊州市| 堆龙德庆县| 亚东县| 金溪县| 中牟县| 黔西县| 九寨沟县| 兴城市| 泰兴市| 龙口市| 迭部县| 静乐县| 新营市| 巴彦县| 丰镇市| 收藏| 肥东县| 雷州市| 唐河县| 会同县| 铜陵市| 涿州市| 屏山县| 鄂尔多斯市| 丘北县| 黑龙江省| 车致| 林州市| 天祝| 桓台县| 客服| 南城县| 孟连| 绥中县| 宜章县| 云南省|