Запрет повторной отправки формы при обновлении в Struts2 (с сохранением сообщений действий и сообщений полей) - PullRequest
0 голосов
/ 11 декабря 2011

Я получил простую проверку формы и отправку, которая прекрасно работает

Вот мой struts.xml:

    <action name="register" class="registerAction">
        <interceptor-ref name="defaultWithoutAuthenticationStack"/>
        <result type="tiles" name="input">
            <param name="titleKey">global.title.register</param>
            <param name="location">register</param>
        </result>
        <result type="tiles" name="success">register.success</result>
    </action>

Моя форма jsp:

<s:form method="post" action="register.action" validate="true">
    <s:textfield name="usernameRegister" id="usernameRegister" key="global.username" labelposition="left" />
    <s:password name="passwordRegister" id="passwordRegister" key="global.password" labelposition="left" />
    <s:password name="passwordConfirmRegister" id="passwordConfirmRegister" key="global.password.confirm" labelposition="left" />
    <s:textfield name="emailRegister" id="emailRegister" key="global.email" labelposition="left" />
    <s:submit key="global.register" name="submitRegister" method="goRegister"></s:submit>
</s:form>

Имоя функция отправки:

public String goRegister(){
    user.setUsername(getUsernameRegister());
    user.setPassword(getPasswordRegister());
    user.setEmail(getEmailRegister());
    userService.addUser(user);

    ArrayList<String> successMessageUsername = new ArrayList<String>();

    successMessageUsername.add(getUsernameRegister());
    this.addActionSuccess(getText("global.register.success", successMessageUsername));
    return SUCCESS;
}

Ничего особенного!

Проблема в том, что у меня есть окна, запрашивающие информацию о повторной отправке формы, когда я обновляю свою страницу на странице успеха или странице формы (когда проверка не удалась)

Как я могу предотвратить это?

Thx

РЕДАКТИРОВАТЬ: я добавляю сохранение сообщений действий и полей сообщений на мой вопрос Как сохранить сообщения действий и полей сообщений (проверка) с перенаправлением?

Ответы [ 2 ]

2 голосов
/ 11 декабря 2011

Используйте шаблон post-redirect-get .

В случае успеха, перенаправьте на страницу «Вы зарегистрировались». Таким образом, если пользователь обновляется, он просто снова получает ту же страницу.

0 голосов
/ 13 декабря 2011

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

Вот мой ответ, больше не нужно обновлять, отправлять или пересылать вашу форму повторно и сохранять сообщения ValidationAware (ошибки и сообщения)

Мои Struts.xml:

    <action name="register" class="registerAction">
        <interceptor-ref name="defaultWithoutAuthenticationStack"/>
        <result type="tiles" name="input">
            <param name="titleKey">global.title.register</param>
            <param name="location">register</param>
        </result>
        <result name="success" type="redirectAction">index</result>
    </action>

    <action name="goRegister" class="registerAction">
        <interceptor-ref name="defaultWithoutAuthenticationStack"/>
        <result name="input" type="redirectAction">register</result>
        <result name="success" type="redirectAction">index</result>
    </action>

И мой JSP:

    <s:form method="post" action="goRegister" validate="true">
    <s:textfield name="usernameRegister" id="usernameRegister" key="global.username" labelposition="left" />
    <s:password name="passwordRegister" id="passwordRegister" key="global.password" labelposition="left" />
    <s:password name="passwordConfirmRegister" id="passwordConfirmRegister" key="global.password.confirm" labelposition="left" />
    <s:textfield name="emailRegister" id="emailRegister" key="global.email" labelposition="left" />
    <s:submit key="global.register" name="submitRegister" method="goRegister"></s:submit>
</s:form>

Я нашел ответ на сохранение сообщений здесь , парень хранит разные сообщения действий (сообщения, ошибки, ошибки полей) в сеансе, когда мы находимся в ситуации перенаправления, и в противном случае отправляю их в сообщения действий

Вот моя реализация (вы обнаружите, что я добавляю сообщения об успехе к сообщениям по умолчанию и сообщениям об ошибках):

public class MessagesInterceptor extends AbstractInterceptor {
/**
 * 
 */
private static final long serialVersionUID = -6230422534075664728L;
private Map<String, Object> session;

@Override
public String intercept(ActionInvocation invocation) throws Exception {
    session = invocation.getInvocationContext().getSession();
    MyAction action = (MyAction) invocation.getAction();

    this.addSessionMessagesInActionMessages(action);

    String output = invocation.invoke();
    Result result = invocation.getResult();

    // If it's a redirection, store the messages in session
    if(result instanceof ServletRedirectResult || result instanceof ServletActionRedirectResult)
        this.addActionMessagesInSessionMessages(action);

    return output;
}

@SuppressWarnings("unchecked")
private void addSessionMessagesInActionMessages(MyAction action) {
    Object messagesObject = getSession().remove(SESSION_ACTION_MESSAGES);
    if (messagesObject != null) {
        List<String> sessionMessages = (List<String>)messagesObject;
        for (String sessionMessage : sessionMessages) {
            action.addActionMessage(sessionMessage);
        }
    }

    Object errorsObject = getSession().remove(SESSION_ACTION_ERRORS);
    if (errorsObject != null) {
        List<String> sessionErrors = (List<String>)errorsObject;
        for (String sessionError : sessionErrors) {
            action.addActionError(sessionError);
        }
    }

    Object successObject = getSession().remove(SESSION_ACTION_SUCCESS);
    if (successObject != null) {
        List<String> sessionSuccessList = (List<String>)successObject;
        for (String sessionSuccess : sessionSuccessList) {
            action.addActionSuccess(sessionSuccess);
        }
    }

    @SuppressWarnings("rawtypes")
    Map<String, List<String>> fieldErrors = (Map) session.remove(SESSION_FIELD_ERRORS);
    if (fieldErrors != null && fieldErrors.size() > 0){
        for (Map.Entry<String, List<String>> fieldError : fieldErrors.entrySet()){
            for (String message : fieldError.getValue()){
                action.addFieldError(fieldError.getKey(), message);
            }
        }
    }
}

protected void addActionMessagesInSessionMessages(MyAction action) throws Exception{
    Collection<String> actionErrors = action.getActionErrors();

    if (actionErrors != null && actionErrors.size() > 0){
       session.put(SESSION_ACTION_ERRORS, actionErrors);
    }

    Collection<String> actionMessages = action.getActionMessages();

    if (actionMessages != null && actionMessages.size() > 0){
       session.put(SESSION_ACTION_MESSAGES, actionMessages);
    }

    Collection<String> actionSuccess = action.getActionSuccess();

    if (actionSuccess != null && actionSuccess.size() > 0){
       session.put(SESSION_ACTION_SUCCESS, actionSuccess);
    }

    Map<String, List<String>> fieldErrors = action.getFieldErrors();

    if (fieldErrors != null && fieldErrors.size() > 0){
       session.put(SESSION_FIELD_ERRORS, fieldErrors);
    }
}

public Map<String, Object> getSession() {
    return session;
}

public void setSession(Map<String, Object> session) {
    this.session = session;
}

}

MyAction наследует ActionSupport

Надеюсь, это кому-нибудь поможет;)

Сообщения действий и сообщения проверки полей теперь сохраняются без проблем обновления

Но значения моих полей теперь пустые, как мне получить / сохранить их, чтобы заполнить мои поля?

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