2015-03-13 129 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>