2010-03-23 9 views
6

मेरे पास एक साधारण वसंत रूप है जो पोस्ट पर एक फॉर्म ऑब्जेक्ट से जुड़ा हुआ है। Http POST हैंडलर कुछ काम करता है, और फिर क्वेरी डेटा को क्वेरीस्ट्रिंग पैरामीटर के रूप में पास करते हुए, एक नए यूआरएल पर रीडायरेक्ट करने की जरूरत है।वसंत 3 एमवीसी - एक फॉर्म स्ट्रिंग में एक फॉर्म कैसे चालू करें?

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

अब, वसंत स्वचालित रूप से होगा बाँध:

तो, यह सोचते हैं मैं गुण "param1" और "param2" के साथ एक फार्म समर्थन वस्तु है, मैं एक स्ट्रिंग है कुछ इस तरह दिखता निर्माण करना चाहते हैं मेरे फॉर्म ऑब्जेक्ट में क्वेरीस्ट्रिंग या फॉर्म पोस्ट से मान, लेकिन मैं फॉर्म ऑब्जेक्ट से लिया गया मानों के साथ एक क्वेरीस्ट्रिंग जेनरेट करना चाहता हूं।

स्पष्ट रूप से यह मैन्युअल रूप से करने के लिए तुच्छ है लेकिन चूंकि मेरे पास कई अलग-अलग फॉर्म बैकिंग ऑब्जेक्ट्स होने जा रहे हैं, क्या स्प्रिंग में कुछ अंतर्निहित सुविधा है जो एक फॉर्म ऑब्जेक्ट से क्वेरी स्ट्रिंग उत्पन्न करती है, जो कि निर्माण के लिए उपयुक्त है यूआरएल?

धन्यवाद।

उत्तर

2

ठीक है, वसंत स्रोत कोड में कुछ ट्रेसिंग के बाद, मुझे लगता है कि मेरे पास कुछ निश्चित उत्तर हैं।

1) एक यूआरएल में मैन्युअल रूप से क्वेरी पैरामीटर जोड़ना जो आप "रीडायरेक्ट: ..." स्ट्रिंग में वापस भेजते हैं, एक बहुत खराब आईडीई है। वसंत उन यूआरएल के विचारों को कैश करता है, इसलिए यदि आप कई अलग-अलग पैरामीटर निर्दिष्ट करते हैं, तो आप कैश को बहुत सारे मूल्यों को पकड़कर स्मृति को प्रभावी ढंग से रिसाव करते हैं, जिसकी आवश्यकता नहीं होती है।

ध्यान दें कि वसंत वितरण में PetClinic उदाहरण कोड वास्तव में यह करता है, और जाहिरा तौर पर वहाँ इसे सही करने के :-)

2) मॉडल वस्तु अभी भी वसंत द्वारा आयोजित किया जाता है जब नियंत्रक उठाया एक Jira मुद्दा रहा है रिटर्न, और स्प्रिंग स्वचालित रूप से आपके द्वारा निर्दिष्ट यूआरएल (क्वेरी पैरामीटर के रूप में) पर कोई भी मूल्य जोड़ देगा - प्रदान किया गया है कि मॉडल मान सादा स्ट्रिंग या आदिम ऑब्जेक्ट्स हैं। अब, चूंकि फॉर्म बैकिंग ऑब्जेक्ट एक ऑब्जेक्ट के रूप में संग्रहीत ऑब्जेक्ट है, इसलिए वसंत इसके साथ कुछ भी नहीं करता है।

तो - एक एनोटेटेड कंट्रोलर से, सबसे अच्छा तरीका हैंडलर विधि में मॉडलमैप पैरामीटर जोड़ना प्रतीत होता है। ? जब आप वापस जाने के लिए तैयार हैं, कुछ इस तरह करते हैं: करने के लिए/मेरी/यूआरएल

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

और वसंत में एक रीडायरेक्ट जारी करेगा param1 = मूल्य; param2 = मूल्य

वहाँ होने के लिए प्रकट नहीं होता है नक्शा में जोड़ने के लिए कुंजी/मूल्य जोड़े की सूची में एक बीन को चालू करने के लिए एक अंतर्निर्मित तंत्र (वसंत में), लेकिन यदि आपको वास्तव में इसकी आवश्यकता है, तो अपाचे बीनयूट्स लाइब्रेरी अच्छी तरह से करेगी। बेशक, आप बड़ी वस्तुओं के लिए ऐसा नहीं करना चाहते हैं अन्यथा आप एक यूआरएल की स्वीकार्य लंबाई से अधिक हो सकते हैं।

सब पता लगाना बहुत कठिन लग रहा था की तुलना में यह :-)

0

मुझे लगता है कि आपको RedirectView क्लास की विधि setExposeModelAttributes का उपयोग करना चाहिए, लेकिन यदि आप अपने नियंत्रकों पर स्प्रिंग 3.0 एनोटेशन का उपयोग करते हैं तो शायद इस विधि तक पहुंच प्राप्त करना मुश्किल हो सकता है।

+0

काम करने के लिए प्रतीत नहीं होता है होने की जरूरत ...मैं एनोटेटेड कंट्रोलर का उपयोग कर रहा हूं, इसलिए मेरा नियंत्रक सिर्फ एक सादा जावा वर्ग है, जो किसी स्प्रिंग क्लास से विरासत में नहीं है। यदि मैं एक नया रीडायरेक्ट व्यू ऑब्जेक्ट बनाता हूं और उसे नियंत्रक से वापस भेजता हूं ... यह यूआरएल में कुछ भी शामिल नहीं करता है। मैं नहीं देख सकता कि RedirectView ऑब्जेक्ट को फ़ॉर्म ऑब्जेक्ट का संदर्भ कैसे मिलेगा - मेरे फॉर्म में पास करने के लिए कोई सेटटर या कन्स्ट्रक्टर विकल्प नहीं है! – David

+0

जब RedirectView संसाधित किया जाता है renderMergedOutputModel कहा जाता है। यह विधि आपके मॉडल को प्राप्त करती है और सही यूआरएल प्रस्तुत करती है। – uthark

+0

यदि मैं एक नया रीडायरेक्ट व्यू बनाता हूं तो इसका किसी भी मॉडल ऑब्जेक्ट का कोई संदर्भ नहीं होगा। और इसे मॉडल ऑब्जेक्ट देने के लिए कोई सेटटर नहीं है। अगर मैं RedirectView पर "रेंडर()" विधि को कॉल करता हूं, तो मेरे मॉडल ऑब्जेक्ट वाले मानचित्र को पास करता है, तो यह रनटाइम पर एक IllegalStateException फेंकता है। ऐसा लगता है कि फ्रेमवर्क एनोटेशन का उपयोग करते समय ऐसा करने के लिए समर्थन शामिल करना भूल गया ... – David

2
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 
संबंधित मुद्दे