JSF组件的动态值绑定

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

 

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

实现这一目标的最佳策略是什么?

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

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

  

要么

  

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

  

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

 public class Bean { private Map map = new HashMap(); } 

..或者在构造函数或@PostConstruct如果你愿意的话。

另一个选择是你可以为你的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} 

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