2013-09-18 8 views
0

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

<!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 (р: CommandButton). Один находится внутри dataTable (итерирующий компонент), один находится за пределами dataTable, а один находится за пределами h: form. Удивительно, но единственная работающая за пределами h: form (последняя). Я искал интернет в течение 5 часов и уже много пробовал. Я не понимаю, почему это происходит. Я читал много сообщений о подобных проблемах, но никто из них не решил мое дело. Очень хороший this от BalusC. Я прочитал все случаи, и я не могу найти ответ. Сначала я подозревал, что я вложил несколько компонентов UIForm друг в друга (случай 2), и я искал в исходном файле xhtml, который содержит выше, но это не так. У меня нет других тегов h: form в моем коде, кроме этого. В конце концов, если я полностью удалю тег h: form, то no commandButton работает, и я также получаю «Компонент формы должен иметь UIForm в своей родословной. Предложение: приложить необходимые компоненты в h: form" предупреждение. Что здесь может пойти не так?

ответ

2

Как @Omar указывает, что вы забыли этот закрывающий тег, даже я предполагаю, что это ошибка при публикации вопроса. Appart от этого, я тестировал самостоятельно, и он работает для меня (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> 
+0

Кажется, что у меня не было «setSelectedRow» в моей фасоли. Сейчас все работает отлично. Спасибо! –

+1

Добро пожаловать! Обратите внимание, что здесь вообще не нужно 'ui: composition'. Более того, это делает таблицу ваших перфолей не соответствующей стилю. –

0

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

+0

Просто забыл поставить его в должности. Отредактировано –

+0

Я вижу, спасибо @StefanosKargas – Omar

+0

Да, я согласен с вами. Это слишком старо, возможно, я не смог опубликовать комментарий в то время. – Omar

Смежные вопросы