Плагин Struts 2 Conversation Scope без @EndConversation

Рассмотрим приведенный ниже пример, который, как мне кажется, является очень распространенным образцом ступенчатых форм. У меня есть трехэтапная форма, которая хочет перевести деньги со счета на другой:

First  page gets user source account
Second page shows source account and gets destination account and the amount
Last   page shows a confirmation which mention source account + destination account + amount

Как видите, мне также нужна информация о модели на последней странице. Поэтому я использую @BeginConversation для первого действия и @ConversationAction для второй и последней страницы.

Вопрос в том, что ни одно из моих действий не помечено @EndConversation. Это нормально?! Будет ли модель находиться в памяти или она будет автоматически очищена? Я не мог найти, когда он очищается автоматически.


person Alireza Fattahi    schedule 06.11.2013    source источник


Ответы (1)


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

Конечно, если вы не закончите разговор, ресурсы памяти не будут освобождены. Вы можете получить некоторую информацию об этом на сайте плагина разговора strut2: https://code.google.com/p/struts2-conversation/wiki/UsageGuide#Memory_Management

Там вы можете увидеть, что можно установить некоторые параметры, связанные с истечением срока действия ветки разговора, и их количество, которое можно использовать одновременно:

<!-- monitoring frequency in milliseconds -->
<constant name="conversation.monitoring.frequency" value="300000"/>

<!-- idle conversation timeout in milliseconds -->
<constant name="conversation.idle.timeout" value="28800000"/>

<!-- max instances of a conversation -->
<constant name="conversation.max.instances" value="20"/>

<!-- number of timeout monitoring threads -->
<constant name="conversation.monitoring.thread.pool.size" value="20"/>

Во всяком случае, я решил эту проблему, добавив результат перенаправления в последнее действие, которое вызывает действие, содержащее тег @EndConversation. В нем я просто поставил результат, который хотел, чтобы он был последним. Переменные полей диалога по-прежнему правильно установлены и доступны.

@ConversationAction(conversations = "form")
@Action(value="formSecondLast", results={@Result(name=SUCCESS, type = "redirect", location="formLast")})
public String formSecondLast() throws Exception {
    //Here goes the code you want it to manipulate the conversation field data.
    //Maybe save to the database or send it to the business tier.
    return SUCCESS;
}

@EndConversation(conversations = "form")
@Action(value="formLast", results={@Result(name=SUCCESS, location="/jsp/form-end.jsp")})
public String formEnd() throws Exception {
    // This is a dummy action that does not do anything.
    // It is called just after formSecondLast ends and sends the user the jsp page.
    return SUCCESS;
}
person Yenyen    schedule 07.11.2013
comment
Моя проблема заключается в том, что мое последнее действие будет перенаправлено на страницу last.jsp для подтверждения. Разговор заканчивается, когда пользователь видит страницу подтверждения last.jsp. Я никак не могу запустить новое действие с аннотацией EndConversation. Потому что разговор заканчивается, когда пользователь видит окончательный jsp, и я не могу попросить его нажать кнопку «Готово», чтобы запустить фиктивное действие с EndConversation. Или может быть вызов AJax для конечного действия. Я обнаружил, что в вашем ответе шаг addFour не имеет никакого результата jsp, моя проблема в том, что шаг addFour должен перенаправляться в jsp. Может быть, я не получить ваш комментарий! - person Alireza Fattahi; 07.11.2013
comment
Посмотрите, что я использую тип результата перенаправления. Когда пользователь переходит к четвертому шагу, это действие выполняет работу конечного действия. Когда он возвращается, он создает новый http-вызов действия addEnd без ведома пользователя. Вот как пользователь получает add-end.jsp - person Yenyen; 07.11.2013