#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 отлично работает. Спасибо! Я не знал, что это так называется.