5

如何在没有 backingbean 的情况下将 List 传递给 EL 中的 JSF 组件?或者换句话说,我如何在没有 bean 的情况下在 JSF 中声明和初始化列表/数组?

例子:

调用者.xhtml

/* Call a JSF-Component */
<mycomp:displayList value="HERE I WANT TO PASS A LIST WITHOUT A BACKINGBEAN"/>

显示列表.xhtml

/* MY Component */
<composite:interface>
     <composite:attribute name="value" type="java.util.list" />
</composite:interface>

是否有可能将未在 Bean 中声明的 List/Collection 传递给 JSF 组件?

4

3 回答 3

5

尽管 EL 中没有列表文字,但您可以通过在 faces-config.xml 中声明一个列表来声明一个列表,而无需 bean 包含它:

<managed-bean>
    <managed-bean-name>someList</managed-bean-name>
    <managed-bean-class>java.util.ArrayList</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
    <list-entries>
        <value>One</value>
        <value>Two</value>
        <value>Three</value>
    </list-entries>
</managed-bean>

您还可以使用实用程序类型来构建列表:

import java.util.*; import javax.faces.bean.*;

@ManagedBean @NoneScoped
public class Lister<T> extends AbstractList<T> {
  private List<T> list = new ArrayList<T>();

  public Lister plus(T t) {
    list.add(t);
    return this;
  }

  @Override public T get(int index) {
    return list.get(index);
  }

  @Override public int size() {
    return list.size();
  }

  @Override public String toString() {
    return list.toString();
  }
}

这可以与类似的表达式一起使用#{lister.plus('one').plus('two').plus('three')}

于 2012-05-19T19:18:58.770 回答
3

EL 3.0 可以构建集合。

放:

{1, 2, 3}

列表:

[1, "two", [foo, bar]]

地图:

{"one":1, "two":2, "three":3}

将 EL 集合构造与 JSF 一起使用的示例:

<h:dataTable value="#{[1, 2, 3]}" var="v">
    <h:column>#{v}</h:column>
</h:dataTable>

请参阅EL 3.0 规范 - 最终版本,2.2 集合对象的构造。

于 2015-07-14T09:52:19.070 回答
2

如果您的问题的意思是“EL 中是否有列表文字?”,那么答案是“没有”。

如果您想创建一个列表而不使用 JSF 支持 bean,那么答案是:“使用 CDI bean 或 Spring bean”。

如果您只是不喜欢在 Java 项目中使用模型类,那么您可以轻松创建和注册一个 EL 解析器,该解析器将在使用特定名称时创建一个新列表。

无论哪种方式,您都可能犯了一些重大错误或误解了一些重要的事情。也许你应该问一个不同的问题。

于 2012-05-19T18:16:11.633 回答