2

有没有办法使用 JSF EL (Java EE 7) 在 2 列表中列出所有请求的标头名称和相应的值,而不引入支持 bean?如果我创建一个 bean 并从 EL 访问它,我可以做到这一点,所以我确实有办法达到目的——但我想弄清楚的是,它是否可以完全通过“开箱即用”来完成埃尔。“那不可能”将是一个很好的答案——我还在学习。

我想是这样的:

  <table>
    <ui:repeat value="#{request.getHeaderNames()}" var="hdr">
      <tr>
        <td>#{hdr}</td>
        <td>#{headerValues[hdr]}</td>
      </tr>
    </ui:repeat>
  </table>

但这给出了一个 1 行表,如下所示:

org.apache.catalina.util.Enumerator@2dbf763b    [Ljava.lang.String;@74eb32f3

我怀疑因为request.getHeaderNames()给出的是枚举器而不是某种ui:repeat想要的列表,所以这种方法根本行不通,我需要做一些根本不同的事情。

4

1 回答 1

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 功能转换MapEntry[]如下,因为<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}代表 a String[],因此我也为您修复了该问题,并使用了适当的数据结构。

于 2013-06-30T15:00:30.233 回答