我创建了一个简单的JSF应用程序,它为用户提供了一个问题,并将一组可能的答案作为单选按钮。
当用户选择答案并提交时,我的bean会更新问题并返回相同的页面,以便显示新问题。如果到达最后一个问题,将返回包含结果的完成页面。
这很好用,但问题发生在用户单击浏览器后退按钮并重新提交表单时...这会增加bean.currentQuestion并破坏我的逻辑。
我试过f:ajax更新没有翻页的问题,但现在我不知道如何呈现完成页面...
//的index.xhtml
<h:form>
<div class="questionNumberDiv" id ="questionNumberDiv">
<h:outputLabel value="Question #{test.currentQuestion + 1}" for="questionLabel"/>
</div>
<br/>
<div class="questionDiv" id="questionDiv">
<h:outputLabel id ="questionLabel" value="#{test.questions[test.currentQuestion].question}"/>
</div>
<br/>
<div class="questionDiv" id="possibleAnswersDiv">
<h:selectOneRadio requiredMessage="Please, select one answer!" id="radio" layout="pageDirection" value="#{test.currentAnswer}" required="true">
<f:selectItems value="#{test.questions[test.currentQuestion].possibleAnswers}" var="y"
itemLabel="#{y}" itemValue="#{y}" />
</h:selectOneRadio>
</div>
<br/>
<h:panelGrid columns="2" styleClass="requiredMessage">
<h:commandButton value="next question" action ="#{test.processAnswer}" />
<h:message for="radio"/>
</h:panelGrid>
</h:form>
</h:body>
用户点击“下一个问题”时调用的Bean方法:
public String processAnswer()
{
Question q = questions.get(currentQuestion);
currentQuestion++;
userAnswers.add(currentAnswer);
if (currentQuestion == questions.size())
{
this.processResults();
return "finish";
}
else
{
return "index";
}
}
我该如何解决这个问题?
谢谢!
答案 0 :(得分:1)
尽管我对你的逻辑知之甚少,但我会尝试类似这个选项的东西(考虑到接收所有答案的电话的可能性):
public String processAnswer()
{
String outcome = null;
if (currentQuestion <= questions.size()) {
Question q = questions.get(currentQuestion);
currentQuestion++;
userAnswers.add(currentAnswer);
if (currentQuestion < questions.size()) {
outcome = "index";
} else {
this.processResults();
outcome = "finish";
}
} else {
outcome = "finish";
}
return outcome;
}
但它没有创建可靠的代码,因为代码在使用后退按钮后会忽略所有提交。
我确实在啊:inputHidden中有currentquestion值,所以如果你使用后退按钮并且你提交了你将提交currentquestion的值,并且该值将匹配用户回答的问题,所以你将能够更新答案,尽管已经使用了n次后退按钮,但仍然可以转到下一个问题。