spring mvc 如何傳遞集合引數(list,陣列)
spring mvc 可以自動的幫你封裝引數成為物件,不用自己手動的通過request一個一個的獲取引數,但是這樣自動的引數封裝碰碰到了集合引數可能就需要點小技巧才可以了。
一、基礎型別和引用型別有什麼區別?
基礎型別是直接儲存在堆疊上面的,引用型別(物件)值儲存在堆上面,地址儲存在棧上面的,基礎型別都有非null的預設值,比如int預設是0,boolean預設是false,引用型別除非是用new開闢出新的空間,否則只有地址資訊沒有值資訊。int 和 integer的區別不僅是有沒有預設值的問題,Integer還有自己的成員變數,雖然都是靜態的,比如Integer.MAX_VALUE就是其中一個,而Integer的值都是儲存在一個地址不變的成員變數value。
二、基礎型別、賦值的時候不需要特別指名成員變數(String,基礎型別的封裝類)的引用型別集合引數
說了那麼多基礎型別和引用型別區別,最主要的一點就是基礎型別是沒有成員變數的,基礎型別可以直接是a=x,而引用型別的值大多需要a.b=x才可以得到,那麼獲取基礎型別的集合引數是最容易的,比如你有個方法是需要獲取一個int的陣列或者list列表,直接在頁面上通過同名的input框就可以辦到了
1 2 3 |
< input type="text" value="" name="titleName" id="add_titleName"/>
< input type="text" value="" name="titleName" id="add_titleName"/> < input type="text" value="" name="titleName" id="add_titleName"/>
|
後臺獲取
1 |
public void getParmas(List< String > titleName)
|
或者
1 |
public void getParmas(String[] titleName)
|
都可以獲取到titleName的值。
這裡String不是8大基礎型別,但是String和基礎型別有個共同的特點,就是賦值的時候不需要特別指名成員變數,包括基礎型別的封裝類一樣。
三、賦值的時候不需要特別指名成員變數引用型別的集合引數
這些類基本上都是我們自己組建的業務邏輯類,很多情況下還包含了相互組合的關係,先說第一種情況,單純的接收一個List<?> xxx;
1 2 3 4 |
@RequestMapping ( "/add" )
public void add(Model model,List<SysRole> sysRole){
。。。。
}
|
這樣的方式是不行的,會報Could not instantiate bean class [java.util.List]: Specified class is an interface這個異常。
Servlet.service() for servlet [springServlet] in context with path [/bid] threw exception [Request processing failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [java.util.List]: Specified class is an interface] with root cause org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [java.util.List]: Specified class is an interface
怎麼解決了?
需要我們用到第二種情況。
接收一個帶有list成員變數的的物件,比如你有個類是User,一個User可以有多個聯絡電話,
class User{ List<Contact> contactList; }
我們要獲取一個帶有多個聯絡人的user引數
public void addUser(User user){ ..... }
在頁面上直接可以通過
<input type="text" value="" name="user.contactList[0].phone" id="add_contact_phone_1"/>
這樣的方式進行獲取引數。
那我們碰到第一種情況怎麼辦呢?把它變成第二種方式進行處理,也就是說新建一個包裝類專門來包裝類似的需要接收的list引數。
為什麼第一種方式不行了?
因為spring mvc 中獲取引數的方式不管有多少種,他的本質依然是
request.getParameter("name")
那把這個引數封裝到一個物件中,也只能是同setter方法,那問題的關鍵是如何找到這個setter
方法?肯定是setName中的name和request中的name對應。這才能找到。你想,如果你單純接收一個list引數,list雖然有get和set方法,但是沒有名字呀,只能根據陣列下標來判斷引數位置。所以只能通過第二種方法進行引數傳遞