2

私はSpring2.5の注釈付きコントローラーを持っており、@ RequestMapping(method = RequestMethod.GET)で注釈が付けられたメソッドがあり、モデルを埋めるためにいくつかのロジックを実行します。

リクエストを実行する@RequestMapping(method = RequestMethod.POST)で注釈が付けられたメソッドもあります。このメソッドには、自分のフォームpojoを含む@ModelAttribute注釈付きパラメーターがあります。これをMyFormと呼びましょう。MyFormの初期化メソッドもあり、これも@ModelAttrributeで注釈が付けられています。これまでのところ、すべてが期待どおりに機能しています。POSTリクエストで、フォームデータがMyFormにバインドされ、処理できるようになりました。

問題は、(GET)リクエストパラメータを渡すことでフォームに事前入力できるようにしたいことです。MyFormの@ModelAttributeメソッドがあるので、モデルにMyFormインスタンスを取得しますが、GETメソッドのパラメーターとして特に使用しない限り、インスタンスは設定されません。

なぜこれを行う必要があるのですか?別の方法でGETリクエストのフォームにデータバインディングを強制することは可能ですか?パラメータを渡すだけですが、すでにモデルに含まれているため、何もする必要がなく、未使用のメソッドパラメータが醜くなります。

[編集:説明するためのいくつかのコード例]

getリクエストでフォームに入力しないコントローラー:

@Controller
public class MyController {

  @ModelAttribute("myForm")
  public MyForm createForm() {
    return new MyForm();
  }

  @RequestMapping(method=RequestMethod.GET)
  public void handlePage(Model model) {
    //Do some stuff to populate the model....
  }

  @RequestMapping(method=RequestMethod.POST)
  public void processForm(@ModelAttribute("myForm") MyForm myForm) {
    //Process the form
  }
}

handlePageメソッドのメソッドシグネチャを変更すると、getリクエストで入力されます...

@RequestMapping(method=RequestMethod.GET)
public void handlePage(Model model, @ModelAttribute("myForm") MyForm myForm) {
  //Do some stuff to populate the model....
}
4

1 に答える 1

3

The method with the @ModelAttribute is allowed to have any arguments that @RequestMapping supports, so for example you could add how ever many @RequestParam arguments as needed to populate your command object, or even the http request itself. I'm not sure if you can get an instance of the data binder in that same manner or not.

Reading the docs again I think the idea is that the pre-population in the @ModelAttribute method would be database driven, which is probably why there isn't any data binding happening without adding the @ModelAttribute as an argument to the @RequestMapping method.

于 2009-05-29T01:15:51.803 に答える