Навигация по приложению JSF - PullRequest
0 голосов
/ 12 ноября 2011

Я создал простое приложение JSF, которое представляет вопрос пользователю и набор возможных ответов в виде переключателей.

Когда пользователь выбирает ответ и отправляет запрос, мой компонент обновляет вопрос и возвращает ту же страницу, так что отображается новый вопрос. Если последний вопрос достигнут, возвращается конечная страница с результатами.

Это работает нормально, но проблема возникает, когда пользователь нажимает кнопку браузера назад и повторно отправляет форму ... это увеличивает 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>

Метод бина вызывается, когда пользователь нажимает «следующий вопрос»:

public String processAnswer()
{           
    Question q = questions.get(currentQuestion);

    currentQuestion++;
    userAnswers.add(currentAnswer);

    if (currentQuestion == questions.size())
    {
        this.processResults();
        return "finish";
    }
    else 
    {
        return "index";            
    }
}

Как я могу решить это?

Спасибо!

1 Ответ

1 голос
/ 14 ноября 2011

Несмотря на то, что я не очень разбираюсь в вашей логике, я попробую что-то вроде этой опции (принимая во внимание возможность получения вызова со всеми обработанными ответами):

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;
}

Но он не создает сплошной код, потому что код игнорирует все отправленные после использования кнопки назад.

Я бы действительно имел значение currentquestion в ah: inputHidden, поэтому, если вы используете кнопку «Назад» и отправляете запрос, вы отправите значение currentquestion, и это значение будет соответствовать вопросу, на который ответил пользователь, так что вы получите иметь возможность обновить ответ и перейти к следующему вопросу, несмотря на то, что он использовал кнопку «назад» n раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...