View all fields / properties of bean in JSP / JSTL
我有一颗豆子,
是否可以使用 JSTL/EL 在 JSP 中动态打印出这些属性的所有名称和值?
类似:
1 2 3 | <c:forEach items="${product}" var="p"> ${p.key} - ${p.value} </c:forEach> |
用bean替换对象来
1 | <c:set var="object" value="${product}" /> |
显示所有声明的字段及其值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <c:if test="${not empty object['class'].declaredFields}"> Declared fields ${object.name} <ul> <c:forEach var="field" items="${object['class'].declaredFields}"> <c:catch> <li> <span style="font-weight: bold"> ${field.name}: </span>${object[field.name]} </li> </c:catch> </c:forEach> </ul> </c:if> |
显示所有声明的方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <c:if test="${not empty object['class'].declaredMethods}"> Declared methods<% object.getName() %> <ul> <c:forEach var="method" items="${object['class'].declaredMethods}"> <c:catch> <li> ${method.name} </li> </c:catch> </c:forEach> </ul> </c:if> |
准备使用@Toby\\'s answer的版本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | <p class="TODO <your name> PRINT OBJECT PROPERTIES"> <c:set var="object" value="${<your object here>}" /> Object: ${object.class} Declared fields <c:if test="${!empty object.class.declaredFields}"> <ul> <c:forEach var="attr" items="${object.class.declaredFields}"> <c:catch> <li> ${attr.name}: ${object[attr.name]} </li> </c:catch> </c:forEach> </ul> </c:if> <c:if test="${empty object.class.declaredFields}">No declared fields</c:if> Declared methods <c:if test="${!empty object.class.declaredMethods}"> <ul> <c:forEach var="attr" items="${object.class.declaredMethods}"> <c:catch> <li> ${attr.name}(...) </li> </c:catch> </c:forEach> </ul> </c:if> <c:if test="${empty object.class.declaredMethods}">No declared methods</c:if> </p> |
没有什么叫做 JSTL 对象的。 JSTL 只是提供了一种以更清晰、更易读的方式访问 JSP 中的 java 对象的方法(另一种方式是脚本)。只需在你的java对象中实现toString(这里是关于toString方法的简要链接http://www.javatpoint.com/understanding-toString()-method)在你的java对象中实现,现在是
1)如果您的问题是如何在 java
中打印对象属性
1 | System.out.println(product) |
2)在JSP中打印
1 | ${product} |
这是您的案例的 toString 方法
1 2 3 | public String toString(){ return price + name; } |
你想做的事情基本上是没有意义的,因为你必须事先知道对象是什么,它的领域是什么。如果由于某种原因你仍然想继续,你可以有一个方法来返回你想要的:
1 2 3 4 | public Map<String, Object> getProperties() { //create your map and populate it via plain strings-getters for fields //or use Java Reflection API } |
使用这种方法,您的地图可以通过
访问
1 | ${bean.properties} |