我正在使用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,但這並沒有改變。
您是否嘗試使用commandButton的屬性「process =」@ this「' – 2013-04-24 01:24:24