jsf - primefaces uiViewRoot 在 <p :dataTable > 内查找组件

标签 jsf datatable primefaces components

我使用的是 primefaces 3.2。

我遇到以下情况:

<h:form id="someForm">
  ..
  <p:dataTable id="someDataTable" value="#{BackingBean.list}" var="element" ..>
    <p:column>
      <p:calendar id="someCalendar" value=#{element.date} ../>
      <p:message id="someCalendarMessage" for=":someForm:someDataTable:someCalendar"/>
    <p:column>
  </p:dataTable>    
  ..
</h:form>

“someDataTable”动态更新,然后将所有数据提交到服务器端。在支持 bean 中,如果输入的日期不满足某些条件,我想发送日历“someCalendar”的消息。我尝试使用以下代码找到该组件:

FacesContext facesContext = FacesContext.getCurrentInstance();
facesContext.addMessage(facesContext.getViewRoot().findComponent(":someForm:someDataTable:" + "i" + ":someCalendar").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, Utils.getResourceBundleString("dictionary", "error") + ":", Utils.getResourceBundleString("dictionary", "some_message")));
return;

其中 i 是 dataTable 中“元素”的索引,与 BackingBean 中列表中的索引相同。

问题是我得到 NullPointerException 因为 facesContext.getViewRoot().findComponent(..) 方法无法找到该组件,尽管我检查了 View 中日历的生成 ID,它是 :som​​eForm:someDataTable:0:someCalendar 对于第一个元素,它应该是 :someForm:someDataTable:1:someCalendar 对于下一个元素等。

为什么facesContext.getViewRoot().findComponent(..)方法找不到里面的组件?是动态更新的,提交完成后服务器端可能没有得到更新的组件树?

提前致谢。

最佳答案

这是因为 p:dataTable 是一个重复组件,并且在 View 构建期间, View 根中只有一个日历。它的 ID 为 someForm:someDataTable:someCalendar

仅在 View 呈现期间,才会创建表行并生成与行相关的 id。

您应该使用 JSF 内置验证工具来检查您的日期:

在 View 中:

<p:calendar id="someCalendar" value=#{element.date} 
            validator="#{BackinBean.validateDate}"/>
<p:message id="someCalendarMessage" for="someCalendar"/>

(for 属性中的someCalendar 就足够了)

在支持 bean 中:

public void validateDate(
               FacesContext context, 
               UIComponent component, 
               Object value) throws ValidatorException {

        if (/* date is not valid */) {
            throw new ValidatorException(
               new FacesMessage("Date is not valid"));
        }

}

来自验证方法的 FacesMessage 将自动显示在正确的表格行中。

关于jsf - primefaces uiViewRoot 在 <p :dataTable > 内查找组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10594628/

相关文章:

jsf - 在 panelGrid 列中对齐内容

jsf - Apache Myfaces 在使用 h :dataTable and an empty dataset 时打印空白的 td 标签

c# - 在窗口应用程序中使用数据表或数据集在gridview中添加进度条

primefaces - 滚动 p :messages into view when it is updated and (error) messages are present

eclipse - 部署到 FireFly 的 JSF 异常,标记名为 inputFile null handler-class

java - 组件族、组件类型和渲染器类型之间的关系是什么?

spring - 在 JSF 中使用多个资源包

javascript - dataTable页长变化问题

java - 带有 GAE 和 ViewScoped ManagedBean 的 JSF2

jsf - 单击特定选项卡时调用 JavaScript