2013-09-05 6 views
5

मैं एक GET पद्धति इतनी तरह लिखा के साथ एक नियंत्रक है बात आईडी, और चीज़/edit.jsp पर मेरा जेएसपी पेज दिखाता है।स्प्रिंग वेब MVC, @ModelAttribute और @RequestParam एक साथ

JSP है:

<html> 
<body> 
    <h1 id="title" class="title">Edit Thing</h1> 

<form:form id="thing" modelAttribute="thing"> 
    <form:input path="subject" id="subject" tabindex="1" /> 
    <form:textarea path="message" /> 

</form:form> 

</body> 
</html> 

फिर भी, JSP विषय और संदेश के लिए खाली मान प्रदर्शित करता है। हां, उन गुणों पर गेटर्स/सेटर्स हैं।

मेरे पास एक बहुत ही समान नियंत्रक है जो ठीक काम करता है, सिवाय इसके कि वहां GET-mapped विधि के हस्ताक्षर में कोई @RequestParam नहीं है।

मैंने स्प्रिंग वेबएमवीसी दस्तावेज़ों में कहीं भी नहीं देखा है जो कहता है कि मैं ऐसा नहीं कर सकता - यह क्यों काम नहीं कर रहा है? अद्यतन मॉडल एट्रिब्यूट ऑब्जेक्ट जेएसपी फॉर्म में क्यों बाध्य नहीं है?

संपादित करें:

इस नियंत्रक, और प्राप्त कॉल के लिए यह एक ही पैटर्न में काम किया है कई कई विभिन्न स्थानों - चर @ModelAttribute साथ एनोटेट में विधि तो JSP पेज को प्रदर्शित करने के लिए उपलब्ध द्वारा भरा जाता है। क्यों, @RequestParam एनोटेशन जोड़कर, क्या यह रुकता है?

public String editThing(@RequestParam("thingId") String thingId, 
@ModelAttribute("thing") ThingBean thing, BindingResult result) { 
.... 
} 

यदि उपरोक्त उपयोग यह काम नहीं करता:

@RequestMapping(value = "/Things.html", method = RequestMethod.GET) 
public String getThings(@ModelAttribute ThingForm thingForm, BindingResult result) { 

    try { 
     // need to get list of Things 
     List<Thing> Things = <service call that gets list of Things>; 
     thingForm.setThings(Things); 
     logger.debug("Things are {}", Things); 

    } 
    catch (ResourceNotFoundException e) { 
     return "error"; 
    } 

    logger.debug("Thing list loading - end"); 

    // Go to jsp 
    return "thing/list"; 
} 
+0

आप हमें अपने अन्य controller.and क्या M.Deinum ने कहा है कि सही है दिखा सकते हैं (और अपने विधि में अपने कोड से पहचानने अपने Thingbean मॉडल विशेषता सुंदर बेकार मैं निम्नलिखित है कि फिर से लिखने होता है)। – beinghuman

+0

counterexample जोड़ने के लिए संपादित प्रश्न। –

+1

जैसा कि मैंने आपके द्वारा पोस्ट किए गए नियंत्रक में मेरे उत्तर में उल्लेख किया है कि आप ** एक चर (फिर से तर्क) को फिर से असाइन कर रहे हैं, आप उस विधि को पार नहीं कर रहे हैं जिसे आप विधि में पास करते हैं। नियंत्रक में आप कहते हैं कि यह काम करता है ** ** किसी ऑब्जेक्ट में कुछ जोड़ें जो मॉडल ऑब्जेक्ट के रूप में कार्य करता है। मूल रूप से यह काफी अलग है। –

उत्तर

7

समस्या यह है कि आप केवल चीज़ के लिए एक नया संदर्भ निर्दिष्ट कर रहे हैं, जो जावा में कभी भी काम नहीं करेगा। आपको इसे मॉडल में रखना होगा, यह आपके विचार के लिए ज्ञात नहीं होगा।

@RequestMapping(value = "/Thing.html", method = RequestMethod.GET) 
public String editThing(@RequestParam("thingId") String thingId, @ModelAttribute ThingBean thing, BindingResult result) { 
    thing = <some service call using thingId> // This is only assigning a new reference not updating 
    logger.debug("The thing to edit is {}", thingBean); 
    return "thing/edit"; 
} 

बजाय इस

@RequestMapping(value = "/Thing.html", method = RequestMethod.GET) 
public String editThing(@RequestParam("thingId") String thingId, @ModelAttribute ThingBean thing, BindingResult result, Model model) { 
    thing = <some service call using thingId> 
    model.addAttribute("thing", thing); 
    logger.debug("The thing to edit is {}", thingBean); 
    return "thing/edit"; 
} 

कौन सा मुझे आश्चर्य है कि क्यों आप भी इस विधि में एक मॉडल विशेषता क्या है बनाता है? यह मूल रूप से बेकार है।

ऊपर मैं इस

@ModelAttribute("thing") 
public Thing prepareModel(@RequestParam("thingId") String thingId) { 
    return thingSergice.findById(thingId); 
} 

की तरह कुछ करना होगा करने के बजाय

अब इस विधि हर अनुरोध को संभालने विधि से पहले सक्रिय किया जाएगा। जिसमें आप इसे हर बार देखने के बजाय बस इसका उल्लेख कर सकते हैं।

@RequestMapping(value = "/Thing.html", method = RequestMethod.GET) 
public String editThing() { 
    return "thing/edit"; 
} 
+0

इसलिए मैंने एक counterexample जोड़ा, और उस पैटर्न ने बार-बार काम किया है। ModelAttribute के साथ एनोटेटेड वैरिएबल जीईटी-एनोटेटेड विधि द्वारा अपडेट किया गया था, और जेएसपी में उपलब्ध था। मेरे नए के साथ एकमात्र अंतर अनुरोधपारा एनोटेटेड पैरामीटर जोड़ना था। –

+0

जैसा कि मैंने अपनी दूसरी टिप्पणी में उल्लेख किया है, वे वही नहीं हैं ... जो काम नहीं कर रहा है, आप ** फिर से असाइन कर रहे हैं ** जबकि दूसरा ** ** मॉडल ऑब्जेक्ट अपडेट कर रहा है। –

+0

एआरजीएच। बेवकूफ प्रोग्रामर सिंड्रोम। मैं हाल ही में बहुत अधिक साइड-सी प्रोग्रामिंग कर रहा हूं। धन्यवाद, निश्चित रूप से मैं इसे अब देखता हूं। –

1

आप सुधार निम्नलिखित ModelAttribute नाम, उपयोग निर्दिष्ट करना भूल

public String editThing(@RequestParam("thingId") String thingId, 
    @ModelAttribute("thing") ThingBean thing, BindingResult result, Model model) { 
      .... 
    thing = <some service call using thingId> 
    logger.debug("The thing to edit is {}", thingBean); 
    model.addAttribute("thing",thing); 
    return "thing/edit"; 
} 
यदि संभव हो तो

, मैं बेहतर नामकरण का उपयोग करना चाहिये घटकों के लिए सम्मेलन, उदाहरण के लिए- thingModelthing के बजाय। यह आपके और दूसरों के लिए बेहतर पठनीयता को बढ़ावा देता है।

+0

मैंने उत्पादन कोड को फिर से बनाया। मेरा विश्वास करो, इसे "चीज़" से बेहतर नाम दिया गया है –

+0

वैसे, आपको जावा 8 में नाम निर्दिष्ट करने की आवश्यकता नहीं है। – naXa

संबंधित मुद्दे