Spring MVC 入力項目
今回は、Jspで各入力項目をやります。プロジェクトの作成はこちらを参照して下さい。
UserModel.java
package spring.test;
public class UserModel {
private String txt;
private String area;
private String sel1;
private String sel2;
private boolean chk1;
private String[] chk2;
private String rdo1;
private String rdo2;
private String pass;
private String hdn;
public String toString() {
StringBuilder stb = new StringBuilder();
stb.append("txt:" + txt + System.lineSeparator());
stb.append("area:" + area + System.lineSeparator());
stb.append("sel1:" + sel1 + System.lineSeparator());
stb.append("sel2:" + sel2 + System.lineSeparator());
stb.append("chk1:" + chk1 + System.lineSeparator());
stb.append("chk2:" + chk2.length + System.lineSeparator());
stb.append("rdo1:" + rdo1 + System.lineSeparator());
stb.append("rdo2:" + rdo2 + System.lineSeparator());
stb.append("pass:" + pass + System.lineSeparator());
stb.append("hdn:" + hdn + System.lineSeparator());
return stb.toString();
}
public String getTxt() {
return txt;
}
public void setTxt(String txt) {
this.txt = txt;
}
public String getArea() {
return area;
}
public void setArea(String area) {
this.area = area;
}
public String getSel1() {
return sel1;
}
public void setSel1(String sel1) {
this.sel1 = sel1;
}
public String getSel2() {
return sel2;
}
public void setSel2(String sel2) {
this.sel2 = sel2;
}
public String[] getChk2() {
return chk2;
}
public void setChk2(String[] chk2) {
this.chk2 = chk2;
}
public String getRdo1() {
return rdo1;
}
public void setRdo1(String rdo1) {
this.rdo1 = rdo1;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
public String getHdn() {
return hdn;
}
public void setHdn(String hdn) {
this.hdn = hdn;
}
public boolean isChk1() {
return chk1;
}
public void setChk1(boolean chk1) {
this.chk1 = chk1;
}
public String getRdo2() {
return rdo2;
}
public void setRdo2(String rdo2) {
this.rdo2 = rdo2;
}
}
LoginControler.java
package spring.test.controller;
import java.util.LinkedHashMap;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import spring.test.UserModel;
@Controller
public class LoginControler {
@ModelAttribute("UM")
public UserModel init() {
UserModel um = new UserModel();
um.setTxt("test");
um.setRdo1("r1");
um.setRdo2("B");
return um;
}
public void setMap(Model model) {
LinkedHashMap<String, String> map = new LinkedHashMap<>();
map.put("A", "その1");
map.put("B", "その2");
model.addAttribute("map", map);
}
@RequestMapping(value = "/login", method = RequestMethod.GET)
public String loginGet(Model model) {
init();
setMap(model);
return "login";
}
@RequestMapping(value = "/login", method = RequestMethod.POST)
public String loginPost(@ModelAttribute("UM") UserModel userModel, Model model,
RedirectAttributes redirectAttributes) {
System.out.println(userModel.toString());
setMap(model);
return "login";
}
}
login.jsp
<%@page import="spring.test.UserModel"%>
<%@page import="spring.test.controller.LoginControler"%>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<html>
<head>
<title>ログイン</title>
<script type="text/javascript">
//テキスト読み込み時に実行
document.addEventListener("DOMContentLoaded", function() {
// form:select で複数選択した場合、選択されなかったため手動で選択。
// ※Modelで配列、リストにすればできた。「form:selectの追記」を参照
var ary = [];
<%
UserModel model = (UserModel) request.getAttribute("UM");
if (model != null && model.getSel2() != null) {
String[] strs = model.getSel2().split(",");
for (String str : strs) {
out.println("ary.push('" + str + "');");
}
}
%>
var obj = document.getElementById("sel2");
for (var i = 0; i < obj.length; i++) {
if (ary.indexOf(obj.options[i].value) >= 0) {
obj.options[i].selected = true;
}
}
}, false);
</script>
</head>
<body>
<spring:url value="/login" var="url" htmlEscape="true" />
<form:form action="${url}" method="POST" modelAttribute="UM">
<form:input path="txt" />
<hr />
<form:textarea path="area" />
<hr />
<form:select path="sel1" items="${map}" />
<hr />
<form:select path="sel2" multiple="true">
<form:option value="op1">オプション</form:option>
<form:options items="${map}" />
</form:select>
<hr />
<form:checkbox path="chk1" label="チェック" />
<hr />
<form:checkboxes path="chk2" items="${map}" />
<hr />
<form:radiobutton path="rdo1" label="ラジオ1" value="r1" />
<form:radiobutton path="rdo1" label="ラジオ2" value="r2" />
<hr />
<form:radiobuttons path="rdo2" items="${map}" />
<hr />
<form:password path="pass" />
<hr />
<form:hidden path="hdn" />
<BR />
<input type="submit" value="テスト" />
<BR />
<BR />
</form:form>
</body>
</html>
実行イメージ

コンソール出力
txt:test
area:aaa
bb
sel1:B
sel2:op1,B
chk1:true
chk2:2
rdo1:r2
rdo2:A
pass:xxxx
hdn:
Jspから作成されたHtml
(整形してます)
<html>
<head>
<title>ログイン</title>
<script type="text/javascript">
//テキスト読み込み時に実行
document.addEventListener("DOMContentLoaded", function() {
var ary = [];
var obj = document.getElementById("sel2");
for (var i = 0; i < obj.length; i++) {
if (ary.indexOf(obj.options[i].value) >= 0) {
obj.options[i].selected = true;
}
}
}, false);
</script>
</head>
<body>
<form id="UM"
action="/springMVC/login;jsessionid=004CFF0B3C51540AA02FE085AC4F556D"
method="POST">
<input id="txt" name="txt" type="text" value="test" />
<hr />
<textarea id="area" name="area"></textarea>
<hr />
<select id="sel1" name="sel1"><option value="A">その1</option>
<option value="B">その2</option></select>
<hr />
<select id="sel2" name="sel2" multiple="multiple">
<option value="op1">オプション</option>
<option value="A">その1</option>
<option value="B">その2</option>
</select><input type="hidden" name="_sel2" value="1" />
<hr />
<input id="chk11" name="chk1" type="checkbox" value="true" /><label
for="chk11">チェック</label><input type="hidden" name="_chk1" value="on" />
<hr />
<span><input id="chk21" name="chk2" type="checkbox" value="A" /><label
for="chk21">その1</label></span><span><input id="chk22" name="chk2"
type="checkbox" value="B" /><label for="chk22">その2</label></span><input
type="hidden" name="_chk2" value="on" />
<hr />
<input id="rdo11" name="rdo1" type="radio" value="r1"
checked="checked" /><label for="rdo11">ラジオ1</label> <input id="rdo12"
name="rdo1" type="radio" value="r2" /><label for="rdo12">ラジオ2</label>
<hr />
<span><input id="rdo21" name="rdo2" type="radio" value="A" /><label
for="rdo21">その1</label></span><span><input id="rdo22" name="rdo2"
type="radio" value="B" checked="checked" /><label for="rdo22">その2</label></span>
<hr />
<input id="pass" name="pass" type="password" value="" />
<hr />
<input id="hdn" name="hdn" type="hidden" value="" />
<BR />
<input type="submit" value="テスト" />
<BR />
<BR />
</form>
</body>
</html>
checkboxes、radiobuttonsを縦に並べる場合
checkboxes、radiobuttonsを縦に並べる場合、delimiterで<br>を指定します。
<hr />
<form:checkboxes path="chk2" items="${map}" delimiter="<br>" />
<hr />
<form:radiobuttons path="rdo2" items="${map}" delimiter="<br>" />
<hr />
実行イメージ

form:selectの追記
上のサンプルではform:selectをmultiにしたときにJavaScriptを使う必要があったのですが、Modelを配列、リストにしたら、JavaScriptなしで動作しました。ついでにリスト候補をModelにしてみました。
リストに表示するモデル
package spring.test;
public class DropModel {
private String key;
private String value;
public DropModel(String k, String v) {
key = k;
value = v;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
UserModel はSELECT以外の項目は削除し、配列、リスト形式に変更。
package spring.test;
import java.util.Arrays;
import java.util.List;
public class UserModel {
private String[] sel1;
private List<String> sel2;
public String toString() {
StringBuilder stb = new StringBuilder();
stb.append("sel1:" + Arrays.toString(sel1) + System.lineSeparator());
stb.append("sel2:" + sel2 + System.lineSeparator());
return stb.toString();
}
public String[] getSel1() {
return sel1;
}
public void setSel1(String[] sel1) {
this.sel1 = sel1;
}
public List<String> getSel2() {
return sel2;
}
public void setSel2(List<String> sel2) {
this.sel2 = sel2;
}
}
LoginControler は選択候補にDropModelを使用するように変更。
package spring.test.controller;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import spring.test.DropModel;
import spring.test.UserModel;
@Controller
public class LoginControler {
@ModelAttribute("UM")
public UserModel init() {
UserModel um = new UserModel();
return um;
}
public void setModel(Model model) {
List<DropModel> ary = new ArrayList<>();
ary.add(new DropModel("A", "その1"));
ary.add(new DropModel("B", "その2"));
model.addAttribute("ary", ary);
}
@RequestMapping(value = "/login", method = RequestMethod.GET)
public String loginGet(Model model) {
init();
setModel(model);
return "login";
}
@RequestMapping(value = "/login", method = RequestMethod.POST)
public String loginPost(@ModelAttribute("UM") UserModel userModel, Model model,
RedirectAttributes redirectAttributes) {
System.out.println(userModel.toString());
setModel(model);
return "login";
}
}
login.jspはSELECT以外の項目を削除しました。SELECTにmultipleを付けなくてもモデルが配列、リストであればmultipleになりました。
<%@page import="spring.test.UserModel"%>
<%@page import="spring.test.controller.LoginControler"%>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<html>
<head>
<title>ログイン</title>
</head>
<body>
<spring:url value="/login" var="url" htmlEscape="true" />
<form:form action="${url}" method="POST" modelAttribute="UM">
<form:select path="sel1" items="${ary}" itemLabel="value" itemValue="key" />
<hr />
<form:select path="sel2" >
<form:option value="op1">オプション</form:option>
<form:options items="${ary}" itemLabel="value" itemValue="key" />
</form:select>
<BR />
<input type="submit" value="テスト" />
<BR />
<BR />
</form:form>
</body>
</html>
実行イメージ

ページのトップへ戻る