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


372

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



40
読者がSpringの公式ドキュメントよりも多くの情報(例を含む)を入手できるため、これは有用な質問だと思います。
anton1980 14

3
この記事をここで確認してください。thespringthing.blogspot.com/2010/11/...
praveenj

回答:


399

@ModelAttributeModelオブジェクト(MVCのM;)のプロパティを参照しているので、「Person」というフォームバッキングオブジェクトを持つフォームがあるとします。次に、@ModelAttributeアノテーションを使用して、Spring MVCにこのオブジェクトをControllerメソッドに提供させることができます。:

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

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

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

この注釈付きメソッドは、Springによってモデルに自動的に追加されるため、ビューのPersonオブジェクトへのアクセスを許可します。

「@ModelAttributeの使用」を参照してください。


8
@fasseg @ModelAttribute最初のケースでは実際には必要ありません。
Neil McGuigan 2015年

@Neil @ModelAttributeメソッド属性でいつ使用する必要がありますか?
ライアン


1
Personの入力方法とこのメソッドの呼び出し方法を含める必要があります。
Philip Rego

134

私はこれが古い糸であることを知っていますが、私は帽子をリングに投げて、もう少し水を濁らせることができるかどうか見てみました:)

最初に理解するの@ModelAttributeに苦労したのは、いくつかの注釈を1つにまとめるというSpringの決定の結果であることがわかりました。それをいくつかの小さな注釈に分割すると、より明確になりました。

パラメータアノテーションについて@ModelAttributeは、同等のものと考えてください。@Autowired + @Qualifierつまり、指定された名前のBeanをSpring管理モデルから取得しようとします。名前付き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すべてを網羅するアノテーションを作成するという正しい決定をしました。誰もが注釈を表示したくありません。


2
@mはデフォルトでシングルトンです。ここで同じ概念が適用されるかどうかはわかりません。
ゾンビ

10
絶対違う。この複雑な注釈を説明するために、単純な注釈を使用しています。文字通りではなく、概念的に説明してください。
Christopher Yang

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

28

私のスタイルでは、常に@ModelAttributeを使用して、Springフォームの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)

本のすべてのフィールド名は、フォームのサブ要素のパスと一致する必要があります


4
catch動詞は正確に仕事を説明し@ModelAttribute行っています。いいね。
Eddy

3
今年のベストアンサー。
Jupiter Cls 2017年

4
しかし、それは必要ですか?これは、@ ModelAttributeアノテーションを使用しなくても機能します。

23

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

public class Person {
    private String name;

    public String getName() {
        return name;
    }

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

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

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”})モデルの値としてリストを持ちます(モデルはmap(key:value)と考えることができます)。 @ModelAttributeコントローラにおける方法は、前に呼び出される@RequestMapping同じコントローラ内、方法を。

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

ここに画像の説明を入力してください

2.メソッド引数

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

メソッド引数の@ModelAttributeは、引数がモデルから取得されることを示します。したがって、この場合は、モデル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などでも定義できます。


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" path = "lastName"これらは、フォームが呼び出されたときのStudentClassのフィールド/プロパティですが、それらのゲッターが呼び出されますが、一度送信されると、セッターが呼び出され、modelAttribute =で示されたBeanに値が設定されますformタグ内の「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 @ModelAttributeは、名前のモデル属性にメソッドのパラメータまたはメソッドの戻り値をバインドする注釈ですそして、それをWebビューに公開します。

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

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

ステップ2: フォーム送信 モデルのmodelAttribute = "student"は生徒を変更し、フォームのすべてのパラメーターを保持します

ステップ3: @ModelAttribute(「学生」)学生theStudent 我々はによって保留された値をフェッチ@ModelAttributeし、学生に全体豆/オブジェクトを割り当てます。

ステップ4:そして、私がしたようにページにそれを表示するのと同じように、私たちは入札するときにそれを使用します

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


9

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

  1. コントローラからUIへ、そして
  2. UIからコントローラーへ。

ここで私たちが関心を持っているのは、データがUIからコントローラーにどのように通信されるかです。これは、次の2つの方法でも実行できます。

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

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

フォーム提出表現

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

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

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

社内作業

まず、Userのようなモデルクラスを定義する必要があります。この場合、フィールドの数はHTMLフォームのフィールドの数と正確に一致する必要があります。また、HTMLフォームで使用する名前は、Javaクラスで使用している名前と一致する必要があります。これら2つは非常に重要です。名前は一致する必要があり、フォーム内のフィールド数は、作成するクラス内のフィールド数と一致する必要があります。これを実行すると、コンテナは自動的に受信したデータを読み取り、このモデルのオブジェクトを作成して値を設定し、それをコントローラーに渡します。コントローラ内のこれらの値を読み取るには、@ ModelAttributeを使用しますメソッドパラメータの注釈。コントローラーでメソッドを作成するときは、@ ModelAttributeを使用してパラメーターを追加し、コンテナーによってこのオブジェクトが自動的に指定されるようにします。

ユーザーを登録するためのサンプルコードは次のとおりです。

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

この図解の説明がお役に立てば幸いです。


4

これは、Springでのデータバインディングの目的で使用されますMVC。フォーム要素が含まれているjspを作成してみましょう。

オン JSP

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

(Spring Formメソッド、Simple form要素も使用できます)

コントローラ側

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

}

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


4

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

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

3

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

参照 http://www.javabeat.net/modelattribute-spring-mvc/


1

@ModelAttribute(@ModelAttribute("Testing") Test test) as Testing 与えられた例で指定した名前の属性を作成します。TestはBeanへの参照であるBeanテストであり、Testingはモデルで使用できるので、jspページでそれを使用して、保存した値を取得できます。あなたでModelAttribute


1

@ModelAttributeは、jspフィールドの値をPojo calssにバインドするだけで、コントローラークラスでロジックを実行します。Strutsに精通している場合、これは送信時にformbeanオブジェクトを生成するようなものです。


0

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

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

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

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


0

メソッドレベル

1.アノテーションがメソッドレベルで使用されている場合、そのメソッドの目的が1つ以上のモデル属性を追加することであることを示します。

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

メソッド引数で1.メソッド引数として使用される場合、それは引数がモデルから取得されるべきであることを示します。存在せず、最初にインスタンス化してからモデルに追加する必要があり、モデルに存在する場合、引数フィールドには、一致する名前を持つすべてのリクエストパラメータからデータを入力する必要があります。したがって、フォームデータをBeanにバインドします。

 @RequestMapping(value = "/addEmployee", method = RequestMethod.POST)
  public String submit(@ModelAttribute("employee") Employee employee) {
  return "employeeView";
  }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.