在使用jstl tag <c:forEach var="item" items="${managerPurviewList}" begin="0"> 的時候,一般可以用來在頁面上展現集合的數據,但是有一點必須要注意的,就是var 和items的含義的問題。
查看api文檔,上面只是簡單的說明了一下,其實在實現該標簽的時候,內部是通過items里面指定的這個集合對象來獲取一個Iterator 的,這就是ForEachIterator 。也就是說先把你的items屬性的那個集合對象拿出來,然后獲取其上面的迭代器,通過該迭代器的next方法得到集合中的第一個元素(當然根據是否配置了start end 和step迭代的方法少有不同),這里就要注意了,獲取到第一個元素以后,它會將該元素作為一個通用的object對象賦值給var屬性里面指定的那個變量名稱,例如你在var屬性里面知道var="item",那么這時候i就是一個object對象。
如果你迭代的是一個list<User>這樣的自定義對象的list,那么這時候item會得到一個object,而且該object是一個object【】類型,也就是說,會將list里面的每個user對象的屬性值get出來,作為一個object再存放到i所引用的那個object里面去,說到這里,大家就應該明白了,其實該標簽在處理list<User>類型的集合的展現問題的時候,是簡單的將該集合中的每個具體對象的屬性值取出來封裝成一個個的object,然后放入item這個object數組中去的,所以,我們在前台jsp頁面上展現的時候不能使用$(item.userName)這樣的方法來得到對應的值,否則會報java.lang.NumberFormatException: For input string: "userName" 這樣的異常的,原因就是因為返回的item是一個object的數組,$(item.userName)這種訪問方式是不能用來訪問數組的,否則在處理的時候jsp引擎會先將userName這個字符串轉換成int以確定數組下標,而在轉換的時候就會出現字符串“userName”無法轉換成int的異常了。
那么我們該怎么取值呢,應該是一下標來訪問數組,也就是item【0】,item【1】,這樣的方式,這樣渠道的值分別是我們User對象的按照定義先后順序的各個屬性值了。
可見,數據類型是很重要的了,使用不同的數據類型來保存值,那么取值的時候就要使用對應的方法來取值了,否則就會報異常了。
