web-dev-qa-db-ja.com

Spring MVCの@ModelAttributeとは何ですか?

Spring MVCでの@ModelAttributeの目的と使用法は何ですか?

337
Mohammad Adnan

@ModelAttribute はModelオブジェクトのプロパティ(MVCではM)を参照しているので、 "Person"というフォームバッキングオブジェクトを含むフォームがあるとしましょう。 @ModelAttributeアノテーションを使用したControllerメソッド

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

例(Spring 2.5)についてはこちら を参照してください。 "メソッド引数での@ModelAttributeの使用" (Spring 3.1)も参照してください。

一方、アノテーションはモデルの一部となるべきオブジェクトを定義するために使用されます。そのため、モデル内でPersonオブジェクトを参照したい場合は、次のメソッドを使用できます。

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

このアノテーションが付けられたメソッドはあなたのViewのPersonオブジェクトへのアクセスを許可します、なぜならそれはSpringによって自動的にModelsに追加されるからです。

"メソッドでの@ModelAttributeの使用" (Spring 3.1)を参照。

これが役に立ったことを願っています。

376
fasseg

私はこれが古いスレッドであることを知っています、しかし私はリングに私の帽子を投げて、私がもう少し水をどろどろにすることができるかどうか見ることを考えました:)

@ModelAttributeを理解するための私の最初の苦労は、複数のアノテーションを一つにまとめるというSpringの決定の結果でした。私がそれをいくつかのより小さな注釈に分割したらそれはより明確になりました:

パラメータアノテーションについては、@ModelAttribute@Autowired + @Qualifierと同等のものと考えてください。つまり、Spring管理モデルから指定された名前のbeanを取得しようとします。名前付きBeanが見つからない場合、エラーをスローしたりnullを返す代わりに、暗黙的に@Beanの役割を引き継ぎます。つまり、デフォルトのコンストラクタを使用して新しいインスタンスを作成し、そのBeanをモデルに追加します。

メソッドアノテーションについては、@ModelAttribute@Bean + @Beforeと同等のものと考えてください。つまり、ユーザーのコードによって構築されたbeanをモデルに入れ、それは常に要求処理メソッドの前に呼び出されます。

比喩的に、私は@ModelAttributeを次のように見ています(文字通りそれを使わないでください!!)。

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

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

ご覧のとおり、Springは@ModelAttributeを包括的なアノテーションにすることを正しく決定しました。注釈smorgasbordを見たくはありません。

125

私のスタイルでは、Springフォームのjspからオブジェクトをキャッチするために@ModelAttributeを常に使用します。たとえば、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)

そしてbookのすべてのフィールド名はformのサブ要素のpathと一致しなければなりません

22
Leang Socheat

だから私はもっと簡単な方法でそれを説明しようとします。持ってみましょう:

public class Person {
    private String name;

    public String getName() {
        return name;
    }

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

Spring MVCのドキュメントで説明されているように、 @ModelAttribute アノテーションは methods またはon メソッド引数 で使用できます。そしてもちろん、1つのコントローラで両方を同時に使用することもできます。

1.メソッドアノテーション

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

このような方法の目的は、モデルに属性を追加することです。そのため、私たちの場合、 cities keyはモデルの値としてリストnew Arras.asList(new[]{“Sofia”,”Pleven","Ruse”})を持ちます(Modelをmap(key:value)と考えることができます)。 @ModelAttribute コントローラ内のメソッドは、同じコントローラ内で @RequestMapping methodsの前に呼び出されます。

ここで、ユーザーに表示するためにフォームで使用される共通情報をモデルに追加します。たとえば、HTMLのselectを埋めるために使用できます。

enter image description here

2.Method引数

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

メソッド引数の@ModelAttributeは、引数をモデルから取得する必要があることを示します。そのため、この場合、Model person オブジェクトにキーとして含まれており、その値を取得してそれをメソッド引数 Person person に格納する必要があります。そのようなものが存在しない場合や(時々(value = "persson")のスペルを間違えた場合)、Springはモデル内でそれを見つけられず、デフォルトを使って空のPersonオブジェクトを作成します。その後、リクエストパラメータを受け取り、それらの名前を使用してPersonオブジェクトにデータバインドします。

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

だから我々は名前を持っており、それはsetName(String name)を使ってPerson.nameにバインドされるでしょう。だから

//..Some logic with person

"Dimitrij"という値でこの塗りつぶされた名前にアクセスできます。

もちろん、Springはリスト、マップ、マップのセットのリストなどのようなより複雑なオブジェクトをバインドすることができますが、シーンの裏側ではデータバインドが魔法になります。

  1. 引数に@ModelAttributeを使用して、モデルアノテーション付きメソッドとリクエストメソッドハンドラを同時に持つことができます。それから私達は規則を結合しなければならない。

  2. もちろん、さまざまな状況があります - @ ModelAttributeメソッドは@ControllerAdviceなどでも定義できます。

17
Xelian

私はパーティーに遅刻しているのを知っている、しかし私は彼らが言うように引用する、「決して遅刻しないほうがいい」。それでは、始めましょう、みんなが物事を説明するための独自の方法を持っています。例を挙げていくつかのステップで要約して簡単に説明しましょう。単純なフォーム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内のフィールド/プロパティですが、一度送信されると、そのsetterが呼び出され、その値はmodelAttribute =で示されたBeanに設定されます。フォームタグ内の "student".

以下のメソッドを含む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 

これでようやくform-details.jspができました

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

それでは質問に戻りましょう。Spring MVCの@ModelAttributeは何ですか?あなたのためのソースからのサンプル定義、 http://www.baeldung.com/spring-mvc-and-the-modelattribute-annotation The@ModelAttributeはメソッドパラメータまたはメソッド戻り値を名前付きモデル属性にバインドし、それをWebビューに公開するアノテーション。

実際に行われるのは、それによって送信されていたur formのすべての値を取得し、それらをオブジェクトにバインドまたは割り当てるためにそれらを保持することです。これは@RequestParameterと同じように機能します。ここではパラメータを取得し、その値を何らかのフィールドに割り当てるだけです。唯一の違いは@ModelAttributeは単一のパラメータではなくすべてのフォームデータを保持することです。後で開発者が使用するフォーム送信データを保持するBeanを作成します。

全体を要約する。ステップ1:リクエストが送信され、私たちのメソッドshowFormが実行され、モデル、一時Beanがstudentという名前で設定され、フォームに転送されます。theModel.addAttribute( "student"、new Student());

ステップ2:modelAttribute = "student"フォーム送信モデルで学生を変更し、フォームのすべてのパラメータを保持するようになりました

ステップ3:@ModelAttribute( "student")Student theStudent@ModelAttributeによって保持されている値を取得し、Bean全体を割り当てます。学生に/オブジェクト。

ステップ4:それから、入札時にそれを使用します。ちょうど私がしたようにページ上に表示するのと同じです。

あなたがその概念を理解するのに役立つことを願っています。ありがとう

9
Majid Ali Khan

メソッドパラメータまたはメソッド戻り値を名前付きモデル属性にバインドし、Webビューに公開するアノテーション。

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

これはSpringのデータバインディングの目的で使われていますMVC。フォーム要素を含むJSPを作成します。

JSPについて

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

(Springフォーム方式、単純フォーム要素も使用可能)

コントローラ側

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

}

これでフォームを送信するときにフォームフィールドの値が利用できるようになります。

3
Awais

@ModelAttributeは、メソッドの引数/パラメータとして、またはメソッドの宣言の前に使用できます。リクエストパラメータまたはフォームフィールドをモデルオブジェクトにバインドするためのこのアノテーションの主な目的

参考文献 http://www.javabeat.net/modelattribute-spring-mvc/ /

2
Chethan D

Gmail、Facebook、Instagram、その他のWebアプリケーションを問わず、あらゆるWebアプリケーションを使用できます。エンドユーザーとアプリケーション間、またはUIとバックエンドアプリケーション間でデータや情報を交換することがすべてです。 Spring MVCの世界でも、データを交換する方法は2つあります。

  1. コントローラからUIへ
  2. uIからコントローラへ。

ここで私たちが興味を持っているのは、データがUIからコントローラーにどのように伝達されるかです。これは2つの方法でも行うことができます。

  1. HTMLフォームを使用する
  2. クエリパラメータの使用.

HTMLフォームを使用する:以下のシナリオを考えます。

Form Submission Representation

Webブラウザからフォームデータを送信すると、Controllerクラスのそのデータにオブジェクトとしてアクセスできます。 HTMLフォームを送信すると、Spring Containerは4つのことを行います。そうなる、

  1. 最初に、 request.getParameter メソッドを使用して、リクエストに含まれる送信済みデータをすべて読み取ります。
  2. それらが読み込まれると、 integer.parseInt double.parseDouble 、およびそのデータ型に基づいて使用可能な他のすべての解析メソッドを使用して、適切なJava型に変換されます。データ。
  3. 解析すると、作成したモデルクラスのオブジェクトが作成されます。たとえば、このシナリオでは、送信されているのはユーザー情報であり、Userというクラスを作成します。これにより、Containerによってオブジェクトが作成され、自動的に入力されるすべての値がそのオブジェクトに設定されます。
  4. それはそれから値をコントローラに設定することによってそのオブジェクトを引き渡します。

このすべてを機能させるには、特定の手順に従う必要があります。

Internal working

最初にUserのようなモデルクラスを定義する必要があります。そこではフィールドの数が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";
}

この図による説明が助けになれば幸いです!

2
Nithin Prasad

@ModelAttributeは単純にjspフィールドからPojo calssに値をバインドして、コントローラクラスでロジックを実行します。あなたがストラットに精通しているならば、これは提出時にformbeanオブジェクトを生成するようなものです。

1
Ragu Venkatesan

ModelAttributeアノテーションは、Spring MVC Webアプリケーションの一部として使用され、2つのシナリオで使用できます。

まず第一に、それはJSP以前のロードモデルにデータを注入するために使用することができます。これは、JSPがすべてのデータ自体を表示するために必要であることを確認するのに特に役立ちます。注入は、1つの方法をモデルに接続することによって得られます。

次に、既存のモデルからデータを読み取り、それをコーチの方法のパラメータに割り当てるために使用できます。

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

0
ismael