Переданные значения формы не обновляются в модели при добавлении <f: ajax> в <h: commandButton>
Я учусь, как использовать ajax в jsf, я создал страницу, которая фактически ничего не делает, вводит текст, который заполнен числом, отправляется на сервер, вызывает метод установки для этого элемента с переданным значением и отображает получатель значение.
Вот простой код бина:
@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 никогда не вызывается, поэтому метод получения всегда возвращает "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>