Я борюсь с той же проблемой: при использовании <f:ajax>
методы слушателя действия в компоненте поддержки составного компонента не выполняются.
Частично работает при использовании Primefaces <p:commandButton>
: слушатель действияметод правильно вызывается в этом случае.Однако значение атрибута 'process' в этом случае, похоже, игнорируется: все поля формы отправляются, что в моем случае вызывает ошибку проверки.Если это не проблема для вас, вы можете попробовать это.
Я создал несколько тестовых классов, которые воспроизводят проблему:
Файл составного компонента testComponent.xhtml:
<html xmlns="http://www.w3c.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:composite="http://java.sun.com/jsf/composite">
<composite:interface componentType="testComponent">
</composite:interface>
<composite:implementation>
<div id="#{cc.clientId}">
<h:panelGroup id="addPanel">
<h:inputText id="operand1" value="#{cc.operand1}"/>
<h:outputText value=" + " />
<h:inputText id="operand2" value="#{cc.operand2}"/>
<h:outputText value=" = " />
<h:outputText id="result" value="#{cc.result}" />
<br />
<p:commandButton id="testButton1" value="Primefaces CommandButton"
actionListener="#{cc.add()}" process="addPanel" update="addPanel"/>
<h:commandButton id="testButton2" value="f:ajax CommandButton">
<f:ajax execute="addPanel" render="addPanel" listener="#{cc.add()}" />
</h:commandButton>
</h:panelGroup>
</div>
</composite:implementation>
</html>
Класс компонента поддержки:
package be.solidfrog.pngwin;
import javax.faces.component.FacesComponent;
import javax.faces.component.UINamingContainer;
import javax.faces.event.ActionEvent;
@FacesComponent("testComponent")
public class TestComponent extends UINamingContainer {
private Integer operand1, operand2, result;
public void add() {
System.err.println("Adding " + operand1 + " and " + operand2);
result = operand1 + operand2;
}
public Integer getOperand1() { return operand1; }
public void setOperand1(Integer operand1) { this.operand1 = operand1; }
public Integer getOperand2() { return operand2; }
public void setOperand2(Integer operand2) { this.operand2 = operand2; }
public Integer getResult() { return result; }
public void setResult(Integer result) { this.result = result; }
}
И страница использования test.xhtml:
<!DOCTYPE html>
<html xmlns="http://www.w3c.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html" xmlns:p="http://primefaces.org/ui"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:sf="http://java.sun.com/jsf/composite/solidfrog">
<h:body>
<h:messages />
<h:form id="testForm">
<h:outputLabel for="field1" value="Integer field: "/>
<h:inputText id="field1" value="#{testBean.field1}" />
<hr/>
<sf:testComponent id="testComponent" />
</h:form>
</h:body>
</html>
При нажатии первой кнопки и заполнении двух полей операндов результатправильно рассчитан.Однако, когда в поле 1 вводится нечисловое значение, происходит сбой проверки.
При использовании второй кнопки метод прослушивателя действий никогда не рассчитывается.Однако заполненная форма всегда отправляется, поэтому при вводе нецифрового значения в поле 1 также возникает ошибка.
Я также пытался p:ajax
, который вел себя так же, как и f:ajax
.
Я действительно понятия не имею, что здесь происходит.Надеюсь, кто-то с большей мудростью JSF может помочь.