JSF测验应用程序导航

时间:2011-11-12 17:40:41

标签: java ajax jsf navigation

我创建了一个简单的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";            
    }
}

我该如何解决这个问题?

谢谢!

1 个答案:

答案 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次后退按钮,但仍然可以转到下一个问题。