Когда валидатор находит ошибки формы, страница формы снова отображается на URL-адресе POST. - PullRequest
0 голосов
/ 12 мая 2011

Элемент отображается по этому 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 Ответ

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

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

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

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

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

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

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

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