Когда средство проверки обнаруживает ошибки формы, страница формы повторно отображается по URL-адресу ПУБЛИКАЦИИ

#java #spring #spring-mvc

#java #spring #spring-mvc

Вопрос:

Элемент отображается по этому URL:

 /item/10101
  

используя этот метод контроллера:

 @RequestMapping(value = "/item/{itemId}", method = RequestMethod.GET)
public final String item(HttpServletRequest request, ModelMap model, 
    @PathVariable long itemId)
{
    model = this.fillModel(itemId);
    return "item";
}
  

Страница содержит форму, которая отправляется следующему методу в том же контроллере:

 @RequestMapping(value = "/process_form", method = RequestMethod.POST)
public final String processForm(HttpServletRequest request,
 @ModelAttribute("foo") FooModel fooModel,
    BindingResult bindResult,
    ModelMap model)
{

    FooModelValidator validator = new FooModelValidator();
    validator.validate(FooModel, bindResult);

      if (bindResult.hasErrors())
      {
        model = this.fillModel(fooModel.getItemId());
       return "item";
      }
    return "account";
}
  

Если средство проверки обнаруживает ошибки в форме, оно повторно отображает элемент, но вместо отображения его по исходному URL:

 /item/10101
  

оно отображает ее по своему собственному URL:

 /process_form
  

Возможно ли повторно отобразить форму по исходному URL?

 /item/10101
  

(Я пытался получить ссылку и перенаправить на нее в processForm , но тогда все содержимое модели в конечном итоге отображается в виде пар имя URL / значение:)

 @RequestMapping(value = "/process_form", method = RequestMethod.POST)
public final String processForm(HttpServletRequest request,
 @ModelAttribute("foo") FooModel fooModel,
    BindingResult bindResult,
    ModelMap model)
{
    String referrer = request.getHeader("referer");

    FooModelValidator validator = new FooModelValidator();
    validator.validate(FooModel, bindResult);

      if (bindResult.hasErrors())
      {
        model = this.fillModel(fooModel.getItemId());
       return "redirect:"   referrer;
      }
    return "account";
}
  

Ответ №1:

Короткий ответ: Нет.

Происходит перенаправление на стороне сервера (forward), которое выполняется в рамках того же запроса, и поэтому отправленные значения сохраняются (и отображаются в форме)

URL изменится, если вы используете перенаправление на стороне клиента ( return "redirect:item"; ), но в этом случае придет новый запрос, и отправленные значения будут потеряны.

Но вот два варианта, которые у вас есть:

  • используйте один и тот же URL в сопоставлениях для обоих методов и различайте их на основе метода запроса — GET для первого, POST для второго. Это может сбить с толку, поэтому задокументируйте это.

  • найдите / реализуйте область flash для spring-mvc. Там нет ничего встроенного. Область действия flash означает, что значения сохраняются (обычно в сеансе) для отправки и последующего перенаправления. Этот параметр включает ручную обработку, путем помещения отправленного объекта в сеанс, а затем его извлечения и удаления

Комментарии:

1. Область Flash отлично работает. Спасибо! Я не знал, что это так называется.