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>
我想知道为什么我无法使用 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>