Spring MVC'de @ModelAttribute nedir?


372

@ModelAttributeSpring MVC'nin amacı ve kullanımı nedir ?



40
Bunun faydalı bir soru olduğunu düşünüyorum, çünkü okuyucuların resmi Bahar dokümantasyonundan daha fazla bilgi (örnekler dahil) almasına izin veriyor.
anton1980

3
Bu yazıyı buradan kontrol edin. thespringthing.blogspot.com/2010/11/…
praveenj

Yanıtlar:


399

@ModelAttributeModel nesnesinin (MVC'deki M;) bir özelliğini ifade eder, bu nedenle "Kişi" olarak adlandırılan bir form destekleme nesnesine sahip bir formumuz olduğunu varsayalım. Daha sonra, Spring MVC'nin bu nesneyi @ModelAttributeek açıklamayı kullanarak bir Controller yöntemine sağlamasını sağlayabilirsiniz. :

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

Öte yandan ek açıklama, bir Modelin parçası olması gereken nesneleri tanımlamak için kullanılır. Bu nedenle, Modelde referans verilen bir Person nesnesine sahip olmak istiyorsanız, aşağıdaki yöntemi kullanabilirsiniz:

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

Bu açıklamalı yöntem, Yaylı Modellere otomatik olarak eklendiğinden, Görünümünüzdeki Kişi nesnesine erişime izin verecektir.

Bkz. "@ModelAttribute Kullanma" .


8
@fasseg Aslında @ModelAttributeilk davanıza ihtiyacınız yok .
Neil McGuigan

@Neil @ModelAttributeYöntem özniteliklerinde ne zaman kullanmanız gerekir ?
Ryan


1
Kişinin nasıl doldurulduğunu ve bu yöntemin nasıl çağrıldığını eklemelisiniz.
Philip Rego

134

Bunun eski bir iplik olduğunu biliyorum, ama şapkamı ringe atıp suyu biraz daha çamurlayabileceğimi düşündüm :)

İlk anlama @ModelAttributeçabamın, Spring'in çeşitli ek açıklamaları bir araya getirme kararının bir sonucu olduğunu buldum . Birkaç küçük ek açıklamaya böldüğümde daha netleşti:

Parametre ek açıklamaları için, düşünmek @ModelAttributeeşdeğer olarak @Autowired + @Qualifieryani o İlkbahar yönetilen modelden verilen adla bir fasulye almaya çalışır. Adlandırılmış fasulye bulunamazsa, bir hata atmak veya geri dönmek yerine, nullörtük olarak @Beanyani varsayılan kurucuyu kullanarak yeni bir örnek oluşturma rolünü üstlenir ve fasulyeyi modele ekler.

Yöntem ek açıklamaları için, @ModelAttributeeşdeğer olarak düşünün @Bean + @Before, yani kullanıcı kodu tarafından oluşturulan fasulyeyi modele koyar ve her zaman bir istek işleme yönteminden önce çağrılır.

Mecazi @ModelAttributeolarak, aşağıdaki gibi görüyorum (lütfen kelimenin tam anlamıyla almayın !!):

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

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

Gördüğünüz gibi, Spring @ModelAttributeher şeyi kapsayan bir ek açıklama yapmak için doğru kararı verdi ; hiç kimse bir açıklama smorgasbord görmek istemez.


2
Hm, @Bean varsayılan olarak singleton'dur. Burada aynı kavramların geçerli olduğundan emin değilim.
Zombies

10
Kesinlikle hayır. Bu karmaşık ek açıklamayı açıklamak için daha basit ek açıklamalar kullanıyorum. Lütfen açıklamamı tam anlamıyla değil kavramsal olarak al.
Christopher Yang

4
@Zombies add @Scope("request")then :)
OrangeDog

28

Benim tarzım için, her zaman bahar formu jsp nesnesini yakalamak için @ModelAttribute kullanın. örneğin, jsp sayfasında form tasarlıyorum, bu form commandName ile var

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

ve ben kontrol kodu ile nesne takip kodu ile yakalamak

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

ve kitabın her alan adı, formun alt öğesindeki yolla eşleşmelidir


4
catchFiil tam olarak çalışmalarını açıklar @ModelAttributeyaptı. Güzel.
Eddy

3
Yılın en iyi yanıtı.
Jüpiter Cls

4
Ama gerekli mi? @ModelAttribute ek açıklaması kullanılmadan da bu hala çalışıyor.

23

Bu yüzden daha basit bir şekilde açıklamaya çalışacağım. Hadi sahip olalım:

public class Person {
    private String name;

    public String getName() {
        return name;
    }

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

Spring MVC belgelerinde açıklandığı gibi - @ModelAttribute ek açıklaması yöntemlerde veya yöntem bağımsız değişkenlerinde kullanılabilir . Ve elbette her ikisini aynı anda tek bir kumandada kullanabiliriz.

1. yöntem ek açıklaması

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

Bu yöntemin amacı modele nitelik eklemektir. Dolayısıyla bizim durumumuzda şehirler anahtarının new Arras.asList(new[]{“Sofia”,”Pleven","Ruse”})Modelde liste değeri olacaktır (Modeli harita olarak düşünebilirsiniz (key: değer)). @ModelAttribute bir kontrol yöntemleri önce çağırılan @ RequestMapping aynı kontrolör içinde, yöntem.

Burada kullanıcıya göstermek için formda kullanılacak ortak bilgileri Model'e eklemek istiyoruz. Örneğin, bir HTML seçimini doldurmak için kullanılabilir:

resim açıklamasını buraya girin

2. yöntem tartışması

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

Yöntem bağımsız değişkenindeki bir @ModelAttribute, bağımsız değişkenin modelden alınması gerektiğini belirtir. Dolayısıyla bu durumda Model kişi nesnesinde anahtar olarak yer almamızı ve değerini almak ve bunu Person person yöntem argümanına koymak istiyoruz . Böyle bir şey yoksa veya (bazen (value = "persson") yanlış yazarsanız, Spring bunu Modelde bulamaz ve varsayılanlarını kullanarak boş Kişi nesnesi oluşturur. Sonra istek parametrelerini alacak ve isimlerini kullanarak bunları Person nesnesine bağlamaya çalışacaktır.

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

Yani ismimiz var ve setName (String name) kullanılarak Person.name dosyasına bağlanacak. Yani

//..Some logic with person

"Dimitrij" değeriyle bu doldurulmuş isme erişebiliyoruz.

Tabii ki Bahar Listeler, Haritalar, Harita Kümeleri Listesi gibi daha karmaşık nesneleri bağlayabilir, ancak sahnenin arkasında veri bağlama büyüsü yapar.

  1. Aynı zamanda argümanlarda @ModelAttribute ile model açıklama yöntemi ve istek yöntemi işleyicisi olabilir. O zaman kuralları birleştirmeliyiz.

  2. Tabii ki tonlarca farklı durum var - @ModelAttribute yöntemleri bir @ControllerAdvice'de de tanımlanabilir ...


13

Partiye geç kaldýđýmý biliyorum, ama dedikleri gibi "asla geç kalmasan iyi olur." Öyleyse başlayalım, Herkesin bir şeyler açıklamak için kendi yolları var, özetlemeye çalışalım ve birkaç adımda sizin için basitleştirelim; Diyelim ki basit bir formunuz var, 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" Bunlar, form çağrıldığında çağrı sahipleri çağrıldığında ancak ayarlayıcıları çağrıldığında ve değerleri modelde belirtilen çekirdeğe ayarlandığında StudentClass içindeki alanlar / özelliklerdir. form etiketinde "öğrenci".

Aşağıdaki yöntemleri içeren StudentController'ımız var;

@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 

şimdi nihayet bir form-details.jsp var

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

Peki Spring MVC'de @ModelAttribute nedir? Size bir kaynaktan örnek bir tanımı, http://www.baeldung.com/spring-mvc-and-the-modelattribute-annotation @ModelAttribute bir açıklama olduğunu adlandırılmış modeli öznitelik bağlandığı bir yöntem parametresi ya da yöntem dönüş değeri ve sonra bir web görünümüne maruz bırakır.

Aslında olan, formunuzun tüm değerlerini kendisi tarafından alması ve daha sonra onları nesneye bağlamanız veya atamanız için tutar. @RequestParameter ile aynı şekilde çalışır, burada yalnızca bir parametre alırız ve değeri bir alana atarız. Tek fark @ModelAttribute , tek bir parametre yerine tüm form verilerini tutar. Daha sonra geliştirici tarafından kullanılacak form gönderilen verileri tutan sizin için bir fasulye oluşturur.

Her şeyi özetlemek gerekirse. Adım 1: Bir istek gönderilir ve yöntemimiz showForm çalışır ve bir model, öğrenci adı verilen geçici bir fasulye ayarlanır forma yönlendirilir. theModel.addAttribute ("öğrenci", yeni Öğrenci ());

Adım 2: form gönderme modelindeki modelAttribute = "öğrenci" öğrenciyi değiştirir ve şimdi formun tüm parametrelerini tutar

Adım 3: @ModelAttribute ("öğrenci") Öğrenci Öğrenci @ModelAttribute tarafından tutulan değerleri alır ve tüm fasulyeyi / nesneyi Öğrenci'ye atarız.

Adım 4: Sonra teklif verdiğimiz gibi kullanırız, tıpkı benim yaptığım gibi sayfada göstermek gibi

Umarım kavramı anlamanıza yardımcı olur. Teşekkürler


9

İster Gmail, ister Facebook ya da Instagram ya da başka bir web uygulaması olsun, herhangi bir web uygulamasını kullanın, hepsi son kullanıcı ile uygulama veya kullanıcı arayüzü ve arka uç uygulaması arasında veri veya bilgi alışverişi ile ilgilidir. Spring MVC dünyasında bile veri alışverişinin iki yolu vardır:

  1. Denetleyiciden kullanıcı arayüzüne ve
  2. Kullanıcı Arabiriminden Denetleyiciye.

Burada ilgilendiğimiz, verilerin kullanıcı arayüzünden Denetleyiciye nasıl iletildiği. Bu 2 şekilde de yapılabilir:

  1. HTML Formu Kullanma
  2. Sorgu Parametrelerini Kullanma.

HTML Formu Kullanma: Aşağıdaki senaryoyu inceleyin,

Form Gönderme Temsilciliği

Form verilerini web tarayıcısından gönderdiğimizde, Denetleyici sınıfımızdaki bu verilere nesne olarak erişebiliriz. Bir HTML formu gönderdiğimizde, Spring Container dört şey yapar. Olacak,

  1. önce request.getParameter yöntemini kullanarak istekte gönderilen tüm verileri okuyun .
  2. Onları okur kez bu kullanarak uygun Java türüne dönüştüren Integer.parseInt , double.parseDouble ve veri veri türüne göre kullanılabilen tüm diğer ayrıştırma yöntemlerini.
  3. ayrıştırıldıktan sonra, oluşturduğumuz model sınıfının bir nesnesini oluşturur. Örneğin, bu senaryoda, gönderilen kullanıcı bilgisidir ve Kapsayıcı'nın bir nesne oluşturacağı Kullanıcı adlı bir sınıf oluştururuz ve bu nesneye otomatik olarak gelen tüm değerleri ayarlar.
  4. daha sonra değerleri Denetleyiciye ayarlayarak o nesneyi devredecektir.

Tüm bunların işe yaraması için belirli adımları izlememiz gerekecek.

Dahili çalışma

Öncelikle, Kullanıcı sayısının, alan sayısının HTML formundaki alan sayısıyla tam olarak eşleşmesi gereken bir model sınıfı tanımlamamız gerekir. Ayrıca, HTML formunda kullandığımız adlar, Java sınıfındaki adlarla eşleşmelidir. Bu ikisi çok önemlidir. İsimler eşleşmeli, formdaki alan sayısı oluşturduğumuz sınıftaki alan sayısı ile eşleşmelidir. Bunu yaptıktan sonra, Kapsayıcı gelen verileri otomatik olarak okuyacak, bu modelin bir nesnesini yaratacak, değerleri ayarlayacak ve Denetleyiciye teslim edecektir. Denetleyici içindeki bu değerleri okumak için @ModelAttribute kullanırızyöntem parametreleri hakkında ek açıklama. Denetleyicide yöntemler oluşturduğumuzda, @ModelAttribute kullanacağız ve bu nesneye Kapsayıcı tarafından otomatik olarak verilecek bir parametre ekleyeceğiz.

Bir kullanıcıyı kaydetmek için örnek kod:

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

Umarım bu şematik açıklama yardımcı olmuştur!


4

Bu, İlkbaharda veri bağlama amacıyla kullanılır MVC. İçinde form öğesi olan bir jsp olsun

üzerinde JSP

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

(Yaylı Form yöntemi, Basit form elemanı da kullanılabilir)

Kontrolör Tarafında

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

}

Şimdi formu gönderdiğinizde, form alanları değerlerini kullanabileceksiniz.


4

Bir yöntem parametresini veya yöntem döndürme değerini, bir web görünümüne maruz bırakılan adlandırılmış bir model özniteliğine bağlayan ek açıklama.

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


1

@ModelAttribute(@ModelAttribute("Testing") Test test) as Testing verilen örnekte sizin tarafınızdan belirtilen adla bir öznitelik oluşturur , Test, çekirdeğin referansı olan fasulye testidir ve Test, jsp sayfalarında sakladığınız değerlerin alınması için daha fazla kullanabilmeniz için modelde kullanılabilir senin içinde ModelAttribute.


1

@ModelAttribute, kontrolör sınıfındaki mantığımızı gerçekleştirmek için jsp alanlarından Pojo calss'a sadece değeri bağlar. Payandalara aşina iseniz, bu form gönderildikten sonra formbean nesnesini doldurmak gibidir.


0

ModelAttribute notu, Spring MVC Web uygulamasının bir parçası olarak kullanılır ve iki senaryoda kullanılabilir.

Her şeyden önce, bir JSP öncesi yük modeline veri enjekte etmek için kullanılabilir. Bu özellikle, tüm verilerin kendisini görüntülemek için bir JSP'nin gerekli olmasını sağlamada yararlıdır. Bir enjeksiyon, modele bir yöntem bağlanarak elde edilir.

İkincisi, mevcut bir modelden veri okumak ve bunu koçun yönteminin parametrelerine atamak için kullanılabilir.

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


0

Yöntem Düzeyinde

Ek açıklama yöntem düzeyinde kullanıldığında, bu yöntemin amacının bir veya daha fazla model özelliği eklemek olduğunu belirtir.

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

Yöntem Bağımsız Değişkeninde 1. Yöntem bağımsız değişkeni olarak kullanıldığında, bağımsız değişkenin modelden alınması gerektiğini belirtir. Mevcut olmadığında ve önce örneklenip sonra modele eklenip modelde bir kez bulunduğunda, argüman alanları eşleşen adlara sahip tüm istek parametrelerinden doldurulmalıdır. Böylece, form verilerini bir fasulye ile bağlar.

 @RequestMapping(value = "/addEmployee", method = RequestMethod.POST)
  public String submit(@ModelAttribute("employee") Employee employee) {
  return "employeeView";
  }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.