SpringMVC 入力画面サンプル(モデル使用) | Hello, Stupid World!

Hello, Stupid World!

いろいろとメモ代わりに書いていきます。

前回、RequestParamアノテーションによりリクエスト中の
値を自動的に取得するサンプルを作成しました。

しかし、入力項目が多い画面を作る場合には
RequestParamでは引数が多くなり、扱いづらいかと
思います。

そんな時に入力値をBeanで受取れる機能を
今回は使ってみます。
(StrutsのActionFormと同じようなものです)

これが値の受渡しに使うBean(モデル)です。

[InputModel.java]
public class InputModel {
  private String name;
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
}


見てのとおり、普通のPOJOです。
次にController

[UserController.java]
@Controller
public class UserController {
  @ModelAttribute
  public InputModel setUpInputModel() {
    return new InputModel();
  }

  @RequestMapping(method = RequestMethod.GET)
  public String input() {
    return "user/input";
  }

  @RequestMapping(method = RequestMethod.POST)
  public String show(@ModelAttribute("inputModel") InputModel inputModel, Model model) {
    model.addAttribute("inputModel", inputModel);
    return "user/show";
  }
}


前回と異なるのはModelAttributeというアノテーションが
ついているメソッドが増えているのと、同じくModelAttributeという
アノテーションがRequestParamアノテーションがついていた
箇所についていることです。

このModelAttributeはRequestMappingメソッド
(RequestMappingアノテーションがついているメソッド)
の前に呼ばれます。
ここでインスタンス化した
モデルクラスがRequestMapping
メソッドに渡されます。
初期値をセットして渡すと画面表示時に値をセットできます。

また、Modelクラスにモデルクラスをそのまま追加しています。
こうすることで複数の属性を一つずつ渡す手間が省けます。

[input.jsp]
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<html>
  <head>
    <meta charset="utf-8">
    <title>inputのサンプル</title>
  </head>
  <body>
  <form:form modelAttribute="inputModel">
    name: <form:input path="name"/>
    <input type="submit"/>
  </form:form>
  </body>
</html>

入力画面では値の受渡しに使うモデルを
modelAttribute属性で指定します。
先ほどのmodelAttributeアノテーションをつけたメソッドで
値がセットされている場合、その値が画面に表示されます。

[show.jsp]
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
    <head>
        <title>Echo Application</title>
    </head>
    <body>
        Hello <c:out value="${inputModel.name}" />!
    </body>
</html>

先ほど渡したモデルクラスのname属性を表示しています。

動作の順番やアノテーションなどを覚える必要がありますが
一度覚えてしまえば簡単かつ柔軟に作成していくことができます。

次回はvalidatorをやろうと思います。