2015-03-13 131 views
0

在我的页面doGet上,我设置了一些默认属性。JSTL哈希映射和动态密钥

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关键字的类别来处理categoryMap。

<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找不到 财产[空中&起重设备

其中“[Aerial &起重设备”是变量类别中的第一个键,并设置为新变量$ {cata}。由于这不起作用,我错过了如何正确传递动态密钥。

SOLUTION
这个固定我的问题,我设置的属性类型,我才忘了,为了便于使用,我改变了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> 
+0

检查你的HashMap?它是否具有针对关键空中和起重设备的ArrayList? – 2015-03-13 10:17:21

+0

@alfreema'catagories = [空中起重设备,沥青及混凝土设备,附件,压实设备,建筑设备,土方设备,林业和采矿设备]' categoryMap = {Aerial&Lifting Equipment = [All Terrain Crane,叉车,叉车,液压汽车起重机,物料搬运车,人员举升机,越野起重机,剪叉式升降机,伸缩臂叉装车,伸缩式叉车],林业与采矿设备= [履带式拖拉机,伐木归堆机,转运机,铲子,集材机,轮式推土机,轮式装载机]} – JWL 2015-03-13 17:43:52

回答

0

你就要成为你自己疯了,但是....

<c:forEach var="secCategories" items="${categoryMap['cata']}"> 

应该

<c:forEach var="secCategories" items="${categoryMap[cata]}"> 

你不想文本字符串 “CATA” 作为键,你希望cata页面属性的值是关键。 :)

+0

我删除了单引号,仍然得到相同的错误,找不到属性[类java.lang中的Aerial&Lifting Equipment。字符串 – JWL 2015-03-13 17:27:46

0

我删除了单引号并将类别值从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"%> 
+0

真棒,所以它现在工作? NVM:我看到你在问题的上面工作。优秀。 – alfreema 2015-03-13 22:54:06

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

0

请尝试以下解决方案:

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