412

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

4

13 に答える 13

418

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

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

一方、注釈は、モデルの一部である必要があるオブジェクトを定義するために使用されます。したがって、モデルでPersonオブジェクトを参照する場合は、次のメソッドを使用できます。

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

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

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

于 2010-08-06T11:56:28.527 に答える
150

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

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

パラメータアノテーションの場合、Springマネージドモデルから指定された名前のBeanを取得しようとする@ModelAttributeのと同等であると考えてください。@Autowired + @Qualifier名前付き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包括的なアノテーションを作成するという正しい決定を下しました。誰もスモーガスボードの注釈を見たくありません。

于 2013-01-31T00:59:08.867 に答える
33

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

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

于 2015-12-31T02:50:20.523 に答える
31

それで、もっと簡単に説明しようと思います。持ってみましょう:

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は、引数をモデルから取得する必要があることを示します。したがって、この場合、Model personオブジェクトにキーがあり、その値を取得してメソッド引数Personpersonに配置する必要があります。そのようなものが存在しない場合、または((value = "persson")のスペルを間違える場合があります)、Springはそれをモデルで検出せず、デフォルトを使用して空のPersonオブジェクトを作成します。次に、リクエストパラメータを取得し、それらの名前を使用してPersonオブジェクトにデータバインドしようとします。

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

したがって、nameがあり、setName(String name)を使用してPerson.nameにバインドされます。だからで

//..Some logic with person

値「Dimitrij」でこの塗りつぶされた名前にアクセスできます。

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

  1. 同時に、引数に@ModelAttributeを使用して、モデルに注釈を付けたメソッドとリクエストメソッドハンドラーを含めることができます。次に、ルールを結合する必要があります。

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

于 2016-12-11T20:11:59.140 に答える
27

私はパーティーに遅れていることは知っていますが、彼らが言うように、「決して遅れないよりも遅れたほうがいい」と引用します。それでは、始めましょう。誰もが物事を説明する独自の方法を持っています。例を挙げて、いくつかのステップでそれを要約し、簡単に説明してみましょう。単純なフォームがあるとします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>

<form:input path="firstName" /> <form:input path="lastName" />これらはStudentクラスのフィールド/プロパティです。フォームが呼び出される/初期化されると、ゲッターが呼び出されます。フォーム送信時に、それらのセッターが呼び出され、それらの値はmodelAttribute="student"、フォームタグで示されたBeanに転送されます。

StudentController次の方法が含まれています。

@RequestMapping("/showForm")
// `Model` is used to pass data between controllers and views
public String showForm(Model theModel) {
    // attribute name, value
    theModel.addAttribute("student", new Student());
    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}

@ModelAttributeでは、 SpringMVCには何が含まれているのかという質問に戻りましょう。ソースからのサンプル定義、 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:
フォームの送信時に、processForm()メソッドはパラメーターを使用して呼び出されます@ModelAttribute("student") Student theStudent。フォームに保持されている値がフェッチされ、オブジェクトmodelAttribute="student"のフィールドに割り当てられました。Student

ステップ4:
そして、私が行ったようにページなどに表示するのと同じように、入札時に使用します

コンセプトを理解するのに役立つことを願っています。ありがとう

于 2017-11-09T17:00:13.063 に答える
13

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

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

ここで関心があるのは、データがUIからコントローラーにどのように伝達されるかです。これは、次の2つの方法でも実行できます。

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

HTMLフォームの使用:以下のシナリオを検討してください。

フォーム提出表現

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

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

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

内部作業

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

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

于 2019-03-01T08:49:12.447 に答える
4

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

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

于 2015-12-14T14:03:52.220 に答える
4

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

public String add(@ModelAttribute("specified") Model model) {
    ...
}
于 2016-04-25T09:23:34.310 に答える
4

これは、Springのデータバインディングの目的で使用されます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,...) {

}

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

于 2016-08-24T07:05:39.080 に答える
1

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

于 2016-01-28T07:50:30.980 に答える
1

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

于 2018-05-01T17:32:51.540 に答える
0

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

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

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

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

于 2019-02-02T12:07:44.097 に答える
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";
  }
于 2019-10-30T10:52:58.797 に答える