私は、primefaces 3.5、Glassfish 3.1.2、および Java EE を使用しています。表に「質問」を作成するページを作成しようとしています。ユーザーが質問に答えようとするときに選択する「回答」を含むデータテーブルがあります。
多肢選択式の雑学クイズであるため、1 つ以上の答えが正しく、残りが正しい必要があります。質問ごとに 2 ~ 6 の回答があり、最大 4 つの正解があることを許可しています。したがって、回答を保持する ap: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 がなかったためかもしれませんが、何も変わりませんでした。