java、JSTL和通过键获取值

java、JSTL和通过键获取值,java,foreach,jstl,hashtable,Java,Foreach,Jstl,Hashtable,我想知道为什么我不能使用jstl中的键从外部哈希表中获取值,这些键是整数值,这些值是内部哈希表,我正在处理一些遗留代码,这就是哈希表的原因,哈希表是以这种形式从存储过程调用返回的 奇怪的是,在内部哈希表中,当我在forEach循环中处理它时,我能够得到这些值${data['NAME']}确实有效 我可以使用JSTL forEach循环遍历整个外部哈希表,这是正常的,但是如果我尝试获取一个值,比如${missing_ciphers[1]}或者甚至${missing_ciphers['1']},则不

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

奇怪的是,在内部哈希表中,当我在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}}
我可以使用下面的代码在其上循环ok,但列表的顺序不是我想要的,所以我想使用循环计数器通过其键将对象取出,但这似乎没有返回任何内容(一旦我按我想要的方式工作,内联样式将移到css文件中…):


谢谢

您应该使用分配给varStatus的变量名——“cipher\u loop”,而不是varStatus本身

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

编辑 外表中的钥匙类型是什么?整数

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>

${data['SOURCE']}
${data['NAME']}
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>

测验

嗨,对不起,这不应该是我的例子的一部分。。。无论如何,我用你的代码替换了它,但代码什么也没做,然后我尝试了${missing_ciphers[cipher_loop.index+1]},因为索引是我用于替代行着色的,它也不会从哈希表返回任何内容。
${missing_ciphers[varStatus]}

should be 

${missing_ciphers[cipher_loop.count]}
<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>
<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>