7

私はSpring MVCを学んでおり、データバインディングを表示するための基本的なコントローラーだけを実行するためにあらゆる場所を見てきましたが、仕事として試したことはありません。ビューの投稿をコントローラーにバインドでき、そこにプロパティを持つ pojo が表示されますが、そのオブジェクトをモデルに追加しようとすると、何も得られません。これが私がこれまでに持っているものです:

コントローラ

@Controller
public class HomeController {

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String home(Model model) {

        model.addAttribute(new Person());
        return "home";
    }

    @RequestMapping(value="/about", method=RequestMethod.POST)
    public void about(Person person, Model model)
    {
        model.addAttribute("person", person);
    }   
 }

バインドしたいクラス

public class Person {
private String _firstName;
private String _lastName;
private Date _Birthday;

//Set
public void setFirstName(String FirstName){this._firstName = FirstName; }
public void setLastName(String LastName){this._lastName= LastName; }
public void setBirthDate(Date BirthDate){ this._Birthday = BirthDate;}

//get
public String getFirstName(){return _firstName;}
public String getLastName(){return _lastName;}
public Date getBirthDate(){return _Birthday;}
}

ビュー - コントローラーからフォームへ! 働く

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<html>
</head>
    <body>
        FirstName: ${model.person.getFirstName}
        LastName: ${model.person.getLastName}
    </body>
</html>

バインドするには、何ができるか、またはこれが必要ですか?

4

4 に答える 4

8

モデル属性は、ここで欠けているものです。

@Controller
public class HomeController {

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

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String home() {
        return "home";
    }

    @RequestMapping(value="/about", method=RequestMethod.POST)
    public void about(@ModelAttribute("person") Person person, BindingResult result, Model model)
    {
        if( ! result.hasErrors() ){
             // note I haven't compiled this code :)
        } 
    }   
 }

@ModelAttribute メソッドは GET と POST の両方で呼び出され、GET リクエストではビューに公開され、POST ではリクエスト パラメータをバインドするために使用されるという考え方です。

BindingResultコマンドを使用して何かを実行できるように、 が POST メソッドに渡されることに注意してください。

于 2012-04-17T20:16:19.093 に答える
1

Person クラス変数、getter および setter メソッドの命名を確認してください。ゲッターメソッドは、変数名の「get」と最初の大文字で始まり、他の文字の場合も同じにする必要があります。たとえばgetFirstName()、セッターメソッドもゲッターメソッドと同様にする必要があります。getter メソッドと setter メソッドの命名規則が異なる場合、バインディングは正しく機能しません。これが Person クラスの更新バージョンです。

public class Person {
   private String firstName;
   private String lastName;
   private Date Birthday;

   //Set
   public void setFirstName(String FirstName){this.firstName = FirstName; }
   public void setLastName(String LastName){this.lastName= LastName; }
   public void setBirthDate(Date BirthDate){ this.Birthday = BirthDate;}

   //get
   public String getFirstName(){return firstName;}
   public String getLastName(){return lastName;}
   public Date getBirthDate(){return Birthday;}
}
于 2015-04-17T09:08:38.010 に答える
1

1) modelMap の内容は JSP 内で暗黙的です。それらにアクセスするときに「モデル」を指定する必要はありません。

2) JSP-EL は、メソッドを呼び出すのではなく、Bean プロパティ アクセサーを介してフィールドにアクセスします。実際のメソッドを呼び出すために「get」を指定しません。Bean プロパティ名を使用します。たとえば、${person.firstName} は person.getFirstName() の結果を取得します。

@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Model model) {
    Person person = new Person();
    person.setFirstName("Kai");
    person.setLastName("Cooper");
    model.addAttribute("person", person);
    return "home";
}

`

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<html>
</head>
    <body>
        FirstName: ${person.firstName}
        LastName: ${person.lastName}
    </body>
</html>
于 2012-04-17T20:34:33.460 に答える
1

Person オブジェクトも変更する必要があります。属性の前に「_」を付けないでください。「_firsName」を「firstName」に変更します。ゲッター、セッターは問題ありません。Spring バインディングは、属性名によって対応する getter および setter に移動します。

ビューでアクセスする方法も変更します。${person.firstName} のように使用します。「person.firstName」の前に「モデル」は必要ありません。また、getFirstName に言及する必要もありません。Spring が自動的にそれを行います。

于 2012-04-17T20:34:38.653 に答える