2013-04-23 119 views
0

我正在使用primefaces 3.5,Glassfish 3.1.2和Java EE。我试图创建一个页面,在表中创建一个“问题”。我有一个数据表,其中包含用户在尝试回答问题时选择的“答案”。为什么我的命令按钮不工作?

作为一个选择题琐事测验,他们需要有一个或多个答案是正确的,其余的都是正确的。我允许每个问题有2-6个答案,并且有多达4个答案。所以我有一个持有答案的p:dataTable元素,并且我有3个commandButtons添加,删除或编辑表中的答案,每个答案都有一个点击运行的服务器端方法。但是,没有任何方法运行。没有错误也没有例外,只是没有任何作用。

这里是我的网页(我在内的整个页面,以防万一我有一个错误在其他地方):

<h:form id="createQForm"> 
    <h1>Create A Question</h1> 
    <p:messages id="msgs"/> 
    <p:selectOneMenu 
     value="#{createQuestionBean.selectedCategory}" 
     id="lstCategory" required="true" > 

     <f:selectItems 
      value="#{createQuestionBean.categories}" /> 
     <p:ajax listener="#{createQuestionBean.onSelectCategory}" 
       update="lstSubCategory" /> 
    </p:selectOneMenu> 
    <p:selectOneMenu 
     value="#{createQuestionBean.selectedSubCategory}" 
     id="lstSubCategory" required="false"> 

     <f:selectItem itemLabel="No Sub-Category" 
         noSelectionOption="true" /> 

     <f:selectItems 
      value="#{createQuestionBean.subCategories}"/> 

    </p:selectOneMenu> 
    <h:panelGrid columns="3"> 
     <h:outputLabel for="txtQuestion" id="lblQuestion" value="Question: *" /> 
     <p:inputText value="#{createQuestionBean.entry.question}" 
        id="txtQuestion" required="true" 
        requiredMessage="You must provide a question" 
        validatorMessage="#{createQuestionBean.QUESTION_VALIDATION_MESSAGE}"> 
      <f:validateRegex pattern=".*[\s\d\w]" /> 
      <p:ajax update="msgQuestion" event="keyup" /> 
     </p:inputText> 
     <p:message for="txtQuestion" id="msgQuestion" display="icon"/> 
    </h:panelGrid> 
    <h:outputText value="Horizontal: " /> 

    <p:selectManyCheckbox value="#{createQuestionBean.selectedOptions}"> 
     <f:selectItem itemLabel="Randomizable?" itemValue="randomizable" /> 
     <f:selectItem itemLabel="Multiple Choice?" itemValue="multichoice" /> 
    </p:selectManyCheckbox> 


    <p:fileUpload 
     value="#{createQuestionBean.questionImage}" mode="simple" 
     allowTypes="/(\.|\/)(gif|jpe?g|png)$/" 
     label="Select Images (jpg or png)" 
     sizeLimit="2097152" 
     invalidFileMessage="Sorry, only files of type .jpg, .png or .gif are allowed" 
     invalidSizeMessage="Sorry, files are limited in size to 2 Mb"/> 
    <p:dataTable 
     id="answersTable" var="answer" style="width: 250px" 
     value="#{createQuestionBean.datamodel}" 
     selection="#{createQuestionBean.selectedAnswer}" 
     editMode="cell" editable="true" 
     selectionMode="single"> 

     <p:column style="width:75%"> 
      <p:cellEditor > 
       <f:facet name="output"> 
        <h:outputText 
         value="#{answer.answer.testAnswer}" /> 
       </f:facet> 
       <f:facet name="input"> 
        <p:inputText 
         id="modelInput" 
         style="width: 97%;height: 97%" 
         value="#{answer.answer.testAnswer}"/> 
       </f:facet> 
      </p:cellEditor> 
     </p:column> 
     <p:column style="width:25%"> 
      #{answer.correct ? "Correct" : "Wrong" } 
     </p:column> 

    </p:dataTable> 
    <h:panelGrid columns="3"> 
     <p:commandButton 
      update="answersTable" ajax="true" 
      actionListener="#{createQuestionBean.removeSelect}" 
      value="Remove Selected -"/> 
     <p:commandButton 
      update="answersTable" ajax="true" 
      actionListener="#{createQuestionBean.setAsCorrect}" 
      value="Set Selected As Right"/> 
     <p:commandButton 
      update="answersTable" ajax="true" 
      value="Add +" 
      actionListener="#{createQuestionBean.addAnswer}"/> 

    </h:panelGrid> 
    <p:commandButton 
     action="#{createQuestionBean.saveAndStoreEntry()}" /> 
</h:form> 

下面是被调用的方法:

public void addAnswer() { 
    System.out.println("***** CALLED ADD ANSWER"); 
    answers.add(new QuestionAnswers()); 
    answers.get(answers.size() - 1).setCorrect(false); 
    setIDs(); 
    //set the data models 
    datamodel = new QuestionAnswersDataModel(new ArrayList<QuestionAnswers>(answers)); 
} 

public void removeSelect() { 
    System.out.println("***** CALLED REMOVE SELECT"); 
    if (selectedAnswer == null && !answers.contains(selectedAnswer)) { 
     FacesUtils.addErrorMessage(NO_SELECTION_ERROR); 
    } else { 
     answers.remove(selectedAnswer); 
    } 
    setIDs(); 
    //set the data models 
    datamodel = new QuestionAnswersDataModel(new ArrayList<QuestionAnswers>(answers)); 
} 

public void setAsCorrect() { 
    System.out.println("***** CALLED SET AS CORRECT"); 
    if (selectedAnswer != null) { 
     selectedAnswer.setCorrect(true); 
     if (!entry.getMultichoice()) { 
      for (QuestionAnswers questionAnswers : answers) { 
       if (questionAnswers != selectedAnswer) { 
        questionAnswers.setCorrect(false); 
       } 
      } 
     } 
    } else { 
     FacesUtils.addErrorMessage(NO_SELECTION_ERROR); 
    } 
    setIDs(); 

    //set the data models 
    datamodel = new QuestionAnswersDataModel(new ArrayList<QuestionAnswers>(answers)); 
} 

我在每种方法中添加了断点以查看是否调用了系统输出。

我在做什么错?我虽然也许是因为我没有在方法调用中使用AjaxBehaviourEvent,但这并没有改变。

回答

0

我发现它是什么。我删除了每个元素,并发现它是我的输入文本框。我删除了验证器,但它仍然无效。然后我发现它正在使用实体验证(IE,它不能为空或空白),即使我从未说过任何验证是必需的。一旦我在框中有文本,这些方法就会毫无错误地运行。

+0

您是否尝试使用commandButton的属性“process =”@ this“' – 2013-04-24 01:24:24

相关问题