【问题标题】:JSTL Hashmap and dynamic keyJSTL Hashmap 和动态键
【发布时间】:2015-05-15 18:14:55
【问题描述】:

在我的 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 页面上,我尝试使用基于类别的 categoryMap,这些类别是 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 类中的空中和起重设备

其中“[Aerial & Lifting Equipment”是变量类别中的第一个键,并设置为新变量${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>

【问题讨论】:

  • 检查过你的HashMap吗??是否有针对关键空中和起重设备的 ArrayList??
  • @alfreema catagories=[Aerial &amp; Lifting Equipment, Asphalt &amp; Concrete Equipment, Attachments, Compaction Equipment, Construction Equipment, Earthmoving Equipment, Forestry &amp; Mining Equipment] categoryMap={Aerial & Lifting Equipment=[All Terrain Crane, Boom Lift, Forklift, Hydraulic Truck Crane, Material Handler, Person Lift, Rough Terrain Crane, Scissor Lift, Telehandler,伸缩叉车], 林业和矿山设备=[履带拖拉机, 伐木机, 货代, 收割机, 装载机, 岩石卡车, 铲车, 集材机, 轮式推土机, 轮式装载机]}

标签: java jsp servlets jstl


【解决方案1】:

尝试以下解决方案:

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

【讨论】:

    【解决方案2】:
    <!--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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 太棒了,现在可以用了吗? NVM:我看到你在上面的问题中得到了它。很棒。
      【解决方案4】:

      你会生自己的气,但是....

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

      应该是

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

      您不希望文字字符串“cata”作为键,而是希望 cata 页面属性的值作为键。 :)

      【讨论】:

      • 我删除了单引号,仍然得到同样的错误,找不到属性 [Aerial & Lifting Equipment in class java.lang.String
      猜你喜欢
      • 1970-01-01
      • 2019-11-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-16
      • 1970-01-01
      • 2015-04-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多