在 JSP/JSTL 中查看 bean 的所有字段/属性

View all fields / properties of bean in JSP / JSTL

我有一颗豆子,${product}。我想查看此 bean 的所有可用字段/属性。例如,${product.price}${product.name}${product.attributes.colour} 等等。

是否可以使用 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 &dollar;{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}