2012-12-15 30 views
6

में @ModelAttribute और @RequestAttribute एनोटेशन के उपयोग को समझना मैं वसंत एमवीसी में काफी नया हूं। वर्तमान में मैं Spring MVC Showcase का अध्ययन कर रहा हूं, जो स्प्रिंग एमवीसी वेब ढांचे की विशेषताओं को प्रदर्शित करता है।स्प्रिंग एमवीसी

मुझे यह समझने में कुछ समस्या है कि इस उदाहरण में कस्टम रिजोल्यूबल वेब तर्क कैसे प्रबंधित किए जाते हैं।

प्रैक्टिस में मेरे पास निम्न स्थिति है।

<a id="customArg" class="textLink" href="<c:url value="/data/custom" />">Custom</a> 

यह लिंक यूआरएल की दिशा में एक HTTP अनुरोध उत्पन्न: "/ डेटा/कस्टम"

नियंत्रक वर्ग कि विधि शामिल मेरी home.jsp ध्यान में रखते हुए मैं नीचे दिए गए लिंक है कि संभालती इस अनुरोध को निम्नलिखित कोड है:

@Controller 
public class CustomArgumentController { 

    @ModelAttribute 
    void beforeInvokingHandlerMethod(HttpServletRequest request) { 
     request.setAttribute("foo", "bar"); 
    } 

    @RequestMapping(value="/data/custom", method=RequestMethod.GET) 
    public @ResponseBody String custom(@RequestAttribute("foo") String foo) { 
     return "Got 'foo' request attribute value '" + foo + "'"; 
    } 

} 

विधि है कि इस HTTP अनुरोध हैंडल कस्टम() है। तो जब पिछला लिंक क्लिक किया गया है, HTTP अनुरोध कस्टम विधि द्वारा संभाला जाता है।

मुझे यह समझने में कुछ समस्या है कि @RequestAttribute एनोटेशन क्या करता है। मुझे लगता है कि, इस मामले में, यह foo नामक अनुरोध विशेषता को एक नए स्ट्रिंग foo चर में बांधता है। लेकिन जहां यह विशेषता से लिया गया है? क्या यह चर वसंत द्वारा लिया जाता है?

ठीक है, मेरा विचार यह है कि यह अनुरोध विशेषता HttpServletRequest ऑब्जेक्ट से ली गई है। मुझे ऐसा लगता है क्योंकि, इस वर्ग में, मैं भी beforeInvokingHandlerMethod() विधि एक बोल नाम है कि है, तो ऐसा लगता है कि इस विधि एक विशेषता, है नाम = foo और मूल्य = बार सेट, अंदर एक HttpServletRequest ऑब्जेक्ट, और उसके बाद कस्टम() विधि इस मान का उपयोग कर सकती है।

वास्तव में मेरी उत्पादन होता है:

गॉट 'foo के अनुरोध विशेषता मान' बार '

क्यों beforeInvokingHandlerMethod()कस्टम() विधि से पहले कहा जाता है?

और क्यों beforeInvokingHandlerMethod() द्वारा @ModelAttribute एनोटेशन टिप्पणी की जाती है? इस मामले में इसका क्या अर्थ है?

उत्तर

1

RequestAttribute फॉर्म सबमिशन में आपके द्वारा पारित पैरामीटर के अलावा कुछ भी नहीं है। एक नमूना उदाहरण

मान लीजिए के साथ समझ सकते हैं कि मैं नीचे दिए गए फॉर्म

<form action="..."> 
<input type=hidden name=param1 id=param1 value=test/> 
</form> 

अब है, अगर मैं नीचे नियंत्रक जो अनुरोध यूआरएल जो के रूप में नीचे दिए गए फॉर्म प्रस्तुत करने के साथ मैप किया गया है के साथ मैप किया गया है है।

@Controller 
public class CustomArgumentController { 

@ModelAttribute 
void beforeInvokingHandlerMethod(HttpServletRequest request) { 
    request.setAttribute("foo", "bar"); 
} 


@RequestMapping(value="/data/custom", method=RequestMethod.GET) 
public @ResponseBody String custom(@RequestAttribute("param1") String param1) { 
    // Here, I will have value of param1 as test in String object which will be mapped my Spring itself 
} 
+0

mmm मुझे अच्छी तरह से इस बात को समझते हैं: तो जब मैं annote मेरी beforeInvokingHandlerMethod() विधि @ModelAttribute एनोटेशन द्वारा एक ही बात करता है, तो मैं सही ढंग से "foo" "बार" मूल्यों के साथ एक रूप बीत चुके हैं है? और इस विधि के अंदर मैं अनुरोध करता हूं .setAttribute ("foo", "bar"); ? – AndreaNobili

+0

उत्साहपूर्वक, आप मॉडल एट्रिब्यूट को बेहतर समझने के लिए कुछ सही कर रहे हैं, आप स्प्रिंग एमवीसी http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web के आधिकारिक दस्तावेज़ीकरण पर जा सकते हैं /bind/annotation/ModelAttribute.html और http://blog.trifork.nl/2009/05/14/simple-forms-with-spring-mvc-2-5/ –

+0

से भी मैंने इस दस्तावेज़ को पढ़ा था लेकिन मेरे पास था अच्छी तरह से समझने में कुछ समस्या :-( प्रैक्टिस में आप मुझसे कह रहे हैं कि जब मेरे पास मॉडल एट्रिब्यूट एनोटेशन द्वारा लिखित एक विधि है, तो मैं नामित मॉडल विशेषता के लिए एक विधि पैरामीटर बाध्य कर रहा हूं और फिर मैं इसे किसी अन्य में उपयोग कर सकता हूं RequestAttribute एनोटेशन का उपयोग करके विधि? लेकिन मेरे मामले में पैरामीटर क्या है जो मैं बाध्यकारी हूं? क्या यह "foo" नामक पैरामीटर है जिसका मूल्य "बार" है? बहुत बहुत धन्यवाद आप बहुत दयालु हैं :-) – AndreaNobili