سؤال

ما هو الغرض من واستخدام @ModelAttribute في الربيع MVC؟

هل كانت مفيدة؟

المحلول

@ModelAttribute يشير إلى خاصية لكائن النموذج (M في MVC ؛) لذلك دعنا نقول أن لدينا نموذجًا به كائن دعم النموذج يسمى "الشخص" ثم يمكنك توفير هذا الكائن SPRING MVC إلى طريقة وحدة تحكم باستخدام @ModelAttribute حاشية. ملاحظة:

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

من ناحية أخرى ، يتم استخدام التعليق التوضيحي لتحديد الكائنات التي يجب أن تكون جزءًا من النموذج. لذلك إذا كنت تريد أن تتم الرجوع إلى كائن شخص في النموذج ، فيمكنك استخدام الطريقة التالية:

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

ستسمح هذه الطريقة المشروحة بالوصول إلى كائن الشخص في عرضك ، حيث يتم إضافته تلقائيًا إلى النماذج بحلول الربيع.

يرى "باستخدام modelattribute".

نصائح أخرى

أعلم أن هذا خيط قديم ، لكنني اعتقدت أنني أرمي قبعتي في الحلبة ومعرفة ما إذا كان بإمكاني أن أتعامل مع الماء أكثر قليلاً :)

لقد وجدت كفاحي الأولي لفهمه @ModelAttribute كان نتيجة لقرار الربيع بالجمع بين العديد من التعليقات التوضيحية في واحد. أصبح الأمر أكثر وضوحًا بمجرد تقسيمه إلى عدة شروح أصغر:

للشروح المعلمة ، فكر في @ModelAttribute كما يعادل @Autowired + @Qualifier أي أنه يحاول استرداد الفول مع الاسم المحدد من النموذج المدار من الربيع. إذا لم يتم العثور على الفول المسماة ، بدلاً من إلقاء خطأ أو عودة null, ، يأخذ ضمنيًا دور @Bean IE قم بإنشاء مثيل جديد باستخدام المُنشئ الافتراضي وأضف الحبة إلى النموذج.

لشروحات الطريقة ، فكر في @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 تعليق شامل. لا أحد يريد أن يرى شرح Smorgasbord.

لأسلوبي ، أستخدم دائمًا modelattribute لالتقاط كائن من SPRING Form JSP. على سبيل المثال ، أقوم بتصميم نموذج على صفحة JSP ، هذا النموذج موجود مع اسم CommandName

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

وأنا أحضر الكائن على وحدة التحكم مع رمز المتابعة

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

ويجب أن يكون كل اسم حقل للكتاب متطابقًا مع المسار في العناصر الفرعية للنموذج

لذلك سأحاول شرح ذلك بطريقة أبسط. فلنحصل على:

public class Person {
    private String name;

    public String getName() {
        return name;
    }

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

كما هو موضح في وثائق الربيع MVC - 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 SELECT:

enter image description here

2. حجة

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

يشير modelattribute على وسيطة طريقة إلى أنه ينبغي استرداد الوسيطة من النموذج. لذلك في هذه الحالة نتوقع أن يكون لدينا في النموذج شخص كائن كمفتاح ونريد الحصول على قيمته ونضعه في وسيطة الطريقة شخص. إذا لم يكن هذا موجودًا أو (في بعض الأحيان ، فأنت أخطأ في (value = "persson") ، فلن يجدها الربيع في النموذج وستقوم بإنشاء كائن شخص فارغ باستخدام الإعدادات الافتراضية الخاصة به. بعد ذلك سيأخذ معلمات الطلب ويحاول ربط البيانات بها في كائن الشخص باستخدام أسمائهم.

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

لذلك لدينا اسم وسيكون مرتبطًا بـ person.name باستخدام setName (اسم السلسلة). لذلك في

//..Some logic with person

لدينا إمكانية الوصول إلى هذا الاسم المملوء مع القيمة "Dimitrij".

بالطبع ، يمكن لـ Spring أن يربط كائنات أكثر تعقيدًا مثل القوائم والخرائط وقائمة مجموعات الخرائط وما إلى ذلك ، ولكن خلف المشهد ، فإنه يجعل سحر ربط البيانات.

  1. يمكن أن يكون لدينا في نفس الوقت طريقة مشروحة النموذج ومعالج طريقة الطلب مع modelattribute في الوسيطات. ثم علينا أن نؤمن القواعد.

  2. بالطبع لدينا الكثير من المواقف المختلفة - يمكن أيضًا تحديد طرق modelattribute في controlleradvice وما إلى ذلك ...

أعلم أنني تأخرت عن الحفلة ، لكنني سأقتبس كما يقولون ، "من الأفضل أن تتأخر من عدمه أبدًا". لذلك دعونا نذهب ، كل شخص لديه طرقهم الخاصة لشرح الأشياء ، اسمحوا لي أن أحاول تلخيصها وبساطة ذلك لك في خطوات قليلة مع مثال ؛ افترض أن لديك شكل بسيط ، 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" path = "lastName" هذه هي الحقول/الخصائص في studentClass عندما يتم استدعاء النموذج يسمى getters الخاصة بهم ولكن بمجرد تقديمها يتم استدعاء المستقلين الخاصة بهم ويتم تعيين قيمها في الفاصوليا التي تم الإشارة إليها في thedattribute = "الطالب" في علامة النموذج.

لدينا طالب Confroller يتضمن الأساليب التالية ؛

@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 

الآن أخيرًا لدينا مجموعة

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

لذا ، العودة إلى السؤال ما هو modelattribute في Spring MVC؟ تعريف عينة من المصدر لك ،http://www.baeldung.com/spring-mvc-and-the-modelattribute-annotationال modelattribute هو التعليق التوضيحي الذي يربط معلمة الطريقة أو قيمة إرجاع الطريقة إلى سمة النموذج المسماة ثم يعرضها لعرض ويب.

ما يحدث في الواقع هو أنه يحصل على كل قيم النموذج الخاص بك تم تقديمه من خلاله ومن ثم يحتفظ بهم لربطها أو تعيينها للكائن. إنه يعمل نفس مثل requestparameter حيث نحصل على معلمة فقط ونخصص القيمة إلى بعض الحقل. الفرق فقط modelattribute يحمل جميع بيانات النماذج بدلاً من معلمة واحدة. إنه ينشئ حبة لك تحمل بيانات مقدمة من النموذج لاستخدامها من قبل المطور لاحقًا.

لتلخيص كل شيء. الخطوة 1: يتم إرسال طلب ويتم تشغيل Method Showform ونموذج ، يتم تعيين حبة مؤقتة مع الاسم الطالب إلى النموذج.themodel.addattribute ("الطالب" ، طالب جديد ()) ؛

الخطوة 2 :modelattribute = "الطالب" في نموذج تقديم النموذج يغير الطالب وهو الآن يحمل جميع معلمات النموذج

الخطوه 3 :modelattribute ("الطالب") الطالب thestudentنجلب القيم التي يتم الاحتفاظ بها modelattribute وتعيين الفول/الكائن بأكمله للطالب.

الخطوة 4: ثم نستخدمها أثناء تقديم العطاءات ، تمامًا مثل عرضه على الصفحة وما إلى ذلك كما فعلت

آمل أن يساعدك ذلك على فهم المفهوم. شكرًا

خذ أي تطبيق ويب سواء كان Gmail أو Facebook أو Instagram أو أي تطبيق ويب آخر ، الأمر كله يتعلق بتبادل البيانات أو المعلومات بين المستخدم النهائي والتطبيق أو واجهة المستخدم والتطبيق في النهاية الخلفية. حتى في عالم الربيع MVC ، هناك طريقتان لتبادل البيانات:

  1. من وحدة التحكم إلى واجهة المستخدم ، و
  2. من واجهة المستخدم إلى وحدة التحكم.

ما يهمنا هنا هو كيفية توصيل البيانات من واجهة المستخدم إلى وحدة التحكم. يمكن أيضًا القيام بذلك بطريقتين:

  1. باستخدام نموذج HTML
  2. باستخدام معلمات الاستعلام.

باستخدام نموذج HTML: فكر في السيناريو أدناه ،

Form Submission Representation

عندما نقدم بيانات النموذج من متصفح الويب ، يمكننا الوصول إلى هذه البيانات في فئة وحدة التحكم لدينا ككائن. عندما نقدم نموذج HTML ، تقوم حاوية الربيع بأربعة أشياء. سوف،

  1. اقرأ أولاً جميع البيانات المقدمة التي تأتي في الطلب باستخدام request.getParameter طريقة.
  2. بمجرد قراءتها ، سيقوم بتحويلهم إلى نوع Java المناسب باستخدام integer.parseint, double.parsedouble وجميع أساليب التحليل الأخرى المتوفرة بناءً على نوع بيانات البيانات.
  3. بمجرد تحليلها ، سيقوم بإنشاء كائن من فئة النماذج التي أنشأناها. على سبيل المثال ، في هذا السيناريو ، فإن معلومات المستخدم التي يتم إرسالها وننشئ فئة تسمى المستخدم ، والتي ستقوم الحاوية بإنشاء كائن وسيقوم بتعيين جميع القيم التي تأتي تلقائيًا في هذا الكائن.
  4. سيقوم بعد ذلك بتسليم هذا الكائن عن طريق تعيين القيم على وحدة التحكم.

للحصول على هذا الأمر برمته ، سيتعين علينا اتباع خطوات معينة.

Internal working

نحتاج أولاً إلى تحديد فئة النماذج ، مثل المستخدم ، حيث يجب أن يتطابق عدد الحقول تمامًا مع عدد الحقول في نموذج HTML. أيضًا ، يجب أن تتطابق الأسماء التي نستخدمها في نموذج HTML مع الأسماء التي لدينا في فئة Java. هذان مهمان للغاية. يجب أن تتطابق الأسماء ، ويجب أن يتطابق عدد الحقول في النموذج مع عدد الحقول في الفصل الذي ننشئه. بمجرد قيامنا بذلك ، ستقرأ الحاوية تلقائيًا البيانات التي تأتي ، وتنشئ كائنًا من هذا النموذج ، ويقوم بتعيين القيم ويسلمها إلى وحدة التحكم. لقراءة تلك القيم داخل وحدة التحكم ، نستخدم modelattribute التعليق التوضيحي على معلمات الطريقة. عندما نقوم بإنشاء طرق في وحدة التحكم ، سنستخدم modelattribute وإضافة معلمة لها والتي ستعطيها هذا الكائن تلقائيًا بواسطة الحاوية.

فيما يلي رمز مثال لتسجيل مستخدم:

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

أتمنى أن يكون هذا التفسير الرسم التخطيطي قد ساعد!

يستخدم هذا لأغراض ربط البيانات في الربيع 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,...) {

}

الآن عندما تقوم بإرسال النموذج ، ستكون قيم حقول النموذج متاحة لك.

التعليق التوضيحي الذي يربط معلمة الطريقة أو قيمة إرجاع الأسلوب إلى سمة النموذج المسماة ، المعرضة لعرض ويب.

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

يمكن استخدام modelattribute كوسائط / معلمة أو قبل إعلان الطريقة. الهدف الأساسي من هذا التعليق التوضيحي لربط معلمات الطلب أو حقول النماذج لكائن نموذج

المرجع. http://www.javabeat.net/modelattribute-spring-mvc/

@ModelAttribute سيتم إنشاء سمة مع الاسم المحدد من قبلك (@ModelAttribute("Testing") Test test) as Testing في المثال المحدد ، سيكون اختبار الفول هو الإشارة إلى الفول وسيتوفر الاختبار في النموذج بحيث يمكنك استخدامه على صفحات JSP لاسترجاع القيم التي قمت بتخزينها فيها ModelAttribute.

@modelattribute يربط القيمة ببساطة من حقول JSP إلى Pojo Calss لأداء منطقنا في فئة وحدة التحكم. إذا كنت على دراية بالدعامات ، فهذا يشبه ملء كائن Formbean عند التقديم.

يتم استخدام شرح توضيح ModelAttribute كجزء من تطبيق Web Spring MVC ويمكن استخدامه في سيناريوهين.

بادئ ذي بدء ، يمكن استخدامه لحقن البيانات في نموذج تحميل ما قبل JSP. هذا مفيد بشكل خاص في ضمان حاجة إلى JSP لعرض جميع البيانات نفسها. يتم الحصول على الحقن عن طريق توصيل طريقة واحدة بالنموذج.

ثانياً ، يمكن استخدامه لقراءة البيانات من نموذج موجود وتعيينه إلى معلمات طريقة المدرب.

الامتناع https://dzone.com/articles/using-spring-mvc٪E2٪80٪99S

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top