2011-09-12 17 views
27

मैंने देखा है उदाहरण हैं, जहां एक नियंत्रक एक स्ट्रिंग (जो दिखाई इंगित करता है)वसंत MVC नियंत्रक प्रकार

@RequestMapping(value="/owners/{ownerId}", method=RequestMethod.GET) 
public String findOwner(@PathVariable String ownerId, Model model) { 
    Owner owner = ownerService.findOwner(ownerId); 
    model.addAttribute("owner", owner); 
    return "displayOwner" 
} 

रिटर्न और मैं भी जहां एक नियंत्रक एक "ModelAndView" ऑब्जेक्ट प्रकार रिटर्न उदाहरण देखने लौटें

public ModelAndView helloWorld() { 
    ModelAndView mav = new ModelAndView(); 
    mav.setViewName("helloWorld"); 
    mav.addObject("message", "Hello World!"); 
    return mav; 
} 

दोनों के बीच क्या अंतर है और मुझे किस का उपयोग करना चाहिए? किसी भी तरह से मैं अपना विचार हल कर सकता हूं।

+0

वसंत MVC का कौन सा संस्करण के बारे में हम बात कर रहे हैं के अनुसार helloworld.jsp में लौट आता है? –

+0

यहां जवाब है: https://stackoverflow.com/questions/29365833/what-are-valid-return-types-of-a-spring-mvc-controller-method/29366138#29366138 – Rajeev

उत्तर

15

यदि हम एमवीसी 3 के बारे में बात कर रहे हैं, तो दोनों सही हैं। लेकिन सीधे मॉडल और व्यू लौटने का पुराना तरीका है, और अधिक मौखिक है।

यदि आप केवल एक स्ट्रिंग लौट रहे हैं (@ResponseBody के बिना जो कुछ और है), तो इस स्ट्रिंग को व्यू नाम के रूप में माना जाता है, और वसंत इसे रिज़ॉलर्स देखने के लिए धक्का देता है - इसलिए, आपको चिंता करने की ज़रूरत नहीं है (कम से कम, जबकि आप लिखने वाले नियंत्रक हैं), आप किस प्रकार के व्यू रेंडरर का उपयोग करेंगे (इसे जेएसपी या वेग दें, इससे कोई फर्क नहीं पड़ता)। आप केवल Model इंस्टेंस का प्रचार करते हैं, और इसके बाद एक संकेत देता है कि इसके साथ क्या किया जाए। उचित ModelAndView ऑब्जेक्ट स्ट्रिंग द्वारा बाद में आंतरिक रूप से बनाया जाता है।

आम तौर पर, वसंत 3 आपको तर्कों और वापसी प्रकारों के साथ अधिक लचीलापन देता है (स्प्रिंग डॉक्यूमेंटेशन में Defining @RequestMapping handler methods अनुभाग देखें)।

+1

नए एमवीसी 3 दृष्टिकोण (एक 'स्ट्रिंग' लौटाना) में,' मॉडल 'उदाहरण कैसे दृश्य में अपना रास्ता बना देता है? नियंत्रक में हम गुण जोड़ने के लिए 'model.addAttribute (..)' का उपयोग करते हैं लेकिन आखिरकार केवल 'स्ट्रिंग' वापस लौटाया जाता है, तो दृश्य समाधानकर्ता को 'मॉडल' ऑब्जेक्ट के बारे में कैसे पता चलता है? धन्यवाद! – user2490003

+0

मेरा मानना ​​है कि यह अनुरोध मैपिंग द्वारा किए गए किसी प्रकार का निर्भरता इंजेक्शन (यानी मॉडल आपको संकल्पकर्ता द्वारा दिया जाता है) - लेकिन ईमानदार होने के लिए, मुझे यकीन नहीं है, क्योंकि पिछले 5 वर्षों से स्प्रिंग के साथ मेरा कोई संपर्क नहीं था ^^ –

1

यदि आप प्रतिक्रिया बनाने के लिए फ्रीमार्कर या वेग जैसी टेम्पलेट भाषा का उपयोग कर रहे हैं तो आप ModelAndView वापस कर सकते हैं।

यदि आप एक जेसन/एक्सएमएल या कुछ स्ट्रिंग को प्रतिक्रिया (उदा: AJAX अनुरोध) के रूप में वापस करना चाहते हैं तो आप पहली विधि का उपयोग कर सकते हैं। मुझे लगता है कि यह public @ResponseBody String findOwner(@PathVariable String ownerId, Model model) होना चाहिए, आपको यह इंगित करने के लिए @ResponseBody नामक एक एनोटेशन जोड़ने की आवश्यकता है कि लौटाया गया मान प्रतिक्रिया टेक्स्ट के रूप में परिवर्तित किया जाना चाहिए। @ResponseBody का उपयोग करके आप क्रमशः जेसन/एक्सएमएल प्रतिक्रियाएं बनाने के लिए Jackson या JaxB जैसे पुस्तकालयों का उपयोग करने में सक्षम होंगे।

ये लौटाए गए मूल्यका उपयोग करके AnnotationMethodHandlerAdapter के साथ पंजीकृत किए जाएंगे।

रेफरी: http://blog.springsource.com/2010/01/25/ajax-simplifications-in-spring-3-0/

+1

आप बिंदु खो रहे हैं। यदि आपने लौटाई गई स्ट्रिंग की तुलना में उचित 'व्यू रिज़ॉल्वर' को परिभाषित किया है तो उसे देखने के लिए नाम (jsp, टेम्पलेट, और इसी तरह) के रूप में माना जाएगा। '@ ResponseBody' के साथ इसके साथ कुछ लेना देना नहीं है। –

+0

@AdamJurczyk तो अगर मैं पहले से ही 'व्यू रिज़ॉल्वर' परिभाषित कर चुका हूं तो मैं '@ ResponseBody' (मैं AJAX कॉल के लिए JSON वापस करना चाहता हूं) का उपयोग कैसे कर सकता हूं? धन्यवाद – MyTitle

6

वसंत MVC में, आप ModelAndView लौटना चाहिए यदि आप उदाहरण के लिए jsp पेज

को रखना चाहते हैं:

@RequestMapping(value="/index.html", method=RequestMethod.GET) 
    public ModelAndView indexView(){ 
     ModelAndView mv = new ModelAndView("index"); 
     return mv; 
    }  

इस समारोह index.jsp जब आप कर रहे हैं वापस आ जाएगी hitting /index.html

इसके अतिरिक्त आप @ResponseBody एनोटेशन और सीरिएलाइज़र का उपयोग करके किसी भी JSON या XML ऑब्जेक्ट को वापस कर सकते हैं।

उदाहरण के लिए:

@RequestMapping(value="/getStudent.do",method=RequestMethod.POST) 
    @ResponseBody 
    public List<Student> getStudent(@RequestParam("studentId") String id){ 
     List<Student> students = daoService.getStudent(id); 
     return students; 
    } 

इस उदाहरण में आप मामले में JSON के रूप में सूची वापस आ जाएगी और आप जैक्सन serializer सक्षम है।

<context:annotation-config/> 

और Serializer ही:

<bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean> 
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
<property name="messageConverters"> 
    <list> 
    <ref bean="jacksonMessageConverter"/> 
    </list> 
</property> 
</bean> 

आशा है कि यह मदद करता है आदेश सक्षम करने के लिए है कि आप अपने स्प्रिंग एक्सएमएल के लिए निम्न जोड़ने की जरूरत है।

+2

सीधे एमएवी बनाने और वापस करने के लिए आवश्यक नहीं है।इसके अलावा, यदि आप 'संदर्भ: एनोटेशन-कॉन्फ़िगरेशन' का उपयोग कर रहे हैं, तो आपको सीरियलाइज़र को हाथ से नहीं रखना है, अगर क्लासपाथ पर 'जैक्सन' है तो यह स्वचालित रूप से किया जाता है। –

+0

बिल्कुल सही, सरल उदाहरण जो बहुत उपयोगी है। – Tastybrownies

17

यह वही तर्क है लेकिन यह वसंत का एक ही संस्करण नहीं है।

मॉडल एंड व्यू ऑब्जेक्ट मॉडल और विचारों को संभालने का वसंत 2.x तरीका है। आपके द्वारा दिए गए उदाहरण में, मॉडल एंडव्यू ऑब्जेक्ट "हैलोवर्ल्ड" दृश्य लोड करेगा (आपके टेम्पलेटिंग इंजन के आधार पर मॉडल में एक डेटा "संदेश" के साथ हैलोवर्ल्ड.जेएसपी, या हैलोवर्ल्ड.html, ...) हो सकता है।

दूसरा तरीका वसंत 3.x तरीका है। आप अपने नरक के रूप में बिल्कुल वही उदाहरण लिख सकते थे।

@RequestMapping(value="/helloWorld", method=RequestMethod.GET) 
public String helloWorld(Model model) { 
    model.addAttribute("message", "Hello World!"); 
    return "helloWorld"; 
} 

मॉडल स्वचालित रूप से अनुरोध पर आबादी वाला है।

और हम इस नोटेशन को सरल बना सकते हैं क्योंकि यूआरएल मैपिंग "हैलोवर्ल्ड" सीधे दृश्य नाम है।

@RequestMapping(value="/helloWorld", method=RequestMethod.GET) 
public void helloWorld(Model model) { 
    model.addAttribute("message", "Hello World!"); 
} 

HelloWorld दृश्य स्वत: लोड किया जाएगा

5

रिटर्निंग ModelAndView या एक स्ट्रिंग में एक ही काम करता है। यह एक दृश्य (एक जेएसपी पृष्ठ) में हल करता है और दृश्य में प्रस्तुत करने के लिए एक मॉडल वस्तु प्रदान करता है। यदि आप एक स्ट्रिंग वापस करते हैं, तो वसंत आंतरिक रूप से viewResolver का उपयोग करके एक दृश्य को हल करता है, एक मॉडल और दृश्य वस्तु बनाएं और इसे वापस कर दें। ModelAndView ऑब्जेक्ट की वापसी पुराने संस्करण से है। आप इनमें से किसी भी को सुविधाजनक के आधार पर कर सकते हैं।

इस question

भी जवाब का गुच्छा पर एक नज़र @RequestBody की ओर इशारा कर रहे हैं। यह वास्तव में आपके प्रश्न से संबंधित नहीं है। लेकिन ध्यान रखें कि यह उपलब्ध ऑब्जेक्ट्स का उपयोग करके सामग्री-प्रकार के आधार पर आपकी ऑब्जेक्ट को कन्वर्ट करेगा और resuly दस्तावेज़ निकाय का हिस्सा होगा।

1
public String findOwner(@PathVariable String ownerId, Model model) { 
    Owner owner = ownerService.findOwner(ownerId); 
    model.addAttribute("owner", owner); 
    return "displayOwner" 
}      
इस पद्धति में

वापसी प्रकार स्ट्रिंग है और हम तो हम जैसे

modelparam.addAttribute("obj",value); 

जोड़ देगा मॉडल के साथ एक मूल्य जोड़ सकते हैं और displayowner पर लौटने प्रति दृश्य के रूप में JSP को करने के लिए एक पैरामीटर के रूप मॉडल जोड़ने समाधानकर्ता

public ModelAndView helloWorld() { 
    ModelAndView mav = new ModelAndView(); 
    mav.setViewName("helloWorld"); 
    mav.addObject("message", "Hello World!"); 
    return mav; 
} 

इस पद्धति में वापसी प्रकार ModelAndView तो हम मॉडल और यहाँ वापस आ जाएगी MAV इसलिए यहाँ हम विज्ञापन चाहिए ModelAndView की वस्तु है

model.addObject("object","value"); 

तरह घ यहाँ VIEWNAME viewResolver

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