SpringMVCでチェックボックスをデータ送信(POST)する
SpringMVCで複数のチェックボックスをPOSTするにはform:checkboxesを使用します。
単一の場合はform:checkboxを使用しますがここでは説明しません。
まずチェックボックスを表示するようのアクションフォームです。
package jp.co.confrage;
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CheckForm implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private String val;
}
次にデータ送信する際に使用するアクションフォームです。チェックボックスが複数あるためString配列にしています。
package jp.co.confrage;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CheckboxesForm {
private String[] chkName;
}
初期表示時のコントローラです。
package jp.co.confrage;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
@RequestMapping("check")
public class CheckController {
private static final Logger logger = LoggerFactory.getLogger(CheckController.class);
@RequestMapping(value = "home", method = RequestMethod.GET)
public String home(Model model) {// メソッド名はなんでも良い
logger.info("Welcome Sample Page.");
List<CheckForm> fluits = new ArrayList<>();
fluits.add(new CheckForm("りんご","1"));
fluits.add(new CheckForm("みかん","2"));
fluits.add(new CheckForm("ぶどう","3"));
CheckboxesForm cf = new CheckboxesForm();
// 初期値の設定
cf.setChkName(new String[] { "" });
model.addAttribute("checkboxesModel", cf);
model.addAttribute("fluits", fluits);
return "check";// ビューリゾルバがcheck.jspを探す
}
}
初期表示時のJSPです。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>Home</title>
</head>
<body>
<h1>
Hello world!
</h1>
<P> Welcome Sample Page. </P>
<spring:url value="/check/post" var="act" />
<form:form action="${act}" method="post" modelAttribute="checkboxesModel">
<form:label path="chkName">好きな食べ物は?</form:label>
<form:checkboxes path="chkName" items="${fluits}" itemLabel="name" itemValue="val" />
<input type="submit" value="送信">
</form:form>
</body>
</html>
modelAttributeにcheckboxesModelにしています。これは複数のチェックボックスを返すからです。
<form:checkboxes>には属性が結構あるので以下で説明します。
| items | チェックボックスを表示するためのList |
| itemLabel | チェックボックスのラベル(アクションフォームから取得) |
| itemValue | チェックボックスの値(アクションフォームから取得) |
次に送信ボタン押下時のコントローラです。
package jp.co.confrage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
@RequestMapping("check")
public class CheckPostController {
private static final Logger logger = LoggerFactory.getLogger(CheckPostController.class);
@RequestMapping(value="post", method=RequestMethod.POST)
public String post(@RequestParam(required = false) String[] chkName,Model model) {
logger.info("Post : " + chkName.length);
model.addAttribute("postData", chkName);
return "checkPost";
}
}
String配列の変数名はアクションフォームと合わせる必要があります。
その配列をそのままmodelにaddしています。
次に送信後の表示JSPです。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>Home</title>
</head>
<body>
<h1>
Hello world!
</h1>
<P>
<c:forEach var="t" items="${postData}">
<c:out value="${t}"></c:out>
</c:forEach>
</P>
</body>
</html>
チェックボックスの表示はforEachでまわして表示します。これは覚えておくとよいと思います。

KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES20xx),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^


コメント