JSF组件的动态值绑定

时间:2010-02-09 01:21:21

标签: java jsf richfaces

如何在运行时动态绑定某个组件的值? 例如,我有以下组件标记

<h:inputText value="#{bean.someProp}" />

就我而言,“#{bean.someProp}”仅在运行时才知道。

实施此策略的最佳策略是什么?

我应该遍历组件树并以编程方式设置值绑定吗?如果是,我应该在哪个JSF生命周期阶段进行遍历?

2 个答案:

答案 0 :(得分:15)

您可以将其绑定到Map<String, Object> bean属性,其中String键少于或多于动态属性名称。您可以通过以下方式访问EL中的地图值:

<h:inputText value="#{bean.map.someProp}" />

<h:inputText value="#{bean.map['someProp']}" />

甚至可以在someVar实际解析为String "someProp"值的情况下更加动态地完成:

<h:inputText value="#{bean.map[someVar]}" />

您只需要确保在bean初始化期间创建Map,否则JSF无法访问映射值。 EL即不会为您预先创建“嵌套属性”。因此,例如直接实例化:

public class Bean {
    private Map<String, Object> map = new HashMap<String, Object>();
}

..或在构造函数内部或@PostConstruct如果您愿意。

答案 1 :(得分:0)

另一个选择是你可以为你的bean添加一个抽象层。

public String getDynamicProp() {
   ...Code to determine and return the correct property based on the meta-data...
}

public void setDynamicProp(String input) {
   ...Code to determine and return the correct property based on the meta-data...
}

然后你将JSF直接绑定到动态prop:

#{bean.dynamicProp}

但是,这不会像您想要的验证器等那样依赖于元数据。但是,您可以以编程方式调用验证并自行处理。