不使用bean将列表传递给JSF组件

5

如何在没有后端bean的情况下将List传递给JSF组件中的EL?换句话说,如何在JSF中声明和初始化List / Array而不使用bean?

示例:

caller.xhtml

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

displayList.xhtml

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

有没有可能将未在Bean中声明的List/Collection传递给JSF组件?
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')}的表达式一起使用。

使用实用程序类型的解决方案非常棒。非常感谢。 - Paul Wasilewski

3

EL 3.0可以进行集合构建。

Set(集合):

{1, 2, 3}

清单:

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

地图:

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

使用JSF的EL集合构建示例:

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

请查看EL 3.0规范-最终版,2.2 集合对象的构造。


2
如果你的问题意思是“EL中是否有列表文字?”,那么答案是“没有”。
如果你想创建一个列表而不使用JSF后备bean,那么答案是:“使用CDI bean或Spring bean”。
如果你只是不喜欢在Java项目中拥有模型类,那么你可以轻松地创建和注册一个EL解析器,当使用特定名称时将创建一个新列表。
无论哪种方式,你可能正在犯一些巨大的错误或误解了重要的事情。也许你应该问一个不同的问题。

1
也许我没有表达清楚。但是,“EL中是否有List字面量”就是我想问的问题 :-) - Paul Wasilewski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接