Spring WebMVCをやってみる (11) - @RequestMappingのparams -
例えば
<form action="/swmvc/sample/index.action" method="post">
<input type="submit" name="say1" value="say1" />
<input type="submit" name="say2" value="say2" />
</form>
っていうようにターゲットとなるアクションは1つでサブミットによって処理されるアクションを切り分けたい場合には@RequestMappingアノテーションにparams属性で<input type="submit">で指定されてるname属性の値を指定すれば良いらしいとの事
SampleController.java
package sample;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/sample")
public class SampleController {
@RequestMapping(value = "/index", method = RequestMethod.GET)
public String index() {
return "edit";
}
@RequestMapping(value = "/index", method = RequestMethod.POST, params = "say1")
@ResponseBody
public String say1() {
return "hoge";
}
@RequestMapping(value = "/index", method = RequestMethod.POST, params = "say2")
@ResponseBody
public String say2() {
return "fuga";
}
}
っていう感じで
- <input type="submit" name="say1" /> ではsay1メソッドが発生
- <input type="submit" name="say2" /> ではsay2メソッドが発生
っていう事になる
SampleControllerTest.java
package swmvc;
import org.junit.Test;
import static org.hamcrest.Matchers.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
public class SampleControllerTest extends AbstractTestCase {
@Test
public void test_say1() throws Exception {
mock.perform(post("/sample/index").param("say1", ""))
.andExpect(status().isOk())
.andExpect(content().string(is("hoge")));
}
@Test
public void test_say2() throws Exception {
mock.perform(post("/sample/index").param("say2", ""))
.andExpect(status().isOk())
.andExpect(content().string(is("fuga")));
}
}
余談: GETリクエストでも問題無いのかって件
例えば上記のPOSTリクエストで受け付ける条件を排除してGETリクエストで送るのは出来るのかって話ですが、結論から言えば出来る
- http://localhost:8080/[context]/sample/index.action -> 400 Bad Request
- http://localhost:8080/[context]/sample/index.action?say1 -> 200 OK
- http://localhost:8080/[context]/sample/index.action?say2 -> 200 OK
というようになる模様