迭代将列表作为值并且获取属性的hashmap不存在

时间:2014-05-19 15:47:11

标签: java jsp jstl

我有一个LinkedHashMap,如下所示 -

LinkedHashMap<String, ArrayList<MSCategoryDetailsBO>> categoryMap =
                new LinkedHashMap<String, ArrayList<MSCategoryDetailsBO>>();
  

MSCategoryDe​​tailsBO类似于categoryIsSelected,   类别名称..

当我尝试使用JSTL在JSP上迭代此映射时,如下所示 -

<c:forEach items="${CategoryMap}" var="item1" varStatus="status">
    <c:set var="categoryList" value="${item1.value}" />
    <c:forEach items="${categoryList}" var="item2" varStatus="status"
                            begin="0" end="9">
        <c:if test="${(item2.categoryIsSelected eq false) || 
                                             (empty item2.categoryIsSelected)}">
            ${item2.categoryName}
        </c:if>
    </c:forEach>
</c:forEach>

但我正在

  

E /MSGenericJSPPageError.jsp - Property&#39; categoryIsSelected&#39;不   在类型java.util.LinkedHashMap $ LinkedHashMapEntry上找到                                    javax.el.PropertyNotFoundException:Property&#39; categoryIsSelected&#39;在类型上找不到   java.util.LinkedHashMap $ LinkedHashMapEntry at   javax.el.BeanELResolver $ BeanProperties.get(BeanELResolver.java:200)     在   javax.el.BeanELResolver $ $ BeanProperties.access 400(BeanELResolver.java:177)

3 个答案:

答案 0 :(得分:0)

当您遍历Map时,您将获得Map.Entry对象(您可以在堆栈跟踪中看到它正在 java.util.LinkedHashMap $ LinkedHashMapEntry上查找您的属性 object)。您可以使用&#39; type&#39;来访问密钥。以及&#39;值&#39;。

的值

因此,对于您的代码,可以尝试 item2.value.categoryIsSelected

另见this question

答案 1 :(得分:0)

  

确保MSCategoryDetailsBO 公共类,并为JSP中所需的所有属性/成员包含有效的 getter / setter

     

JSTL使用反射,以便您可以通过点表示法访问对象的属性,如果它们遵循 JavaBean命名约定


从Exception本身可以清楚地看出,您尝试访问的属性没有匹配的getter方法。

PropertyNotFoundException: Property 'categoryIsSelected' not found on type

班级MSCategoryDetailsBO应如下所示:

public class MSCategoryDetailsBO {
    private boolean categoryIsSelected;
    private String categoryName;

    public void setCategoryIsSelected(boolean categoryIsSelected) {
        this.categoryIsSelected = categoryIsSelected;
    }

    public void setCategoryName(String categoryName) {
        this.categoryName = categoryName;
    }

    public boolean getCategoryIsSelected() {
        return this.categoryIsSelected;
    }

    public String getCategoryName() {
        return this.categoryName;
    }
}

请再次验证以下条件,表示您希望categoryName显示categoryIsSelected为假或空。

<c:if test="${(item2.categoryIsSelected eq false) || (empty item2.categoryIsSelected)}">
      ${item2.categoryName}
</c:if>

答案 2 :(得分:0)

确保MSCategoryDe​​tailsBO类具有字段的setter和getter:categoryIsSelected,categoryName。 为什么要在第二个forEach循环中放置开始和结束,你确定你的列表大小是10之前的吗?您可以使用varStatus字段获取项目编号:index(从零开始)和count(从1开始)。此外,您不必将arrayList设置为单独的变量。

    <c:forEach items="${CategoryMap}" var="item1" varStatus="status1">
        <c:forEach items="${item1.value}" var="item2" varStatus="status2">
            <c:if test="${(item2.categoryIsSelected eq false) || (empty item2.categoryIsSelected)}">
                ${item2.categoryName}
            </c:if>
        </c:forEach>
    </c:forEach>