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框就可以辦到了
<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"/>
后台獲取
public void getParmas(List<String> titleName)
或者
public void getParmas(String[] titleName)
都可以獲取到titleName的值。
這里String不是8大基礎類型,但是String和基礎類型有個共同的特點,就是賦值的時候不需要特別指名成員變量,包括基礎類型的封裝類一樣。
三、賦值的時候不需要特別指名成員變量引用類型的集合參數
這些類基本上都是我們自己組建的業務邏輯類,很多情況下還包含了相互組合的關系,先說第一種情況,單純的接收一個List<?> xxx;
@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方法,但是沒有名字呀,只能根據數組下標來判斷參數位置。所以只能通過第二種方法進行參數傳遞