JSF 2.0,消息未显示在dataTable中

时间:2011-09-30 13:49:19

标签: jsf datatable message

我有一个带有dataTable的表单,其中包含各种具有链接和outputTexts的列。有一个输入字段通过ajax请求进行评估。自定义验证器确保只将整数添加到字段中。表格如下。

    <form>  
            <h:dataTable var="item" value="#{listItems.model}" id="adminlistItems"> 
                //other columns having commandLinks and outputTexts
                    <h:column>
                        <f:facet name="header" >
                            <h:outputText value="Quantity"/>
                        </f:facet>                  
                        <f:ajax listener="#{listItems.AddQuantityAction}">
                            <div style="padding:5px;float:left">
                                <h:inputText label="changeQuantity" id="addquantity" value="#{item.additionalQuantity}" maxlength="4" size="3">
                                    <f:validator validatorId="integerValidator"/>
                                </h:inputText>
                                <h:outputText value="&nbsp;"/>
                                <h:commandButton value="AddQuantity"  />
                                <h:message for="addquantity"/>
                            </div>
                        </f:ajax>  
                    </h:column>
            </h:dataTable>
        </h:form>

bean的代码是:

    @ViewScoped
    @ManagedBean
    public class ListItems implements Serializable {    
    //...
    public String AddQuantityAction(){
              //...
      boolean result = //some action
              FacesContext context=FacesContext.getCurrentInstance();
              UIComponent component=UIComponent.getCurrentComponent(context);
              String clientID=component.getClientId(context);
              if (result) {
                   FacesMessage message = new FacesMessage("Quantity added successfully");
                  FacesContext.getCurrentInstance().addMessage(clientID, message);
              } else {
                  FacesMessage message = new FacesMessage("Quantity not added.Processing error");
                  FacesContext.getCurrentInstance().addMessage(clientID, message);
              }
              return "adminListItems"; 
          }
      }

自定义验证程序抛出未显示的验证程序异常。并且监听器还具有也不显示的消息的代码。我已经阅读了几个类似的问题,这听起来也是一个常见的问题。但即使我遗漏了一些明显的东西,我仍然需要第三只眼睛来看看我不知道的东西。

1 个答案:

答案 0 :(得分:1)

execute的{​​{1}}和render默认为<f:ajax>。因此,只处理和刷新当前活动的组件。按下按钮时,这不会发送输入值,也不会刷新消息组件。

相应修复:

@this

顺便问一下,为什么不使用内置<f:ajax execute="addquantity" render="addquantity_message" listener="#{listItems.AddQuantityAction}"> ... <h:message id="addquantity_message" for="addquantity"/> ... </f:ajax> 转换器而不是验证器呢?

javax.faces.Integer

此外,ajax侦听器方法的返回值应为<h:inputText ... converter="javax.faces.Integer"> 。它完全被忽略了。此外,方法名称应以小写字母开头。另请参阅Java naming conventions


根据评论

更新,在验证方面效果不佳。监听器被调用2次,因为基本上发送了2个ajax请求,一个用于输入,一个用于命令。我建议将监听器方法移到void

<h:commandButton action>

您只能将获取的客户端ID修改为输入ID,而不是按钮ID。