在JSP页面${cookie[0].value.name}
中使用EL,这不会打印任何内容,但如果我只使用${cookie}
,则会打印cookie列表。如何只打印第一个名称?
答案 0 :(得分:0)
隐式EL变量${cookie}
本质上是Map<String, Cookie>
,其中cookie名称是键,Cookie
实例本身就是值。
因此不是List
。您无法通过基于整数的索引访问映射条目。只能通过cookie名称访问此特定映射的特定条目。以下示例假定foo
为Cookie名称。
${cookie.foo}
其值可以如下获得。
${cookie.foo.value}
你可以用笨拙的方式访问Map<K,V>
的第一个条目(尽管不比“普通Java”更笨拙)。
${cookie.entrySet().iterator().next()}
其名称可以通过地图键打印如下。
${cookie.entrySet().iterator().next().key}
或name
实例的Cookie
属性作为地图值。
${cookie.entrySet().iterator().next().value.name}
您只需要记住,Servlet规范中没有任何内容可以保证cookie映射的顺序。它可能在封面下使用HashMap
,然后排序将与您在请求标头中看到的顺序不同,甚至在每个请求中都有所不同。
尽管如此,显然在不知道其名字的情况下抓住“第一个”曲奇是可疑的。这表明更大的设计问题。如果您知道cookie名称,请直接使用它。
${cookie.foo}
否则,您需要退后一步并重新考虑您尝试解决的问题的解决方案,因为您可能错误地认为此方法是正确的解决方案。另一方面,也许您只是想打印所有cookie的名称=值对以进行调试?
<c:forEach items="${cookie}" var="currentCookie">
Cookie name as map entry key: ${currentCookie.key}<br/>
Cookie object as map entry value: ${currentCookie.value}<br/>
Name property of Cookie object: ${currentCookie.value.name}<br/>
Value property of Cookie object: ${currentCookie.value.value}<br/>
<br/>
</c:forEach>
您也可以在浏览器的内置HTTP流量监控器中找到它们。在Chrome / FireFox23 + / IE9 +中按F12,然后打开标签网络。