有没有办法使用JSF EL(Java EE 7)在2列表中列出所有请求的标题名称和相应的值,而不引入辅助bean?我可以这样做,如果我创建一个bean并从EL访问它,所以我确实有一个方法到最后 - 但我想弄清楚的是,它是否可以完全用“开箱即用”完成EL。 “这是不可能的”将是一个很好的答案 - 我还在学习。
我想到这样的事情:
<table>
<ui:repeat value="#{request.getHeaderNames()}" var="hdr">
<tr>
<td>#{hdr}</td>
<td>#{headerValues[hdr]}</td>
</tr>
</ui:repeat>
</table>
但是这给出了一个单行表,如下所示:
org.apache.catalina.util.Enumerator@2dbf763b [Ljava.lang.String;@74eb32f3
我怀疑因为request.getHeaderNames()
给出了一个枚举器而不是ui:repeat
想要的某种列表,这种方法根本不起作用,我需要做一些根本不同的事情。
答案 0 :(得分:5)
您可以遍历#{headerValues}
本身。您只需要JSTL <c:forEach>
,
<dl>
<c:forEach items="#{headerValues}" var="entry">
<dt>#{entry.key}</dt>
<c:forEach items="#{entry.value}" var="headerValue">
<dd>#{headerValue}</dd>
</c:forEach>
</c:forEach>
</dl>
或利用EL 2.2功能将Map
转换为Entry[]
,如下所示,因为<ui:repeat>
不支持地图,只支持列表和数组:
<dl>
<ui:repeat value="#{headerValues.entrySet().toArray()}" var="entry">
<dt>#{entry.key}</dt>
<ui:repeat value="#{entry.value}" var="headerValue">
<dd>#{headerValue}</dd>
</ui:repeat>
</ui:repeat>
</dl>
请注意,#{headerValues}
的每个值代表String[]
,所以我也为您修复了这个值,并使用了正确的数据结构。