java、JSTL和按键取值

java, JSTL and getting values by key

我想知道为什么我无法使用 jstl 中的键从外部哈希表获取值,键是整数值,值是内部哈希表,我正在处理一些遗留代码,因此原因对于哈希表,它们是从这种形式的存储过程调用中 return 编辑的。

奇怪的是,当我在 forEach 循环中处理它时,在内部哈希表中我能够得到这些值...${data['NAME']} 实际上确实有效。

我可以使用 JSTL forEach 循环遍历整个外部哈希表,它没问题,但是如果我尝试获得像 ${missing_ciphers[1]} 甚至 ${missing_ciphers['1']} 这样的值,那么什么都不是 returned.

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

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

我可以使用以下代码循环遍历它,但是列表不是我想要的顺序,所以我想使用循环计数器通过它们的键取出对象,但这似乎不是到 return 任何东西(内联样式将被移动到 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>

谢谢

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

您还应该使用索引 属性 或计数 属性 来获取当前索引。 (索引从0开始,默认从1开始计数)

${missing_ciphers[varStatus]}

should be 

${missing_ciphers[cipher_loop.count]}

编辑

你的外层密钥是什么类型table?整数?

varStatus.index(或计数器)的类型很长,您必须明确将其设置为整数才能将其用作外部 table

的键

以下代码适合我

<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,如果你的 table 中的键是 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>