स्प्रिंग एमवीसी में @ModelAttribute क्या है?


372

@ModelAttributeस्प्रिंग एमवीसी का उद्देश्य और उपयोग क्या है ?



40
मुझे लगता है कि यह एक उपयोगी प्रश्न है, क्योंकि यह पाठकों को आधिकारिक स्प्रिंग प्रलेखन प्रदान करने की तुलना में अधिक जानकारी (उदाहरण सहित) प्राप्त करने की अनुमति देता है।
anton1980

3
इस राइटअप को यहां देखें। thespringthing.blogspot.com/2010/11/...
praveenj

जवाबों:


399

@ModelAttributeमॉडल ऑब्जेक्ट (MVC में M;) की एक संपत्ति को संदर्भित करता है, तो हम कहते हैं कि हमारे पास एक फॉर्म बैकिंग ऑब्जेक्ट है जिसे "व्यक्ति" कहा जाता है, फिर आप @ModelAttributeएनोटेशन का उपयोग करके स्प्रिंग MVC को इस ऑब्जेक्ट को एक नियंत्रक विधि से आपूर्ति कर सकते हैं :

public String processForm(@ModelAttribute("person") Person person){
    person.getStuff();
}

दूसरी ओर एनोटेशन का उपयोग उन वस्तुओं को परिभाषित करने के लिए किया जाता है जो एक मॉडल का हिस्सा होना चाहिए। इसलिए यदि आप मॉडल में एक व्यक्तिगत ऑब्जेक्ट संदर्भित करना चाहते हैं, तो आप निम्न विधि का उपयोग कर सकते हैं:

@ModelAttribute("person")
public Person getPerson(){
    return new Person();
}

यह एनोटेट विधि आपके दृश्य में व्यक्ति ऑब्जेक्ट तक पहुंचने की अनुमति देगा, क्योंकि यह स्प्रिंग द्वारा मॉडल में स्वचालित रूप से जोड़ा जाता है।

"@ModelAttribute का उपयोग करना" देखें ।


8
@fasseg आपको वास्तव @ModelAttributeमें अपने पहले मामले में जरूरत नहीं है ।
नील मैकगिगन

@Neil आपको @ModelAttributeविधि विशेषताओं में कब उपयोग करने की आवश्यकता है ?
रयान


1
आपको यह शामिल करना चाहिए कि कैसे व्यक्ति आबादी है और इस पद्धति को कैसे कहा जाता है।
फिलिप रेगो

134

मुझे पता है कि यह एक पुराना धागा है, लेकिन मुझे लगा कि मैं अपनी टोपी को रिंग में फेंक दूंगा और देखूंगा कि क्या मैं पानी को थोड़ा सा मैला कर सकता हूं ...

मुझे लगा कि मेरे शुरुआती संघर्ष को समझने @ModelAttributeके लिए स्प्रिंग के निर्णय को एक साथ कई एनोटेशन को संयोजित करने का परिणाम था। एक बार जब मैं इसे कई छोटे एनोटेशन में विभाजित करता हूं तो यह स्पष्ट हो गया:

पैरामीटर एनोटेशन के लिए, @ModelAttributeसमतुल्य के बराबर के बारे में सोचें, @Autowired + @Qualifierयह स्प्रिंग प्रबंधित मॉडल से दिए गए नाम के साथ बीन को पुनः प्राप्त करने का प्रयास करता है। यदि नामांकित बीन नहीं मिला है, तो एक त्रुटि को फेंकने या वापस लौटने के बजाय null, यह अंतर्निहित रूप से भूमिका पर ले जाता है @Beanयानी डिफ़ॉल्ट कंस्ट्रक्टर का उपयोग करके एक नया उदाहरण बनाएं और बीन को मॉडल में जोड़ें।

विधि एनोटेशन के लिए, @ModelAttributeइसके बराबर के बारे में सोचें @Bean + @Before, यानी यह मॉडल में उपयोगकर्ता के कोड द्वारा निर्मित बीन डालता है और इसे हमेशा अनुरोध हैंडलिंग विधि से पहले बुलाया जाता है।

स्वाभाविक रूप से, मैं @ModelAttributeनिम्नलिखित के रूप में देखता हूं (कृपया इसे शाब्दिक रूप से न लें !!):

@Bean("person")
@Before
public Person createPerson(){
  return new Person();
}

@RequestMapping(...)
public xxx handlePersonRequest( (@Autowired @Qualifier("person") | @Bean("person")) Person person, xxx){
  ...
}

जैसा कि आप देख सकते हैं, स्प्रिंग ने @ModelAttributeएक सर्वव्यापी एनोटेशन बनाने का सही निर्णय लिया ; कोई भी एनोटेशन स्मोर्गास्बोर्ड नहीं देखना चाहता है।


2
एचएम, @ बीन डिफ़ॉल्ट रूप से सिंगलटन है। मुझे यकीन नहीं है कि वही अवधारणाएं यहां लागू होती हैं।
लाश

10
बिलकुल नहीं। मैं बस इस जटिल एनोटेशन को समझाने के लिए सरल एनोटेशन का उपयोग कर रहा हूं। कृपया मेरी व्याख्या वैचारिक रूप से लें, शाब्दिक रूप से नहीं।
क्रिस्टोफर यांग

4
@ जैनी @Scope("request")फिर जोड़ें :)
ऑरेंजडॉग

28

मेरी शैली के लिए, मैं हमेशा स्प्रिंग फॉर्म jsp से ऑब्जेक्ट को पकड़ने के लिए @ModelAttribute का उपयोग करता हूं। उदाहरण के लिए, मैं jsp पृष्ठ पर फॉर्म डिजाइन करता हूं, यह फॉर्म कमांडनाम के साथ मौजूद है

<form:form commandName="Book" action="" methon="post">
      <form:input type="text" path="title"></form:input>
</form:form>

और मैं अनुवर्ती कोड के साथ नियंत्रक पर ऑब्जेक्ट को पकड़ता हूं

public String controllerPost(@ModelAttribute("Book") Book book)

और पुस्तक के हर क्षेत्र के नाम को उप-तत्व के रूप में पथ के साथ मेल खाना चाहिए


4
catchक्रिया वास्तव में काम का वर्णन @ModelAttributeकिया है। अच्छा लगा।
एडी

3
वर्ष का सर्वश्रेष्ठ उत्तर।
बृहस्पतिवार को

4
लेकिन क्या यह जरूरी है? यह @ModelAttribute एनोटेशन का उपयोग किए बिना अभी भी काम कर रहा है।

23

इसलिए मैं इसे सरल तरीके से समझाने की कोशिश करूंगा। चलो करते है:

public class Person {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(final String name) {
        this.name = name;
    }
}

जैसा कि स्प्रिंग एमवीसी प्रलेखन में वर्णित है - @ModelAttribute एनोटेशन का उपयोग विधियों पर या विधि तर्कों पर किया जा सकता है । और निश्चित रूप से हम दोनों एक ही समय में एक नियंत्रक में उपयोग कर सकते हैं।

1. मैथोड एनोटेशन

@ModelAttribute(“cities”)
 public List<String> checkOptions(){
 return new Arrays.asList(new[]{“Sofia”,”Pleven","Ruse”});//and so on
}

इस तरह की विधि का उद्देश्य मॉडल में विशेषता जोड़ना है। तो हमारे मामले में शहरों की सूची new Arras.asList(new[]{“Sofia”,”Pleven","Ruse”})में मॉडल में मूल्य के रूप में सूची होगी (आप मॉडल को मानचित्र (कुंजी: मूल्य) के रूप में सोच सकते हैं)। @ModelAttribute एक नियंत्रक में तरीकों से पहले लागू कर रहे हैं @RequestMapping विधियां एक ही नियंत्रक के भीतर।

यहां हम मॉडल सामान्य जानकारी को जोड़ना चाहते हैं जिसका उपयोग उपयोगकर्ता को प्रदर्शित करने के लिए फॉर्म में किया जाएगा। उदाहरण के लिए इसका उपयोग HTML चयन को भरने के लिए किया जा सकता है:

यहां छवि विवरण दर्ज करें

२.मथोद तर्क

public String findPerson(@ModelAttriute(value="person") Person person) {
    //..Some logic with person
    return "person.jsp";
}

विधि तर्क पर एक @ModelAttribute इंगित करता है कि तर्क को मॉडल से पुनर्प्राप्त किया जाना चाहिए। तो इस मामले में हम उम्मीद करते हैं कि हमारे पास मॉडल व्यक्ति में कुंजी के रूप में वस्तु है और हम इसका मूल्य प्राप्त करना चाहते हैं और इसे विधि तर्क व्यक्ति व्यक्ति को देना चाहते हैं । यदि ऐसा मौजूद नहीं है या (कभी-कभी आप गलत मान लेते हैं (मान = "जारी रखें")) तो स्प्रिंग इसे मॉडल में नहीं मिलेगा और अपनी चूक का उपयोग करके खाली व्यक्ति ऑब्जेक्ट बनाएगा। फिर अनुरोध पैरामीटर लेगा और उनके नाम का उपयोग करके व्यक्ति ऑब्जेक्ट में डेटा बाइंड करने का प्रयास करेगा।

name="Dmitrij"&countries=Lesoto&sponsor.organization="SilkRoad"&authorizedFunds=&authorizedHours=&

इसलिए हमारे पास नाम है और यह setName (स्ट्रिंग नाम) का उपयोग करके Person.name को बाँध देगा। तो में

//..Some logic with person

हमारे पास "डिमिट्रिज" मान के साथ इस भरे हुए नाम की पहुंच है।

बेशक स्प्रिंग अधिक जटिल वस्तुओं जैसे कि सूचियाँ, मानचित्र, मानचित्रों की सूची की सूची और इतने पर बांध सकता है, लेकिन दृश्य के पीछे यह डेटा बाध्यकारी जादू बनाता है।

  1. हमारे पास तर्क में @ModelAttribute के साथ एक ही समय मॉडल एनोटेट विधि और अनुरोध विधि हैंडलर हो सकता है। फिर हमें नियमों को संघ बनाना होगा।

  2. निश्चित रूप से हमारे पास विभिन्न स्थितियों के टन हैं - @ModelAttribute विधियाँ भी एक @ControllerAdvice और इतने पर परिभाषित की जा सकती हैं ...


13

मुझे पता है कि मुझे पार्टी में देर हो रही है, लेकिन मैं कहूंगा कि वे कहते हैं, "बेहतर होगा देर से ही सही"। तो आइए हम चलते हैं, हर किसी के पास चीजों को समझाने के अपने तरीके हैं, मुझे इसे संक्षेप में प्रस्तुत करने का प्रयास करें और कुछ उदाहरणों के साथ कुछ चरणों में आपके लिए इसे सरल बनाएं; मान लीजिए कि आपके पास एक सरल फॉर्म है, form.jsp

<form:form action="processForm" modelAttribute="student">
First Name : <form:input path="firstName" /> 
<br><br>
Last Name : <form:input path="lastName" />
<br><br>
<input type="submit" value="submit"/>
</form:form>

path = "firstName" पथ = "lastName" ये स्टूडेंटक्लास में फील्ड / प्रॉपर्टीज हैं जब फॉर्म को उनके गेटर्स कहा जाता है, लेकिन एक बार सबमिट करने के बाद उनके सेटर्स को कॉल किया जाता है और उनके मानों को सेम में सेट किया जाता है जो मॉडल में लिखा गया था। फॉर्म टैग में "छात्र"।

हमारे पास StudentController है जिसमें निम्नलिखित विधियां शामिल हैं;

@RequestMapping("/showForm")
public String showForm(Model theModel){ //Model is used to pass data between 
//controllers and views
    theModel.addAttribute("student", new Student()); //attribute name, value
return "form";
}

@RequestMapping("/processForm")
public String processForm(@ModelAttribute("student") Student theStudent){
    System.out.println("theStudent :"+ theStudent.getLastName());
return "form-details";
}

//@ModelAttribute("student") Student theStudent
//Spring automatically populates the object data with form data all behind the 
//scenes 

अब अंत में हमारे पास एक फॉर्म-डिटेल्स.jsp है

<b>Student Information</b>
${student.firstName}
${student.lastName}

तो इस सवाल पर वापस जाएँ कि स्प्रिंग एमवीसी में @ModelAttribute क्या है? आप के लिए स्रोत से एक नमूना परिभाषा http://www.baeldung.com/spring-mvc-and-the-modelattribute-annotation @ModelAttribute एक एनोटेशन है कि बांधता है विधि पैरामीटर या एक नामित मॉडल विशेषता के लिए विधि वापसी मान और फिर इसे एक वेब दृश्य में उजागर करता है।

वास्तव में क्या होता है, यह आपके फॉर्म के उन सभी मूल्यों को प्राप्त करता है जो इसके द्वारा प्रस्तुत किए गए थे और फिर उन्हें आपके द्वारा ऑब्जेक्ट में बाँधने या असाइन करने के लिए रखती है। यह @RequestParameter की तरह ही काम करता है, जहां हमें केवल एक पैरामीटर मिलता है और कुछ फील्ड में वैल्यू असाइन करता है। केवल अंतर @ModelAttribute एक पैरामीटर के बजाय सभी फ़ॉर्म डेटा रखता है। यह आपके लिए एक बीन बनाता है जो बाद में डेवलपर द्वारा उपयोग किए जाने वाले फॉर्म सबमिट किए गए डेटा को रखता है।

पूरी बात सुनाने के लिए। चरण 1: एक अनुरोध भेजा जाता है और हमारी विधि showForm चलती है और एक मॉडल, नाम के साथ एक अस्थायी बीन सेट किया जाता है जिसे छात्र फॉर्म में भेजा जाता है। theModel.addAttribute ("छात्र", नया छात्र ());

चरण 2: मॉडलएट्रिब्यूट = फॉर्म जमा करने वाले मॉडल पर "छात्र" छात्र को बदलता है और अब यह फॉर्म के सभी मापदंडों को रखता है

चरण 3: @ModelAttribute ("छात्र") छात्र TheStudent हम @ModelAttribute द्वारा पकड़े जा रहे मूल्यों को प्राप्त करते हैं और छात्र को पूरी सेम / वस्तु प्रदान करते हैं।

चरण 4: और फिर हम इसे वैसे ही उपयोग करते हैं जैसे हम करते हैं, जैसे पृष्ठ पर दिखाते हैं जैसे मैंने किया

मुझे आशा है कि यह आपको अवधारणा को समझने में मदद करेगा। धन्यवाद


9

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

  1. नियंत्रक से UI तक, और
  2. UI से नियंत्रक तक।

हम यहां रुचि रखते हैं कि यूआई से नियंत्रक तक डेटा कैसे संचारित होता है। यह भी 2 तरीकों से किया जा सकता है:

  1. HTML फॉर्म का उपयोग करना
  2. क्वेरी पैरामीटर का उपयोग करना।

HTML फॉर्म का उपयोग करना: नीचे के परिदृश्य पर विचार करें,

फॉर्म सबमिशन रिप्रेजेंटेशन

जब हम वेब ब्राउज़र से फॉर्म डेटा जमा करते हैं, तो हम उस डेटा को अपने कंट्रोलर क्लास में ऑब्जेक्ट के रूप में एक्सेस कर सकते हैं। जब हम HTML फॉर्म जमा करते हैं, तो स्प्रिंग कंटेनर चार काम करता है। यह,

  1. पहले प्रस्तुत किए गए सभी डेटा को पढ़ें जो अनुरोध में आता है request.getParameter विधि ।
  2. एक बार यह उन्हें पढ़ता है, यह उन्हें का उपयोग कर उचित जावा प्रकार में बदल जाएगा integer.parseInt , double.parseDouble और अन्य सभी पार्स विधियों जो डेटा प्रकार के डेटा के आधार पर उपलब्ध हैं।
  3. एक बार पार्स करने के बाद, यह हमारे द्वारा बनाए गए मॉडल वर्ग का ऑब्जेक्ट बना देगा। उदाहरण के लिए, इस परिदृश्य में, यह उपयोगकर्ता जानकारी है जिसे सबमिट किया जा रहा है और हम उपयोगकर्ता नामक एक वर्ग बनाते हैं, जो कंटेनर एक ऑब्जेक्ट का निर्माण करेगा और यह उन सभी मूल्यों को सेट करेगा जो स्वचालित रूप से उस ऑब्जेक्ट में आते हैं।
  4. यह तब नियंत्रक को मान सेट करके उस वस्तु को सौंप देगा।

इस पूरी चीज़ को काम करने के लिए, हमें कुछ चरणों का पालन करना होगा।

आंतरिक काम कर रहा है

हमें पहले उपयोगकर्ता की तरह एक मॉडल वर्ग को परिभाषित करने की आवश्यकता है, जिसमें फ़ील्ड की संख्या को HTML रूप में फ़ील्ड की संख्या से बिल्कुल मेल खाना चाहिए। साथ ही, HTML फॉर्म में हमारे द्वारा उपयोग किए जाने वाले नाम उन नामों से मेल खाते हैं जो हमारे पास जावा क्लास में हैं। ये दोनों बहुत महत्वपूर्ण हैं। नामों से मेल खाना चाहिए, फॉर्म में फ़ील्ड की संख्या उस वर्ग की फ़ील्ड से मेल खाना चाहिए जो हम बनाते हैं। एक बार जब हम ऐसा कर लेते हैं, तो कंटेनर स्वचालित रूप से आने वाले डेटा को पढ़ लेगा, इस मॉडल का एक ऑब्जेक्ट बनाता है, मान सेट करता है और इसे कंट्रोलर को सौंप देता है। नियंत्रक के अंदर उन मूल्यों को पढ़ने के लिए, हम @ModelAttribute काविधि मापदंडों पर एनोटेशन का उपयोग करते हैं। जब हम नियंत्रक में विधियाँ बनाते हैं, तो हम @ModelAttribute का उपयोग करने जा रहे हैं और इसमें एक पैरामीटर जोड़ेंगे जो स्वचालित रूप से कंटेनर द्वारा दी गई यह वस्तु होगी।

यहां उपयोगकर्ता को पंजीकृत करने के लिए एक उदाहरण कोड दिया गया है:

@RequestMapping(value = "registerUser", method = RequestMethod.POST)
public String registerUser(@ModelAttribute("user") User user, ModelMap model) {
    model.addAttribute("user", user);
    return "regResult";
}

उम्मीद है कि इस आरेख व्याख्या में मदद मिली!


4

इसका उपयोग स्प्रिंग में डेटा बाइंडिंग उद्देश्यों के लिए किया जाता है MVC। आपके पास एक jsp है जिसमें एक फॉर्म एलिमेंट है जैसे

पर JSP

<form:form action="test-example" method="POST" commandName="testModelAttribute"> </form:form>

(स्प्रिंग फॉर्म विधि, सरल फार्म तत्व भी इस्तेमाल किया जा सकता है)

नियंत्रक पक्ष पर

@RequestMapping(value = "/test-example", method = RequestMethod.POST)
public ModelAndView testExample(@ModelAttribute("testModelAttribute") TestModel testModel, Map<String, Object> map,...) {

}

अब जब आप फॉर्म सबमिट करेंगे तो फॉर्म फील्ड वैल्यू आपके लिए उपलब्ध होगी।


4

नोटेशन जो किसी विधि पैरामीटर या विधि रिटर्न वैल्यू को एक नामित मॉडल विशेषता से बांधता है, जो वेब दृश्य के संपर्क में है।

public String add(@ModelAttribute("specified") Model model) {
    ...
}

3

@ModelAttribute का उपयोग विधि तर्क / पैरामीटर या विधि घोषणा से पहले किया जा सकता है। इस एनोटेशन का प्राथमिक उद्देश्य अनुरोध पैरामीटर को बांधना या मॉडल ऑब्जेक्ट के लिए फ़ील्ड बनाना है

संदर्भ। http://www.javabeat.net/modelattribute-spring-mvc/


1

@ModelAttribute(@ModelAttribute("Testing") Test test) as Testing दिए गए उदाहरण में आपके द्वारा निर्दिष्ट नाम के साथ एक विशेषता बनाएगा , बीन टेस्ट बीन के संदर्भ में होने वाला परीक्षण और परीक्षण मॉडल में उपलब्ध होगा ताकि आप इसे उन मूल्यों की पुनर्प्राप्ति के लिए jsp पृष्ठों पर उपयोग कर सकें जिन्हें आपने संग्रहीत किया था आप में ModelAttribute


1

@ModelAttribute बस नियंत्रक वर्ग में हमारे तर्क का प्रदर्शन करने के लिए jsp क्षेत्रों से पूजो के लिए मूल्य बांधता है। यदि आप स्ट्रट्स से परिचित हैं, तो यह सबमिशन ऑब्जेक्ट को सबमिट करने पर पॉप्युलेट करने जैसा है।


0

ModelAttribute एनोटेशन का उपयोग स्प्रिंग MVC वेब एप्लिकेशन के हिस्से के रूप में किया जाता है और इसे दो परिदृश्यों में उपयोग किया जा सकता है।

सबसे पहले, इसका उपयोग डेटा को प्री-जेएसपी लोड मॉडल में इंजेक्ट करने के लिए किया जा सकता है। यह सुनिश्चित करने में विशेष रूप से उपयोगी है कि सभी डेटा को प्रदर्शित करने के लिए एक JSP की आवश्यकता होती है। मॉडल में एक विधि को जोड़कर एक इंजेक्शन प्राप्त किया जाता है।

दूसरा, इसका उपयोग मौजूदा मॉडल के डेटा को पढ़ने और कोच के तरीके के मापदंडों को असाइन करने के लिए किया जा सकता है।

refrence https://dzone.com/articles/use-spring-mvc%E2%80%99s


0

विधि के स्तर पर

1. जब एनोटेशन का उपयोग विधि के स्तर पर किया जाता है तो यह इंगित करता है कि उस विधि का उद्देश्य एक या अधिक मॉडल विशेषताओं को जोड़ना है

@ModelAttribute
public void addAttributes(Model model) {
model.addAttribute("india", "india");
}

विधि तर्क में 1. जब विधि तर्क के रूप में उपयोग किया जाता है, तो यह इंगित करता है कि तर्क को मॉडल से पुनर्प्राप्त किया जाना चाहिए। जब प्रस्तुत नहीं किया जाना चाहिए और पहले तत्काल किया जाना चाहिए और फिर मॉडल में जोड़ा जाना चाहिए और एक बार मॉडल में मौजूद होने के बाद, तर्कों के क्षेत्रों को सभी अनुरोध मापदंडों से पॉपुलेट किया जाना चाहिए जिसमें मिलान नाम हैं, इसलिए यह एक बीन के साथ फॉर्म डेटा को बांधता है।

 @RequestMapping(value = "/addEmployee", method = RequestMethod.POST)
  public String submit(@ModelAttribute("employee") Employee employee) {
  return "employeeView";
  }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.