以编程方式在bean的构造函数中获取JSF视图的UIComponents

Bas*_*sit 12 jsf-2

想象一个JSF页关于若干组件,如<h:selectOneMenu>,<h:dataTable>,<h:panelGrid>等.每个部件都有一个ID.是否有任何方法或技术可以在调用bean的构造函数时以编程方式获取组件?

Bal*_*usC 36

您可以通过以下方式获取组件树FacesContext#getViewRoot()并按ID查找特定组件UIComponentBase#findComponent():

UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot();
UIComponent component = viewRoot.findComponent("someId");
// ...
Run Code Online (Sandbox Code Playgroud)

但是,视图根目录不能直接在bean的构造函数中使用.它可能会返回null对视图的GET请求,其中bean未在视图构建时标记或属性中引用.但是,保证在预渲染视图事件期间可用.

<f:event type="preRenderView" listener="#{bean.init}" />
Run Code Online (Sandbox Code Playgroud)

public void init() {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

具体问题无关,目前尚不清楚为什么需要这样做,但我可以说这不仅仅是代码味道.我建议调查这是否真的是您正确考虑的具体功能要求的正确解决方案.有关线索和提示,另请参阅"绑定"属性如何在JSF中起作用?应该何时以及如何使用?以及如何在JSF中使用组件绑定吗?(会话范围bean中的请求范围的组件).

  • @BalusC,您的“无关”在这里最有价值! (2认同)