如何在没有backbean的情况下将List传递给EL中的JSF-Component?或者换句话说,如何在没有bean的情况下在JSF中声明和初始化List / Array?
示例:
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组件?
答案 0 :(得分: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')}
答案 1 :(得分:2)
如果您的问题意味着“EL中是否有列表文字?”,那么答案是“没有”。
如果你想创建一个列表而不是使用JSF支持bean,那么答案是:“使用CDI bean或Spring bean”。
如果您只是不喜欢在Java项目中使用模型类,那么您可以轻松地创建和注册EL解析器,该解析器将在使用特定名称时创建新列表。
无论哪种方式,你可能犯了一些重大错误或误解了一些重要的事情。也许你应该问一个不同的问题。
答案 2 :(得分:2)
使用EL 3.0可以进行收藏构建。
集:
{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 Specification - final release,2.2构建集合对象。