2010-03-23 8 views
6

Mam prostą formę wiosenną, która zostaje przywiązana do obiektu formularza na poczcie. Procedura obsługi http POST działa, a następnie musi przekierować do nowego adresu URL, przekazując dane formularza jako parametry zapytania.Spring 3 MVC - jak zamienić formularz w ciąg zapytania?

Więc zakładając Mam formularz podkładową Obiekt z właściwościami „param1” i „param2” Chcę zbudować ciąg znaków, który wygląda mniej więcej tak:

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

Teraz wiosna automatycznie wiążą wartości z kwerendy lub postu formularza do obiektu formularza, ale chcę GENEROWAĆ kwerendę z wartościami wziętymi z obiektu formularza.

Oczywiście jest to trywialne, aby zrobić to ręcznie, ale ponieważ będę miał wiele różnych obiektów do tworzenia kopii, jest jakiś wbudowany obiekt w Spring, aby wygenerować ciąg zapytania z obiektu formularza, odpowiedni do wbudowania w URL?

Dzięki.

Odpowiedz

2

OK, po jakimś fragmencie kodu źródłowego Springa, myślę, że mam pewne ostateczne odpowiedzi.

1) Ręczne dodawanie parametrów zapytania do adresu URL, który został przekazany w ciągu "przekierowanie: ..." jest BARDZO ZŁE IDEA. Spring buforuje widoki, do których odnoszą się adresy URL, więc jeśli określisz wiele różnych parametrów, skutecznie przeciekasz pamięć, sprawiając, że pamięć podręczna będzie przechowywać wiele wartości, których nie potrzebuje.

Zauważ, że przykładowy kod PetClinic w dystrybucji wiosennym dokładnie to robi, i najwyraźniej doszło do Jira kwestia podniesiona w celu skorygowania go :-)

2) model obiekt jest nadal w posiadaniu wiosną, gdy kontroler zwraca, a Spring WILL automatycznie doda dowolne wartości do podanego adresu URL (jako parametry zapytania) - ZAPEWNIONY, że wartości modelu są zwykłymi obiektami String lub prymitywnymi. Ponieważ obiekt tworzący obiekt jest obiektem przechowywanym jako pojedynczy atrybut, Spring nie robi nic z nim.

A zatem - z kontrolera z adnotacjami najlepsze podejście wydaje się polegać na dodaniu parametru ModelMap do metody obsługi. ? Gdy jesteś gotowy, aby wrócić, zrób coś takiego:

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"; 

i wiosną wyda przekierowanie do/my/url param1 = value; param2 = wartość

Nie wydaje się być wbudowany mechanizm (na wiosnę), aby przekształcić komponent bean na listę par klucz/wartość do dodania do mapy, ale jeśli naprawdę tego potrzebujesz, biblioteka Apache BeanUtils będzie ładnie działała. Oczywiście nie chcesz tego robić w przypadku dużych obiektów, w przeciwnym razie możesz przekroczyć dozwoloną długość adresu URL.

Znalezienie że spośród wszystkich wydawało się być o wiele trudniejsze niż to potrzebne, aby być :-)

0

Myślę, że powinieneś użyć metody setExposeModelAttributes klasy RedirectView, ale może być trudno uzyskać dostęp do tej metody, jeśli używasz adnotacji Spring 3.0 na kontrolerach.

+0

nie wydają się działać ...Używam kontrolek z adnotacjami, więc mój kontroler jest zwykłą klasą java, nie dziedziczącą z żadnej klasy Spring. Jeśli utworzę nowy obiekt RedirectView i zwrócę go z kontrolera ... to nic nie doda do adresu URL. Nie widzę, jak obiekt RedirectView miałby odwoływać się do obiektu formularza - nie ma opcji ustawiającej ani konstruktora, która mogłaby przekazać w moim formularzu! – David

+0

Po przetworzeniu widoku RedirectView jest wywoływane renderMergedOutputModel. Ta metoda odbiera Twój model i renderuje poprawny adres URL. – uthark

+0

Jeśli utworzę nowy widok przekierowania, nie będzie on miał żadnego odniesienia do żadnego obiektu modelu. I nie ma żadnego ustawiciela, który dałby mu obiekt wzorcowy. Jeśli wywołasz metodę "render()" w widoku przekierowania, przekazując mapę zawierającą mój obiekt modelu, to po prostu wyrzuca wyjątek IllegalStateException w środowisku wykonawczym. Wygląda na to, że framework zapomniał włączyć obsługę tego przy korzystaniu z adnotacji ... – David

2
Map<String, Object> model = new HashMap<String, Object(); 
model.put("stuff", "here"); 
ModelAndView mv = new ModelAndView("redirect:/somewhere.htm", model); 
return mv; 

Produkuje

http://.../somewhere.htm?stuff=here 
Powiązane problemy