値を自動的に取得するサンプルを作成しました。
しかし、入力項目が多い画面を作る場合には
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;
}
}
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";
}
}
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>
<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>
<%@ 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をやろうと思います。