Primefaces commandButton действие не работает

У меня есть проект Primefaces со следующим файлом xhtml:

<!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:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui">
  <h:body>
     <ui:composition>       
        <h:form>
            <p:dataTable id="parameters" var="parameter" value="#{devTestController.parameters}" 
                editable="true" editMode="cell" widgetVar="parameterTable" 
                selection="#{devTestController.selectedRow}" selectionMode="single"
                rowKey="#{parameter}">  

                <f:facet name="header">
                    Parameters
                </f:facet>

                <p:column headerText="Parameter Name" style="width:30%">  
                    <p:cellEditor>  
                        <f:facet name="output"><h:outputText value="#{parameter.label}" /></f:facet>  
                        <f:facet name="input"><p:inputText id="parameterNameInput" value="#{parameter.label}" style="width:96%"/></f:facet>  
                    </p:cellEditor>  
                </p:column>  

                <p:column headerText="Parameter Value" style="width:60%">  
                    <p:cellEditor>  
                        <f:facet name="output"><h:outputText value="#{parameter.value}" /></f:facet>  
                        <f:facet name="input"><p:inputText value="#{parameter.value}" style="width:96%" label="Parameter Value"/></f:facet>
                    </p:cellEditor>  
                </p:column>

                <p:column headerText="Action" style="width:10%">
                    <p:commandButton value="Button in table" action="#{devTestController.doAction()}"/>  
                </p:column>
            </p:dataTable>  
            <p:commandButton value="Button outside table" action="#{devTestController.doAction()}"/>
        </h:form>
        <p:commandButton value="Button outside form" action="#{devTestController.doAction()}"/>
      </ui:composition>     
   </h:body>
</html>

Здесь у меня есть 3 commandButtons (p:commandButton). Один находится внутри dataTable (итерационный компонент), один находится вне dataTable, а другой - вне h:form. Удивительно, но единственная работающая - та, что находится вне формы h: (последняя). Я искал в интернете 5 часов и уже много чего перепробовал. Я не понимаю, почему это происходит. Я прочитал много сообщений о подобных проблемах, но ни один из них не решил мою проблему. Это очень хорошая BalusC от BalusC. Я прочитал все случаи и не могу найти ответ. Сначала я подозревал, что вложил несколько компонентов UIForm друг в друга (случай 2), и я искал в исходном файле xhtml, который включает в себя приведенный выше, но это не тот случай. У меня нет других тегов h:form в моем коде, кроме этого. В конце концов, если я полностью удаляю тег h:form, то команда commandButton не работает, и я также получаю " У компонента формы должна быть UIForm в своем происхождении. Предложение: заключите необходимые компоненты в предупреждение h:form ". Что может пойти не так?

2 ответа

Решение

Что касается @Omar, то вы забыли этот закрывающий тег, даже если я предполагаю, что при публикации вопроса он опечатка. Исходя из этого, я тестировал самостоятельно, и это работает для меня (Primefaces 3.5, Mojarra JSF 2.1.26). Я сделал этот SSCCE, который полностью функционален (кнопки внутри формы работают, а не одна снаружи).

@ManagedBean
@RequestScoped
public class DevTestController {

    public class Parameter {
        private String label;

        private String value;

        public Parameter(String label, String value) {
            this.label = label;
            this.value = value;
        }

        public String getLabel() {
            return label;
        }

        public String getValue() {
            return value;
        }

        public void setLabel(String label) {
            this.label = label;
        }

        public void setValue(String value) {
            this.value = value;
        }
    }

    private Parameter selectedRow;

    private List<Parameter> parameters = Arrays.asList(new Parameter("param1",
            "p1"), new Parameter("param2", "p2"));

    public DevTestController() {

    }

    public void doAction() {
        System.out.println("Done");
    }

    public List<Parameter> getParameters() {
        return parameters;
    }

    public Parameter getSelectedRow() {
        return selectedRow;
    }

    public void setSelectedRow(Parameter selectedRow) {
        this.selectedRow = selectedRow;
    }

}
<!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:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui">
<h:body>
        <h:form>
            <p:dataTable id="parameters" var="parameter"
                value="#{devTestController.parameters}" editable="true"
                editMode="cell" widgetVar="parameterTable"
                selection="#{devTestController.selectedRow}" selectionMode="single"
                rowKey="#{parameter}">

                <f:facet name="header">
                    Parameters
                </f:facet>

                <p:column headerText="Parameter Name" style="width:30%">
                    <p:cellEditor>
                        <f:facet name="output">
                            <h:outputText value="#{parameter.label}" />
                        </f:facet>
                        <f:facet name="input">
                            <p:inputText id="parameterNameInput" value="#{parameter.label}"
                                style="width:96%" />
                        </f:facet>
                    </p:cellEditor>
                </p:column>

                <p:column headerText="Parameter Value" style="width:60%">
                    <p:cellEditor>
                        <f:facet name="output">
                            <h:outputText value="#{parameter.value}" />
                        </f:facet>
                        <f:facet name="input">
                            <p:inputText value="#{parameter.value}" style="width:96%"
                                label="Parameter Value" />
                        </f:facet>
                    </p:cellEditor>
                </p:column>

                <p:column headerText="Action" style="width:10%">
                    <p:commandButton value="Button in table"
                        action="#{devTestController.doAction()}" />
                </p:column>
            </p:dataTable>
            <p:commandButton value="Button outside table"
                action="#{devTestController.doAction()}" />
        </h:form>
        <p:commandButton value="Button outside form"
            action="#{devTestController.doAction()}" />
</h:body>
</html>

Кажется, вам не хватает закрывающего тега для <ui:composition>,

Другие вопросы по тегам