迭代将列表作为值并获取属性的哈希映射不存在



我有一个LinkedHashMap,如下所示-

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

MSCategoryDetailsBO有类似categoryIsSelected的属性,categoryName . .

当我尝试使用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 -属性'categoryIsSelected'没有发现类型java.util.LinkedHashMap$LinkedHashMapEntryjavax.el.PropertyNotFoundException:在类型上没有找到属性"categoryIsSelected"java.util。LinkedHashMap LinkedHashMapEntry美元javax.el.BeanELResolver BeanProperties.get美元(BeanELResolver.java: 200)在javax.el.BeanELResolver BeanProperties.access 400美元(BeanELResolver.java: 177)

当你迭代一个Map时,你得到Map。条目对象(您可以在堆栈跟踪中看到,它正在java.util上查找您的属性)。美元LinkedHashMap LinkedHashMapEntry 对象)。你可以用'type'访问键,用'value'访问值。

所以,对于你的代码,也许可以尝试item2.value。categoryisselected

确保MSCategoryDetailsBO类有字段的setter和getter: categoryIsSelected, categoryName。为什么要把begin和end放在第二个forEach循环中,你确定你的列表大小是10吗?您可以使用varStatus字段:index(从0开始)和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>

确保MSCategoryDetailsBO公共类,并且包含有效的getter/setter,用于JSP中需要的所有属性/成员。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;
    }
}

请再次验证下面的条件,这意味着如果categoryIsSelected 为假或为空,您希望显示categoryName

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

最新更新