JSF 2.0, сообщения не отображаются внутри таблицы данных - PullRequest
0 голосов
/ 30 сентября 2011

У меня есть форма с 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>

Код для боба:

    @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 Ответ

1 голос
/ 30 сентября 2011

execute и 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 конвертер вместо этого валидатора?

<h:inputText ... converter="javax.faces.Integer">

Кроме того, возвращаемое значение методов слушателя ajax должно быть void. Это полностью игнорируется в любом случае. Кроме того, имена методов должны начинаться со строчной буквы. См. Также Соглашения об именах Java .


Обновление в соответствии с комментарием, которое, похоже, не сработало в отношении проверки. Слушатель вызывается 2 раза, потому что по существу было отправлено 2 ajax-запроса, один для ввода и один для команды. Я предлагаю перенести метод слушателя на <h:commandButton action>.

<f:ajax execute="addquantity" render="addquantity_message">
    ...
    <h:commandButton action="#{listItems.AddQuantityAction}" />
    <h:message id="addquantity_message" for="addquantity"/>
</f:ajax>

Вы только зафиксируете полученный идентификатор клиента как идентификатор ввода, а не идентификатор кнопки.

...