在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()">