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并自行处理。