需求:User 对象有 name_1,name_2,name_3,name_4,name_5 ...... n个这样的属性,想在JSP页面中通过 JSTL 对 User 对象进行遍历取值,写过
<c:forEach var="i" begin="1" end="100">
${user.name_ + i } ${user.name_i }
</c:forEach>
等几种方式都是错误的。最后查找各种资料,才解决问题,同时发现好多朋友也碰到过类似问题,特记录下!
直接在 JSP 通过 JSTL 进行拼接属性名,是行不通的。而 Map 的 Key 可以进行拼接。那么灵感来了。
思路:
一、首先,在后台把 User 对象转换成一个 Map
Map<?, ?> map = new BeanMap(user);
request.setAttribute("userMap", map);
我这里通过 BeanUtils 工具包把 JavaBean 对象(注意:只能是JavaBenan对象)转换成 Map 。
//用到的JAR包(版本号自己控制)
commons-beanutils-1.9.3.jar
commons-logging-1.2.jar
也可以通过别的方式进行处理:https://www.cnblogs.com/dreammyle/p/5610906.html
二、然后,在 JSP 页面进行拼接属性名
//这两种拼接方式都是错误的,因为EL表达式是没有自动类型转换的
//报这种错:javax.el.ELException: Cannot coerce 'i' to class java.lang.Long
<c:forEach var="i" begin="1" end="100">
${userMap[val+'i'] },
${userMap[val'i'] }
</c:forEach>
//正确的拼接方式,通过使用 c:set 标签实现。
<c:forEach var="i" begin="1" end="100">
<c:set var="num2"> name_<c:out value="${i }"></c:out> </c:set>
${uersMap[num2] }
</c:forEach>
EL表示式是不能直接使用函数,也不能使用嵌套的,否则会报错。
EL表达式取map的value,${map[key]},但是若key是动态获取的,你若想这样${map[${key}]} 获取value就会报错的:。
可以使用下面的方式:
<c:forEach begin="1" end="3" var="key" varStatus="vs">
<c:set var="longKey" value="${vs.index+0 }" />
<a href="#"> ${longKey} -- ${m[longKey]}</a>
</c:forEach>