【问题标题】:jsf working with collection/mapjsf 使用集合/地图
【发布时间】:2012-06-15 09:07:15
【问题描述】:

我可以将我的 h:dataTable/rich:dataTable 与一些 Map 绑定吗?我发现 h:dataTable 只能与 List 对象一起使用,并且在 List 中删除可能非常繁重。

【问题讨论】:

  • 是什么让您认为使用地图时它不那么“沉重”?这是一个绝对的非论点。
  • 因为在地图中我可以直接访问所需的成员,而在列表中我需要遍历所有成员才能找到它。
  • 你认为它在幕后做什么? Map 如何找到与键关联的值?对,它也在循环所有元素。唯一的区别是,这是通过一种额外的方法隐藏起来的。将List 替换为Map 只会不必要地降低效率,就像Map基本上最终得到Set List 而不是只有 List 允许在使用 ArrayList 实现时实现最快的迭代。
  • Map使用Hash函数,循环简单快捷。

标签: jsf richdatatable


【解决方案1】:

如果您希望在您的支持 bean 中只有一个提供映射的方法,您可以执行以下操作:

class Bean {
  public Map<T,U> getMap() {
    return yourMap;
  }
}

并在您的 JSF 视图中使用它

<h:dataTable value="#{bean.map.keySet().toArray()}" var="key"> 
   <h:outputText value="#{bean.map[key]}"/> 
</h:dataTable>

这会将键集转换为数组,可以通过数据表进行迭代。使用“()”-表达式需要统一表达式语言 2 (Java EE 6)。

【讨论】:

    【解决方案2】:

    是的,没错。 dataTable、ui:repeat 和朋友只适用于列表。

    您可以添加一个托管 bean 方法,将 map.keySet() 或 map.values() 放入列表中,具体取决于您要迭代的位置。

    通常,当我想从 JSF 视图中迭代地图时,我会执行类似的操作

    <h:dataTable value="#{bean.mapKeys}" var="key"> 
       <h:outputText value="#{bean.map[key]}"/> 
    </h:dataTable>
    

    带有托管 bean 属性

    class Bean {
       public List<T> mapKeys() {
         return new ArrayList<T>(map.keySet());
       }
    } 
    

    或类似的东西。

    当然,如果您使用像 TreeMapLinkedHashMap 这样保留顺序的东西,这是最有意义的。

    【讨论】:

    • &lt;h:dataTable&gt; 目前支持迭代Set&lt;E&gt;Collection&lt;E&gt;。然而,这种支持将在即将到来的 JSF 2.2 中引入。到目前为止,只有&lt;c:forEach&gt; 支持地图。
    猜你喜欢
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    相关资源
    最近更新 更多