@ModelAttribute
Spring MVC の目的と使用法は何ですか?
@ModelAttribute
Spring MVC の目的と使用法は何ですか?
回答:
@ModelAttribute
Modelオブジェクト(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の使用」を参照してください。
@ModelAttribute
最初のケースでは実際には必要ありません。
@ModelAttribute
メソッド属性でいつ使用する必要がありますか?
私はこれが古い糸であることを知っていますが、私は帽子をリングに投げて、もう少し水を濁らせることができるかどうか見てみました:)
最初に理解するの@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
すべてを網羅するアノテーションを作成するという正しい決定をしました。誰もが注釈を表示したくありません。
@Scope("request")
then :)
私のスタイルでは、常に@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)
本のすべてのフィールド名は、フォームのサブ要素のパスと一致する必要があります
catch
動詞は正確に仕事を説明し@ModelAttribute
行っています。いいね。
だから私はそれをもっと簡単な方法で説明しようとします。持ってみましょう:
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は、リスト、マップ、マップのセットのリストなどのより複雑なオブジェクトをバインドできますが、舞台裏では、データバインドが魔法のようになります。
同時に、アノテーション付きのモデルを作成し、引数に@ModelAttributeを使用してメソッドハンドラーをリクエストできます。次に、ルールを統合する必要があります。
もちろん、さまざまな状況があります。@ 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のフィールド/プロパティですが、それらのゲッターが呼び出されますが、一度送信されると、セッターが呼び出され、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:そして、私がしたようにページにそれを表示するのと同じように、私たちは入札するときにそれを使用します
概念の理解に役立つことを願っています。ありがとう
Gmail、Facebook、Instagram、その他のWebアプリケーションのいずれのWebアプリケーションでも、エンドユーザーとアプリケーション、またはUIとバックエンドアプリケーションの間でデータや情報を交換することがすべてです。Spring MVCの世界でも、データを交換する方法は2つあります。
ここで私たちが関心を持っているのは、データがUIからコントローラーにどのように通信されるかです。これは、次の2つの方法でも実行できます。
HTMLフォームの使用:以下のシナリオを考えてみます。
Webブラウザーからフォームデータを送信すると、Controllerクラスのオブジェクトとしてそのデータにアクセスできます。HTMLフォームを送信すると、Spring Containerは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";
}
この図解の説明がお役に立てば幸いです。
これは、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,...) {
}
フォームを送信すると、フォームフィールドの値が利用できるようになります。
@ModelAttributeは、メソッドの引数/パラメータとして、またはメソッド宣言の前に使用できます。このアノテーションの主な目的は、リクエストパラメータまたはフォームフィールドをモデルオブジェクトにバインドすることです。
@ModelAttributeは、jspフィールドの値をPojo calssにバインドするだけで、コントローラークラスでロジックを実行します。Strutsに精通している場合、これは送信時にformbeanオブジェクトを生成するようなものです。
ModelAttributeアノテーションは、Spring MVC Webアプリケーションの一部として使用され、2つのシナリオで使用できます。
まず、JSP以前のロードモデルにデータを挿入するために使用できます。これは、すべてのデータ自体を表示するためにJSPが必要であることを確認するのに特に役立ちます。注入は、1つのメソッドをモデルに接続することによって取得されます。
次に、既存のモデルからデータを読み取り、それをCoachのメソッドのパラメーターに割り当てるために使用できます。
refrence https://dzone.com/articles/using-spring-mvc%E2%80%99s
メソッドレベル
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";
}