java,JSTL并按键

时间:2015-04-24 08:36:20

标签: java foreach jstl hashtable

我想知道为什么我无法使用jstl中的键从外部哈希表获取值,键是整数值,值是内部哈希表,我正在处理一些遗留代码,因此我的原因是Hashtables,以此形式从存储过程调用返回。

奇怪的是,在内部散列表中,当我在forEach循环中处理它时,我能够获取这些值... ${data['NAME']}实际上可以正常工作。

我可以使用JSTL forEach循环遍历整个外部哈希表,但是如果我尝试获取${missing_ciphers[1]}${missing_ciphers['1']}之类的值,则不会返回任何内容。

打印时的哈希表如下所示:

{4={SOURCE=D, NAME=D}, 3={SOURCE=C, NAME=C}, 2={SOURCE=B, NAME=B},   1={SOURCE=A, NAME=A}}

我能够使用以下代码循环它,但是列表不是我希望它的顺序,所以我想使用循环计数器通过键获取对象,但这似乎不会返回任何事情(一旦我按照我想要的那样工作,内联样式将被移动到一个css文件中):

<c:forEach items="${missing_ciphers}" var="ciphers" varStatus="cipher_loop">

                        <c:set var="data" value="${ciphers.value}">
                        </c:set>

                        <tr style="border-left: none; border-right: none;" class="${cipher_loop.index % 2 == 0 ? 'even' : 'odd'}">
                            <td><span style="font-weight: bold;">${data['SOURCE']}</span></td>
                            <td><span style="font-weight: bold;">${data['NAME']}</span></td>
                        </tr>
                    </c:forEach> 

任何人都可以帮助我了解这里发生的事情以及为什么我无法使用${missing_ciphers[1]}类型语法获取值吗?

我应该补充说,以下代码会将内部哈希表打印到tomcat控制台中:

<% System.out.println("val: " + ((Hashtable)request.getAttribute("missing_ciphers")).get(1)); %>

我甚至尝试了以下内容,只是为了看看它是否仍然没有来自外部哈希表的键的类型:

<c:forEach items="${missing_ciphers}" var="ciphers" varStatus="cipher_loop">
                        <c:set var="counter" value="${cipher_loop.index + 1}" />
                        <fmt:parseNumber var="fmt_counter" integerOnly="true" type="number" value="${counter}" />
                        <c:out value="${fmt_counter}" />

                        <c:set var="data" value="${missing_ciphers[fmt_counter]}"></c:set>

                        <tr style="border-left: none; border-right: none;" class="${cipher_loop.index % 2 == 0 ? 'even' : 'odd'}">
                            <td><span style="font-weight: bold;">${data['SOURCE']}</span></td>
                            <td><span style="font-weight: bold;">${data['NAME']}</span></td>
                        </tr>
                    </c:forEach>

由于

1 个答案:

答案 0 :(得分:0)

您应该使用分配给varStatus的变量名 - 'cipher_loop'而不是varStatus本身。

此外,您应该使用index属性或count属性来获取当前索引。 (索引从0开始,默认情况下计为1)

${missing_ciphers[varStatus]}

should be 

${missing_ciphers[cipher_loop.count]}

修改

你的外部仇恨中你的钥匙的类型是什么?整数?

varStatus.index(或计数器)的类型很长,您必须将其显式设置为整数才能将其用作外表的键

以下代码适用于我

<jsp:directive.page import="java.util.*"/>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%

Hashtable h = new Hashtable();
Hashtable h1 = new Hashtable();h1.put("SOURCE","D");h1.put("NAME","D");
Hashtable h2 = new Hashtable();h2.put("SOURCE","C");h2.put("NAME","C");
Hashtable h3 = new Hashtable();h3.put("SOURCE","B");h3.put("NAME","B");
Hashtable h4 = new Hashtable();h4.put("SOURCE","A");h4.put("NAME","A");
h.put(4,h1);h.put(3,h2);h.put(2,h3);h.put(1,h1);


request.setAttribute("missing_ciphers",h);

%>


<c:forEach items="${missing_ciphers}" var="ciphers" varStatus="cipher_loop">
        <c:set var="counter" value="${cipher_loop.index + 1}" />
        <c:out value = "${counter}"/>
        <c:set var = 'counter' value = '<%=new Integer(pageContext.findAttribute("counter").toString())%>'/>

        <c:set var="data" value="${missing_ciphers[counter]}"></c:set>


                        <tr>
                            <td><span style="font-weight: bold;">${data['SOURCE']}</span></td>
                            <td><span style="font-weight: bold;">${data['NAME']}</span></td>
                        </tr>
</c:forEach>

OTOH,如果你的表中的键是long类型,那么你可以直接使用varstatus.index属性

<jsp:directive.page import="java.util.*"/>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%

Hashtable h = new Hashtable();
Hashtable h1 = new Hashtable();h1.put("SOURCE","D");h1.put("NAME","D");
Hashtable h2 = new Hashtable();h2.put("SOURCE","C");h2.put("NAME","C");
Hashtable h3 = new Hashtable();h3.put("SOURCE","B");h3.put("NAME","B");
Hashtable h4 = new Hashtable();h4.put("SOURCE","A");h4.put("NAME","A");
h.put(new Long(4),h1);h.put(new Long(3),h2);h.put(new Long(2),h3);h.put(new Long(1),h1);


request.setAttribute("missing_ciphers",h);

%>
test


<<c:forEach items="${missing_ciphers}" var="ciphers" varStatus="cipher_loop">
        <c:set var="counter" value="${cipher_loop.index + 1}" />


        <c:set var="data" value="${missing_ciphers[counter]}"></c:set>
        ${data}
                        <tr>
                            <td><span style="font-weight: bold;">${data['SOURCE']}</span></td>
                            <td><span style="font-weight: bold;">${data['NAME']}</span></td>
                        </tr>
</c:forEach>