Spring 3 MVC - как превратить форму в строку запроса? - PullRequest
6 голосов
/ 23 марта 2010

У меня есть простая форма Spring, которая связывается с объектом формы в записи. Обработчик HTTP POST выполняет некоторую работу, а затем ему необходимо перенаправить на новый URL-адрес, передав данные формы в виде параметров строки запроса.

Итак, предполагая, что у меня есть объект поддержки формы со свойствами "param1" и "param2", я хочу создать строку, которая выглядит примерно так:

redirect:/app/new/page?param1=value;param2=value

Теперь Spring автоматически свяжет значения ИЗ строки запроса или сообщения формы с моим объектом формы, но я хочу СОЗДАТЬ строку запроса со значениями, взятыми из объекта формы.

Очевидно, что делать это вручную тривиально, но, поскольку у меня будет множество различных объектов поддержки форм, есть ли в Spring встроенная возможность генерировать строку запроса из объекта формы, подходящую для встраивания в URL

Спасибо.

Ответы [ 3 ]

2 голосов
/ 24 марта 2010

ОК, после некоторой трассировки исходного кода Spring, я думаю, что у меня есть некоторые окончательные ответы.

1) Добавление параметров запроса к URL-адресу, который вы возвращаете в строке «redirect: ...», является ОЧЕНЬ ПЛОХОЙ ИДЕЕЙ. Spring кэширует представления, на которые ссылаются эти URL-адреса, поэтому, если вы укажете множество различных параметров, вы фактически утечете память, заставив кэш-память хранить множество значений, в которых она не нуждается.

Обратите внимание, что пример кода PetClinic в дистрибутиве Spring делает именно это, и, очевидно, возникла проблема с Jira, чтобы исправить это: -)

2) Объект модели по-прежнему удерживается Spring, когда контроллер возвращается, и Spring автоматически добавляет любые значения в нем в указанный вами URL-адрес (в качестве параметров запроса) - ОБЕСПЕЧИВАЕТ, что значения модели - это простые String или примитивные объекты. Теперь, поскольку объект поддержки формы - это объект, хранящийся в виде одного атрибута, Spring ничего с ним не делает.

Итак, из аннотированного контроллера лучше всего добавить параметр ModelMap в метод обработчика. Когда вы будете готовы вернуться, сделайте что-то вроде этого:

Assuming the form backing object "formObject" has been passed as a parameter to the controller handler method (via the ModelAttribute annotation) and has properties "param1" and "param2" that are Strings -

modelMap.clear();
modelMap.addAttribute("param1", formObject.getParam1());
modelMap.addAttribute("param2", formObject.getParam2());
return "redirect:/my/url";

И Spring выдаст перенаправление на / my / url? Param1 = значение; param2 = значение

Похоже, не существует встроенного механизма (в Spring), чтобы превратить бин в список пар ключ / значение для добавления на карту, но если вам это действительно нужно, библиотека Apache BeanUtils подойдет мило. Конечно, вы не хотите делать это для больших объектов, в противном случае вы можете превысить допустимую длину URL.

Найти все это оказалось гораздо сложнее, чем нужно было: -)

2 голосов
/ 19 июня 2010
Map<String, Object> model = new HashMap<String, Object();
model.put("stuff", "here");
ModelAndView mv = new ModelAndView("redirect:/somewhere.htm", model);
return mv;

Выдает

http://.../somewhere.htm?stuff=here
0 голосов
/ 23 марта 2010

Я думаю, вам следует использовать метод setExposeModelAttributes класса RedirectView, но может быть сложно получить доступ к этому методу, если вы используете аннотации Spring 3.0 на своих контроллерах.

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