画面実装をしていると、1つのformの中に複数のsubmitボタンを配置する、なんてケースがあると思います。自分は昔Struts1系でこのようなケースに出会いかなりめんどい、かつ複雑な実装で制御していましたorz
Spring MVCでは、このようなケースも@RequestMappingアノテーションのparams属性で簡単に制御できます。params属性とは、マッピング対象にするリクエストパラメータを指定する属性です。
例えば(若干強引ですが)以下のように1つのformの中に2つのsubmitボタンがあるとします。
<form action="/customers/edit" method="post" >
<input type="text" id="firstName" name="firstName" />
<input type="text" id="lastName" name="lastName" />
<input type="submit" name="goToTop" value="戻る" />
<input type="submit" name="update" value="更新" />
</form>
「戻る」ボタン、「更新」ボタンを押下した場合、それぞれリクエストボディは以下のようになります。
firstName:入力値
lastName:入力値
goToTop:戻る
firstName:入力値
lastName:入力値
update:更新
この時実行されるメソッドはparams属性とリクエストパラメータ(リクエストボディ)のname属性が一致したものになります。
@Controller
@RequestMapping("customers")
public class CustomerController {
~色々略~
@RequestMapping(value = "edit", params = "goToTop", method = RequestMethod.POST)
String goToTop(/* 任意 */) {
~略~
}
@RequestMapping(value = "edit", params = "update", method = RequestMethod.POST)
String update(/* 任意 */) {
~略~
}
}
なので、「戻る」ボタンが押下された場合はgoToTopメソッドが、「更新」ボタンが押下された場合はupdateメソッドがマッピングされ実行されます。
また、上記はPOSTメソッドですがGETメソッドでも考え方は同じです。ただ、GETメソッドの場合はURLパラメータで判断されます。上記をGETメソッドに変えた場合、
localhost:8080/customers/edit?lastName=入力値&firstName=入力値&goToTop=戻る
localhost:8080/customers/edit?lastName=入力値&firstName=入力値&update=更新
となり、それぞれURLパラメータにgoToTop、updateがあるのでPOSTの時と同じようにマッピングされます。
以上です。