每次我调试应用程序并在文本框中键入内容时,控制器仅在刷新页面时才会记住。 没有ajax标记,它可以正常工作。所以我的猜测是:outputPanel的渲染不起作用。我设置了断点(同时调用了ajax侦听器和字段设置器)并对其进行了多次测试,结果是控制器仅在单击按钮然后刷新页面后才起作用。参考JSF,我使用Eclipse for Java EE和Tomcat v.9.0及更早版本。
奇怪的是,execute
属性在其name
属性中仅具有execute
输入的ID,并且仍然调用了侦听器(打印了sysout),但这不是为了预期符合commandButton/commandLink/ajax action/listener method not invoked or input value not set/updated中的#9。但是将其更改为@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");
}
}