如何在运行时动态绑定某个组件的值? 例如,我有以下组件标记
<h:inputText value="#{bean.someProp}" />
就我而言,“#{bean.someProp}”仅在运行时才知道。
实施此策略的最佳策略是什么?
我应该遍历组件树并以编程方式设置值绑定吗?如果是,我应该在哪个JSF生命周期阶段进行遍历?
答案 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}
但是,这不会像您想要的验证器等那样依赖于元数据。但是,您可以以编程方式调用验证并自行处理。