需求:User 对象有 name_1,name_2,name_3,name_4,name_5 ...... n个这样的属性,想在JSP页面中通过 JSTL 对 User 对象进行遍历取值,写过
[java] view plain copy
- <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 对象(注意:只能是JavaBean对象)转换成 Map 。
- //用到的JAR包(版本号自己控制)
- commons-beanutils-1.9.3.jar
- commons-logging-1.2.jar
也可以通过别的方式进行处理:https://www.cnblogs.com/dreammyle/p/5610906.html
二、然后,在 JSP 页面进行拼接属性名
- //这两种拼接方式都是错误的,因为EL表达式是没有自动类型转换的
- //报这种错:<span style="color:#ff0000;">javax.el.ELException: Cannot coerce 'i' to class java.lang.Long</span>
- <c:forEach var="i" begin="1" end="100">
- ${userMap[val+'i'] },
- ${userMap[val'i'] }
- </c:forEach>
- //<span style="color:#ff0000;">正确的拼接方式,通过使用 </span><span style="color:#3333ff;">c:set</span><span style="color:#ff0000;"> 标签实现。</span>
- <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>