我有一个 JSF 页面,我在其中迭代一个列表<h:dataTable>
以显示一些包含复选框、一些文本和一个文本框的行。
我必须验证,<h:dataTable>
以便当用户选中复选框时,他必须在文本框中输入一些文本。
这是我的 JSF 页面。
<h:form prependId="false" id="form">
<h:dataTable id="rm" width="100%" cellspacing="4"
value="#{controller.alertTriggers}" var="alt"
columnClasses="c1,c2,c3,c4">
<h:column>
<h:selectBooleanCheckbox value="#{alt.checkValue}" id="checkbox"/>
</h:column>
<h:column>
<h:outputText value="#{alt.id}" />
</h:column>
<h:column>
<h:outputFormat value="#{alt.msg1}" />
</h:column>
<h:column>
<h:message for="emailID" id="email" styleClass="validation-error"/>
<h:inputText value="#{alt.mailId}" id="emailID" style="width: 87%;" />
</h:column>
</h:dataTable>
</h:form>
我已将所有复选框的 id 指定为 ,checkbox
并将所有文本框的 id 指定为emailID
。呈现页面时,在检查页面源时,我发现复选框的 id 是 'rm:0:checkbox','rm:1:checkbox'... 而文本框的 id 是 'rm:0: emailID','rm:1:emailID'..
在控制器中,我想访问我使用以下代码的这些动态文本框和复选框:
FacesContext context = FacesContext. getCurrentInstance();
for (int i=0;i<9;i++){
UIInput u=(UIInput) FacesContext.getCurrentInstance().getViewRoot().findComponent( "form:rm:" +i+":checkbox" );
if ((Boolean) u.getValue()){
UIInput ui=(UIInput) FacesContext.getCurrentInstance().getViewRoot().findComponent( "form:rm:" +i+":emailID" );
//code
}
}
但这是给 java.lang.NullPointerException
即使使用代码:
UIInput u=(UIInput) FacesContext.getCurrentInstance().getViewRoot().
findComponent( "form:rm:0:checkbox" ); gives the same exception.
但是如果我使用
UIInput u=(UIInput) FacesContext.getCurrentInstance().getViewRoot().
findComponent( "form:rm:checkbox" );
它没有给出空指针异常,但我不知道它是否给出了哪个复选框的值。
所以,总而言之,
JSF 将 id 生成为 rm:1:checkbox、rm:2:checkbox 等,但是当我尝试在 JSF 页面中访问此 UI 组件时,我无法做到。
我错过了什么吗?