Каждый раз, когда я отлаживаю приложение и что-то набираю в текстовом поле, контроллер запоминает только при обновлении страницы.Без тега ajax все работает нормально.Так что мое предположение: рендеринг outputPanel не работает.Я установил точки останова (и слушатель ajax, и метод установки полей), и несколько раз протестировал его, и в результате контроллер работал только тогда, когда я нажал кнопку, а затем обновил страницу.Ссылаясь на JSF, я работаю с Eclipse для Java EE и Tomcat v.9.0 и более ранних версий.
Странно то, что атрибут execute
имеет только идентификатор для входа name
в своем атрибуте execute
иТем не менее, прослушиватель вызывается (sysout печатается), этого не следует ожидать согласно # 9 в commandButton / commandLink / ajax action / listener метод не вызывается или входное значение не установлено / обновлено .Но изменение его на @form
не меняет его
new.xhtml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
>
<h:head>
</h:head>
<h:body>
<h:form id="formID">
<h:inputText id="name" value="#{LayoutController.name}"></h:inputText>
<h:commandButton value="Welcome Me">
<f:ajax event="click" listener="#{LayoutController.listen}" execute=":formID:name" render=":formID:output"/>
</h:commandButton>
<h:panelGroup id="output">
<h:outputText value="#{LayoutController.name}"/>
</h:panelGroup>
</h:form>
</h:body>
</html>
LayoutController.java:
package Template;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.event.AjaxBehaviorEvent;
@ManagedBean(name="LayoutController")
@SessionScoped
public class LayoutController{
private String name;
public LayoutController() {
this.name="";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void listen (AjaxBehaviorEvent event) {
this.name = this.name + " ! ";
System.out.println("Clicked");
}
}