【问题标题】:Access to class attributes with jstl使用 jstl 访问类属性
【发布时间】:2014-07-09 13:05:40
【问题描述】:

在我的 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页面,被多个视图使用,不知道会使用哪个方法)

【问题讨论】:

  • &lt;c:out value="${field}"/&gt; 隐式调用toString()。您希望看到什么?
  • @geo 并在下面查看答案和我的评论,以了解有关我想要做什么的更多详细信息。
  • Java 中不存在方法排序之类的东西。我建议你让你的所有模型对象实现一个特定的接口,该接口有一个方法可以返回你想要的数据
  • @geo 是的,我有。请参阅我的更新,其中包含返回我想要使用的数据的方法。

标签: java spring jsp jstl


【解决方案1】:

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

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

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

&lt;c:out value="${field[field.getArgument(2)]}"/&gt;

【讨论】:

  • 好的,这可行,但我想知道是否有一种方法可以不使用getter方法的名称,而是使用方法的“位置”(0=Id等)。我的每个类中都有一个方法,它是一个抽象方法的实现,返回给定这个位置的方法的名称。这可能吗?
【解决方案2】:

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

&lt;c:out value="${field.getArgument(1)}"/&gt;

更多详情请参考thisSO答案

【讨论】:

    【解决方案3】:

    你可以试试:

        <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]。

    【讨论】:

      【解决方案4】:

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

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

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

      这两种方法的关键是我的类的属性,与它们关联的值是:null,如果属性具有原始类型,或者第一个类的属性列表,以及值存储在此实体的数据库中。

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

      <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>
      

      【讨论】:

        猜你喜欢
        • 2015-07-15
        • 1970-01-01
        • 1970-01-01
        • 2022-11-06
        • 1970-01-01
        • 2015-08-18
        • 1970-01-01
        相关资源
        最近更新 更多