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でまわして表示します。これは覚えておくとよいと思います。
![高橋](https://i0.wp.com/confrage.jp/wp-content/uploads/2018/08/aaaaaaaaa-1.jpg?resize=100%2C100&ssl=1)
KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント