在我的页面doGet上,我设置了一些默认属性。
private static final CategoryFactory cf = CategoryFactory.getInstance();
public static void setupHeader(HttpServletRequest req) {
ArrayList<String> catagories = cf.getPrimaryCategories();
Map<String, ArrayList<String>> categoryMap = cf.getCategoryMap();
User user = UserUtils.getUserSession(req);
req.setAttribute("catagories", catagories);
req.setAttribute("categoryMap", categoryMap);
req.setAttribute("isAdmin", UserUtils.isAdmin(user));
if (user != null) {
req.setAttribute("orderCount", user.getOrderCount(false));
req.setAttribute("unreadMessageCount", user.getUnreadMessageCount());
req.setAttribute("cartTotal", user.getShoppingCart().getTotal());
}
}
然后在我的 JSP 页面上,我尝试使用基于类别的类别映射,这些类别是 Map 中的键。
<c:forEach var="cata" items="${catagories}">
<li class="dropdown-submenu"><a tabindex="-1" href="#"><c:out value="${cata}" /></a>
<ul class="dropdown-menu" role="menu">
<c:forEach var="secCategories" items="${categoryMap['cata']}">
<c:forEach var="second" items="${secCategories}">
<li role="presentation"><a role="menuitem"
href="/browse?type="${fn:replace(second, ' ','+')}"><c:out
value="${second}" /></a></li>
</c:forEach>
</c:forEach>
</ul></li>
</c:forEach>
我得到的错误是
警告:嵌套在javax.servlet.ServletException中: javax.servlet.jsp.JspException: javax.el.PropertyNotFoundException: 找不到财产 [课堂上的高空和起重设备 java.lang.String: javax.el.PropertyNotFoundException: 找不到 属性 [类 java.lang.String 中的高空和起重设备
其中"[高空和起重设备"是变量类别中的第一个键,并设置为新变量 ${cata}。由于这不起作用,我缺少有关如何正确传递动态密钥的内容。
溶液
这解决了我的问题,我设置了之前忘记的属性类型,为了便于使用,我将 ArrayList 更改为 String[]。
<%@attribute name="user" required="true" type="com.entity.User"%>
<%@attribute name="catagories" required="true" type="java.lang.String[]"%>
<%@attribute name="categoryMap" required="true" type="java.util.Map"%>
<c:forEach var="cata" items="${catagories}">
<li class="dropdown-submenu"><a tabindex="-1" href="#"><c:out value="${cata}" /></a>
<ul class="dropdown-menu" role="menu">
<c:forEach var="secCategories" items="${categoryMap[cata]}">
<c:forEach var="second" items="${secCategories}">
<li role="presentation"><a role="menuitem"
href="/browse?type="${fn:replace(second, ' ','+')}"><c:out
value="${second}" /></a></li>
</c:forEach>
</c:forEach>
</ul></li>
</c:forEach>
生自己的气,但是....
<c:forEach var="secCategories" items="${categoryMap['cata']}">
应该是
<c:forEach var="secCategories" items="${categoryMap[cata]}">
您不希望文本字符串"cata"成为键,而是希望 cata page 属性的值成为键。 :)
我删除了单引号并将类别值从 ArrayList 更改为 String[]。 但是我也忘了在页面顶部定义属性类型。所以他们只是像弦一样行事。
<%@attribute name="user" required="true" type="com.entity.User"%>
<%@attribute name="catagories" required="true" type="java.lang.String[]"%>
<%@attribute name="categoryMap" required="true" type="java.util.Map"%>
<!--Iterate Map entries -->
<c:forEach items="${categoryMap}" var="entry">
<!--For Each Entry iterate the value -->
<!-- use ${entry.key} if you need the key -->
<c:forEach var="second" items="${entry.value}">
<li role="presentation"><a role="menuitem"
href="/browse?type="${fn:replace(second, ' ','+')}"><c:out
value="${second}" /></a></li>
</c:forEach>
</c:forEach>
https://stackoverflow.com/a/1835742/1356423
请尝试以下解决方案:
<c:forEach var="cata" items="${catagories}">
<li class="dropdown-submenu"><a tabindex="-1" href="#"><c:out value="${cata}" /></a>
<ul class="dropdown-menu" role="menu">
<c:forEach var="secCategories" items="${categoryMap}">
<c:forEach var="second" items="${secCategories}">
<c:choose>
<c:when test="${fn:toLowerCase(second) == fn:toLowerCase(cata)}">
<li role="presentation"><a role="menuitem"
href="/browse?type="${fn:replace(second, ' ','+')}"><c:out
value="${second}" /></a></li>
</c:when>
</c:choose>
</c:forEach>
</c:forEach>
</ul></li>