Подтвердить что ты не робот

Просмотреть все поля/свойства bean в JSP/JSTL

У меня есть bean, ${product}. Я хотел бы просмотреть все доступные поля/свойства этого bean. Так, например, ${product.price}, ${product.name}, ${product.attributes.colour} и т.д.

Можно ли динамически распечатывать все имена и значения этих свойств в JSP, используя JSTL/EL?

Что-то вроде:

<c:forEach items="${product}" var="p">  
    ${p.key} - ${p.value}
</c:forEach>
4b9b3361

Ответ 1

Замените объект на bean, чтобы определить.

<c:set var="object" value="${product}" />

Отобразить все объявленные поля и их значения.

<c:if test="${not empty object['class'].declaredFields}">
    <h2>Declared fields <em>&dollar;{object.name}</em></h2>
    <ul>
        <c:forEach var="field" items="${object['class'].declaredFields}">
            <c:catch><li><span>${field.name}</span>${object[field.name]}</li></c:catch>
        </c:forEach>
    </ul>
</c:if>

Показать все объявленные методы.

<c:if test="${not empty object['class'].declaredMethods}">
    <h2>Declared methods<em>&lt;% object.getName() %&gt;</em></h2>
    <ul>
        <c:forEach var="method" items="${object['class'].declaredMethods}">
            <c:catch><li>${method.name}</li></c:catch>
        </c:forEach>
    </ul>
</c:if>

Ответ 2

Готов к использованию версии ответа @Toby

<p class="TODO <your name> PRINT OBJECT PROPERTIES">
    <c:set var="object" value="${<your object here>}" />
    <h2><b>Object:&nbsp; ${object.class} </b></h2>
    <h3><b>Declared fields</b></h3>
    <c:if test="${!empty object.class.declaredFields}">
        <ul>
            <c:forEach var="attr" items="${object.class.declaredFields}">
                <c:catch><li><b>${attr.name}</b>:&nbsp; ${object[attr.name]}</li></c:catch>
            </c:forEach>
        </ul>
    </c:if>
    <c:if test="${empty object.class.declaredFields}">No declared fields</c:if>
    <h3><b>Declared methods</b></h3>
    <c:if test="${!empty object.class.declaredMethods}">
        <ul>
            <c:forEach var="attr" items="${object.class.declaredMethods}">
                <c:catch><li><b>${attr.name}</b>(...)</li></c:catch>
            </c:forEach>
        </ul>
    </c:if>
    <c:if test="${empty object.class.declaredMethods}">No declared methods</c:if>
</p>

Ответ 3

Ничего не называется JSTL Object. JSTL просто обеспечивает доступ к java-объектам в JSP более чистым и читабельным способом (иначе это scriplet). Просто реализуйте toString (здесь ссылка, содержащая краткую информацию о методе toString http://www.javatpoint.com/understanding-toString()-method) в вашем Java-объекте в этом случае, а теперь

1) Если ваш вопрос заключается в том, как напечатать свойства объекта в java

System.out.println(product)

2) Чтобы распечатать его в JSP

 ${product}

Вот метод toString для вашего случая

public String toString(){
return price + name;
}

Ответ 4

То, что вы хотите сделать, в основном лишено смысла, поскольку вы должны знать заранее, что такое объект и каковы его поля. Если по какой-то причине вы все еще хотите продолжить, вы можете получить метод, который возвращает то, что вы хотите:

public Map<String, Object> getProperties() {
    //create your map and populate it via plain strings-getters for fields
    //or use Java Reflection API
}

С помощью этого метода ваша карта будет доступна с помощью

${bean.properties}