JSP名を文字列で返していましたが、もう一つ方法があります。
ModelAndViewというクラスを利用する方法です。
さっそくサンプルを見てみましょう。
[UserController.java]
@Controller
public class UserController {
@RequestMapping(method = RequestMethod.GET)
public ModelAndView input() {
return new ModelAndView("user/input", "inputModel", new InputModel());
}
@RequestMapping(method = RequestMethod.POST)
public ModelAndView show(@ModelAttribute("inputModel") InputModel inputModel) {
return new ModelAndView("user/show", "inputModel", inputModel);
}
}
public class UserController {
@RequestMapping(method = RequestMethod.GET)
public ModelAndView input() {
return new ModelAndView("user/input", "inputModel", new InputModel());
}
@RequestMapping(method = RequestMethod.POST)
public ModelAndView show(@ModelAttribute("inputModel") InputModel inputModel) {
return new ModelAndView("user/show", "inputModel", inputModel);
}
}
ModelAndViewクラスの引数に表示するビューの名前、使用モデル名、
モデルをセットしています。
モデルを使わないのならばビュー名だけ指定するコンストラクタ等も
あります。
また、今回はモデルをModelAttributeアノテーションをつけた
メソッドでインスタンス化せずにinputメソッド内でインスタンス化して
みました。
個人的にはStringで返す方法よりもこっちのが分かりやすいと
思いました。
(ModelAndViewを返しているから画面遷移だな・・・って感じで)
あと、Stringで返す方はModelの渡し方が分からずテストコードも
書けませんでした。
ちなみにModelAndViewを使った場合のテストコードはこんな感じ
でいけました。
[UserControllerTest.java]
public class UserControllerTest {
@Test
public void testInput() {
UserController user = new UserController();
ModelAndView modelView = user.input();
assertEquals("user/input", modelView.getViewName());
assertTrue(modelView.getModel().containsKey("inputModel"));
}
}
このテストコードだとinputメソッドが呼ばれた場合に正常に動いている
しか調べられません。
GET/POSTリクエストが飛んだ際に正常に動くかどうかをテストする
方法はまた別途説明します。