1つのフォームと2つのボタンがあるHTMLページのフラグメントがあります。
<form action="#" data-th-action="@{/action/edit}" data-th-object="${model}" method="post">
<button type="submit" name="action" value="save">save</button>
<button type="submit" name="action" value="cancel">cancel</button>
</form>
そしてコントローラー:
@RequestMapping(value="/edit", method=RequestMethod.POST)
public ModelAndView edit(@ModelAttribute SomeModel model,
@RequestParam(value="action", required=true) String action) {
if (action.equals("save")) {
// do something here
}
if (action.equals("cancel")) {
// do another thing
}
return modelAndView;
}
これはうまく機能しますが、ボタンがもっとある場合は、if
文字列を確認するために、action
ステートメントを追加する必要があります。フォームで1つのアクションを各ボタンに作成できる別の方法はありますか?
Params変数を使用して、異なる@RequestMappings
で個別のメソッドを作成できます。
@RequestMapping(value="/edit", method=RequestMethod.POST, params="action=save")
public ModelAndView save() {}
@RequestMapping(value="/edit", method=RequestMethod.POST, params="action=cancel")
public ModelAndView cancel() {}
If-caseの代わりにswitch caseを使用することもできますが、すべてのオプションを新しいリクエストマッピングとして取得したくない場合があります。
@RequestMapping(value="/edit", method=RequestMethod.POST)
public ModelAndView edit(@ModelAttribute SomeModel model,
@RequestParam(value="action", required=true) String action) {
switch(action) {
case "save":
// do stuff
break;
case "cancel":
// do stuff
break;
case "newthing":
// do stuff
break;
default:
// do stuff
break;
}
}