Spring MVC Validation - Избегать POST-back - PullRequest
1 голос
/ 22 марта 2011

Я хотел бы проверить форму Spring 3 MVC.Когда элемент недействителен, я хочу повторно отобразить форму с сообщением проверки.Пока все довольно просто.Суть в том, что когда пользователь нажимает обновить после неверной отправки, я не хочу, чтобы он POST, я хочу, чтобы они получили.Это означает, что мне нужно выполнить перенаправление из формы POST (отправка), чтобы повторно отобразить форму с сообщениями проверки (форма отправляется через POST).

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

Это звучит правильно?Есть ли лучший способ сделать это?

Ответы [ 3 ]

1 голос
/ 06 мая 2011

Чтобы решить эту проблему, я сохраняю объект Errors в сеансе после перенаправления на POST.Затем, на GET, я положил его обратно в модель.Здесь есть некоторые дыры, но они должны работать 99,999% времени.

public class ErrorsRedirectInterceptor extends HandlerInterceptorAdapter {
    private final static Logger log = Logger.getLogger(ErrorsRedirectInterceptor.class);

    private final static String ERRORS_MAP_KEY = ErrorsRedirectInterceptor.class.getName()
            + "-errorsMapKey";

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response,
            Object handler, ModelAndView mav)
        throws Exception 
    {
        if (mav == null) { return; }

        if (request.getMethod().equalsIgnoreCase(HttpMethod.POST.toString())) {
            // POST
            if (log.isDebugEnabled()) { log.debug("Processing POST request"); }
            if (SpringUtils.isRedirect(mav)) {
                Map<String, Errors> sessionErrorsMap = new HashMap<String, Errors>();
                // If there are any Errors in the model, store them in the session
                for (Map.Entry<String, Object> entry : mav.getModel().entrySet()) {
                    Object obj = entry.getValue();
                    if (obj instanceof Errors) {
                        if (log.isDebugEnabled()) { log.debug("Adding errors to session errors map"); }
                        Errors errors = (Errors) obj;
                        sessionErrorsMap.put(entry.getKey(), errors);
                    }
                }
                if (!sessionErrorsMap.isEmpty()) {
                    request.getSession().setAttribute(ERRORS_MAP_KEY, sessionErrorsMap);
                }
            }
        } else if (request.getMethod().equalsIgnoreCase(HttpMethod.GET.toString())) {
            // GET
            if (log.isDebugEnabled()) { log.debug("Processing GET request"); }
            Map<String, Errors> sessionErrorsMap =
                    (Map<String, Errors>) request.getSession().getAttribute(ERRORS_MAP_KEY);
            if (sessionErrorsMap != null) {
                if (log.isDebugEnabled()) { log.debug("Adding all session errors to model"); }
                mav.addAllObjects(sessionErrorsMap);
                request.getSession().removeAttribute(ERRORS_MAP_KEY);
            }
        }
    }
}
0 голосов
/ 22 марта 2011

Такой подход называется шаблоном проектирования PRG (POST / REdirect / GET), который я объяснил несколько дней назад в качестве одного из ответов:

Пример простого перенаправления MVC Spring MVC

Надеюсь, это поможет :)

0 голосов
/ 22 марта 2011

Это не ясно из вашего вопроса, но похоже, что ваши действия GET и POST отображаются на один и тот же обработчик. В этом случае вы можете сделать что-то вроде:

if ("POST".equalsIgnoreCase(request.getMethod())) {
    // validate form
    model.addAttribute(form);
    return "redirect:/me.html";
}
model.addAttribute(new MyForm());
return "/me.html";

В JSP проверьте наличие ошибок в форме и выведите на экран при необходимости.

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