SpringMVCでチェックボックスをデータ送信(POST)する

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でまわして表示します。これは覚えておくとよいと思います。

コメント

タイトルとURLをコピーしました