使用jstl访问类属性

时间:2014-07-09 13:05:41

标签: java spring jsp jstl

在我的spring项目中,我的视图从控制器接收一个这样的Map对象:

Map<String, List<?>>

我以这种方式访问​​我的jsp代码:

                <c:forEach var="field" items="${values[item]}">
                    <c:out value="${field}"/> <br/>
                </c:forEach>

考虑到?指示的类是常规POJO类,我如何在jsp中访问此类的属性?换句话说,我应该用什么正确的指令代替:

                    <c:out value="${field}"/> <br/>

因为有了这个,当我在浏览器中打开页面时,我会得到类似的内容:

com.spring.loja.model.categoria.persistence.model.Categoria@41c0e228

更新

我尝试使用此主题,按照本主题中的回答:

<c:out value="${field.name}"/>

但我想知道是否有办法使用这种方法:

@Override
protected String getArgument(int ordem) {
    switch(ordem) {
     case 0: return "Id";
     case 1: return "Login";
     case 2: return "Senha";
     case 3: return "Nome";
     case 4: return "Sobrenome";
     case 5: return "E-Mail";
     case 6: return "Autorizacao";
     default: return null;
     }
}

这种方式可以避免使用getter方法的名称(它是一个通用的jsp页面,由多个视图使用,我不知道将使用哪种方法)

4 个答案:

答案 0 :(得分:3)

如果此POJO有一个示例getName() getter,那么您可以使用以下方式访问name字段:

<c:out value="${field.name}"/>

如果您使用Servlet +3.0版本,则可以从EL调用方法。然后你可以尝试这样的事情:

<c:out value="${field[field.getArgument(2)]}"/>

答案 1 :(得分:1)

如果您使用的是EL 2.2,那么您可以使用

<c:out value="${field.getArgument(1)}"/>

有关详情,请参阅this SO回答

答案 2 :(得分:1)

您可以尝试:

    <c:forEach var="myObj" items="${values[item]}">
        <c:if test="${not empty myObj.class.declaredFields}">
            <c:forEach var="field" items="${myObj.class.declaredFields}">
                <!--To catch NoSuchFieldException,SecurityException-->
                <c:catch>Field Name:${field.name} - Field Value:${myObj[field.name]}</c:catch>          
            </c:forEach>
        </c:if>
    </c:forEach>

Java相当于:

    if(myObj.getClass().getDeclaredFields() != null){
        for(Field field : myObj.getClass().getDeclaredFields()){
            System.out.println("Field Name:"+field.getName());
            System.out.println("Field value:"+field.get(object));
        }
    }

只要MyObj具有简单的数据类型作为字段,这将显示正常。如果它有一个List myList,它将显示为:myList [str1,str2]。

答案 3 :(得分:0)

我最终如何解决这个问题:

我在服务类中添加了这两个方法:

public Map<String, List<String>> getListaAtributos() {
...
}
public Map<String, List<?>> getListaValores() {
...
}

这两个方法的关键是它来自我的类​​的属性,并且与它们相关联的值是:null,如果atribute具有基本类型,或者第一个类的属性列表,以及存储在该实体的数据库中的值列表。

我将此地图传递给我的观点并使用这种方式:

<c:forEach var="atributo" items="${map[item]}">
...
    <form:label path="${item}.${atributo}" class="form-control">${atributo}</form:label>
    <form:input path="${item}.${atributo}" class="form-control"/>
...
</c:forEach>