Представленные значения формы не обновляются в модели при добавлении <f: ajax> в <h: commandButton>

Я изучаю, как использовать ajax в jsf, я сделал страницу, которая фактически ничего не представляет, текст ввода, который заполняется числом, представленный на сервере, вызывает установщик для этого элемента со значением, представленным, и отобразите значение геттера.

Вот простой bean код:

@ManagedBean(name="helper",eager=true)
public class HealthPlanHelper {


    String random = "1";

    public void setRandomize(String s){
        random = s;
                System.out.println("Calling setter");
    }

    public String getRandomize(){
        return random;
    }

}

И страница jsf:

<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:f="http://java.sun.com/jsf/core">
<h:head></h:head>
<h:body>

    <h:form>
        <h:commandButton action="nothing">
            <f:ajax render="num"/>
        </h:commandButton>

        <h:inputText value="#{helper.randomize}" id="num"/>
    </h:form>

</h:body>
</html>

Как вы видите, это область с привязкой к запросу bean, всякий раз, когда я нажимаю кнопку, сервер показывает, что он создает экземпляр bean, но метод setter никогда не вызывается, таким образом, getter возвращает всегда "1" в качестве значения строки.

Когда я удаляю сеттер, вызывается нормально.

Ответ 1

<f:ajax> обрабатывает по умолчанию только текущий компонент (читать описание атрибута execute). В принципе, ваш код точно такой же:

<h:form>
    <h:commandButton action="nothing">
        <f:ajax execute="@this" render="num"/>
    </h:commandButton>
    <h:inputText value="#{helper.randomize}" id="num"/>
</h:form>

В эффектах обрабатывается только <h:commandButton action>, и <h:inputText value> (и любое другое поле ввода, если оно есть) полностью игнорируется.

Вам нужно изменить атрибут execute, чтобы явно указать компоненты или разделы, которые вы хотите обработать во время запроса ajax. Обычно для обработки всей формы используется @form:

<h:form>
    <h:commandButton action="nothing">
        <f:ajax execute="@form" render="num"/>
    </h:commandButton>
    <h:inputText value="#{helper.randomize}" id="num"/>
</h:form>

См. также: