任何使用JSF EL列出请求头名称的方法——无需支持bean



有没有任何方法可以使用JSF EL(Java EE 7)在一个两列表中列出所有请求的头名称和相应的值,而不引入支持bean?如果我创建一个bean并从EL访问它,我就可以做到这一点,所以我确实有一种方法来达到目的——但我想弄清楚的是,它是否可以完全用"开箱即用"的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想要的某种列表,所以这种方法根本不起作用,我需要做一些根本不同的事情。

您只需对#{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[],所以我也用适当的数据结构为您修复了这个问题。

相关内容

最新更新