Отображаются ли атрибуты сеанса в URL при обработке перенаправления записей в Spring MVC 3? - PullRequest
2 голосов
/ 23 января 2012

Я работаю с формами в Spring MVC, и я отправил форму и пытаюсь перенаправить запрос на публикацию, чтобы избежать повторной отправки формы с помощью кнопки обновления.

Но мне нужно, чтобы динамически сгенерированное значение отображалось на основена отправке формы на перенаправленной странице.Поэтому я сохраняю это значение в сеансе в методе пост-обработчика и возвращаю его обратно в методе перенаправленной обработки страницы.

Получу ли я отображенный атрибут сеанса на перенаправленной странице, как параметры запроса в случае метода GET?

Ниже приведен код, который я использую:

Этот метод обрабатывает отправку формы

@RequestMapping(value="/something", method=RequestMethod.POST) 
public String testStopped(Model model, WebRequest request, HttpSession session) {
    //...
    int foo = 1234;//some dynamically generated value
    session.setAttribute("foo", foo);
    return "redirect:/something/somethingelse";
}

Этот метод обрабатываетперенаправленная страница

@RequestMapping(value="/something/somethingelse") 
public String testStopped(Model model, HttpSession session) {
    ...
    Integer kungfoo = (Integer) session.getAttribute("foo");
    model.addAttribute("kungfoo", kungfoo);
    return "somethingelse";
}

Это URL, который я получаю после перенаправления: http://wikedlynotsmart.com/something/somethingelse?kungfoo=1234

Есть ли способ, чтобы ?kungfoo=1234 не отображался назавершить и все же передать его в метод обработчика запроса перенаправления?

Это так, как это должно работать, или я где-то совершаю ошибку?Может ли кто-нибудь помочь мне понять это?

Спасибо.

Ответы [ 2 ]

4 голосов
/ 23 января 2012

Цитата из документации :

По умолчанию все атрибуты модели считаются открытыми как URI. переменные шаблона в URL перенаправления. Из оставшихся атрибутов те, которые являются примитивными типами или коллекциями / массивами примитивов типы автоматически добавляются в качестве параметров запроса.

Это означает, что kungfoo является атрибутом вашей модели в первом методе, и поэтому он автоматически добавляется в качестве параметра запроса к URL-адресу перенаправления.

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

В аннотированных контроллерах, однако, модель может содержать дополнительные атрибуты, изначально добавленные для целей визуализации (например, раскрывающийся список значения полей). Чтобы получить точный контроль над атрибутами, используемыми в В сценарии перенаправления метод @RequestMapping может объявить аргумент типа RedirectAttributes и использовать его для добавления атрибутов для использования в RedirectView. Если метод контроллера перенаправляет, содержимое RedirectAttributes используется. В противном случае содержимое модели по умолчанию используется.

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

2 голосов
/ 23 января 2012

Вот что сработало для меня:

Добавление аргумента типа RedirectAttributes и добавление к нему foo в качестве атрибута flash.

Этот метод обрабатываетотправка формы

@RequestMapping(value="/something", method=RequestMethod.POST) 
public String testStopped(Model model, WebRequest request, RedirectAttributes redirectAttributes) {
    //...
    int foo = 1234;
    redirectAttributes.addFlashAttribute("foo", foo);
    return "redirect:/something/somethingelse";
}

Этот метод обрабатывает перенаправленную страницу;здесь ничего не нужно делать для "foo"

@RequestMapping(value="/something/somethingelse") 
public String testStopped() {
    return "somethingelse";
}

Вот как вы используете "foo" в someelse.jsp

${foo}

Иhttp://wikedlynotsmart.com/somethingelse - это то, что я получаю в URL.

...