Spring 3 MVC - как превратить форму в строку запроса?

У меня есть простая форма Spring, которая связывается с объектом формы на сообщении. http обработчик POST делает некоторую работу и затем должен перенаправить к новому URL, передав данные формы как querystring параметры.

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

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

Теперь, Spring автоматически свяжет значения ОТ querystring или сообщения формы в мой объект формы, но я хочу ГЕНЕРИРОВАТЬ querystring со значениями, принявшими от объекта формы.

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

Спасибо.

6
задан David 23 March 2010 в 16:58
поделиться

3 ответа

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

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

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

2) Объект модели все еще удерживается Spring, когда контроллер возвращается, и Spring БУДЕТ автоматически добавлять любые значения в него по указанному вами URL-адресу (в качестве параметров запроса) - ПРИ УСЛОВИИ, что значения модели являются простыми строковыми или примитивными объектами. Теперь, поскольку объект поддержки формы является объектом, хранящимся как единственный атрибут, 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 = value; param2 = value

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

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

2
ответ дан 17 December 2019 в 07:02
поделиться

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

0
ответ дан 17 December 2019 в 07:02
поделиться
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
2
ответ дан 17 December 2019 в 07:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: