在preRenderView侦听器上使用findComponent

时间:2016-04-06 15:09:48

标签: jsf

在JSF页面上:

<f:event type="preRenderView" listener="#{backingBean.test()}" />

<h:inputHidden id="inputHiddenId" value="dummy" />

在backingBean上:

public void test() {
    System.out.println("test");

    FacesContext fc = FacesContext.getCurrentInstance();
    UIComponent comp = fc.getViewRoot().findComponent("inputHiddenId");
    if (comp != null) {
        System.out.println("comp " + comp); // Does not print
    }
}

phaseListener显示在呈现响应阶段调用test():

START PHASE RESTORE_VIEW 1
END PHASE RESTORE_VIEW 1
START PHASE RENDER_RESPONSE 6
test
END PHASE RENDER_RESPONSE 6

但是,它找不到inputHiddenId组件。似乎该组件在此期间不可用。它需要回传吗?首次加载页面时如何访问组件?对不起,我不太熟悉JSF生命周期的复杂性。如果有人能够对此有所了解,我们将不胜感激。

重新发布问题:

真正的问题是我有一个包含多个字段的表单。提交表单后,用户仍然可以编辑某些字段,这些字段可以重置表单上的其他部分并使其无效。由于它是一个长形式,用户应该能够保存表单,即使它验证失败,并在以后返回它。因此,在加载页面时,我希望它在字段上显示内联验证。我们正在使用JBoss Seam。验证方法使用

显示错误
StatusMessages.instance().addToControl("inputHiddenId", severity, message)

使用

从page.xml调用验证方法
<action execute="#{backingBean.pageInitWithValidation()}" on-postback="false" />

但是,这并未在ui组件上显示内联错误消息

<s:div id="errorMessages">
    <h:inputHidden id="inputHiddenId" value="dummy" />
    <h:messages for="inputHiddenId" />
</s:div>

它显示在全局消息的顶部

<h:messages globalOnly="true" />

这就是我尝试使用preRenderView的原因,但效果相同。

我目前正在使用body onload事件的第二种方法以及a4j:jsFunction,但它不是很干净。

<a4j:jsFunction name="validate" 
    action="#{backingBean.validate()}" render="formId" />

<h:body onload="validate()">

0 个答案:

没有答案