Spring MVCの form:radiobutton について
Spring MVC の form:radiobutton タグについて、
未選択状態をデフォルトにする方法を教えていただきたいです。
下記のコードでは、デフォルトで選択された状態となります。
該当のソースコード
<%@ page session = "false" language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.time.LocalDate" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <!DOCTYPE html> <html> <head> <link rel="stylesheet" type="text/css" href="/sales/resources/common.css" /> <title>明細追加画面</title> </head> <body> <form:form modelAttribute="salesForm" action="/sales/system"> <div class="header"> <span class="titleName">オンラインショップ</span> <div class="date"><%= LocalDate.now() %></div> </div> <div class="main"> <span class="name">商品:</span> <select name="name"> <c:forEach items="${itemList}" var="item" varStatus="status"> <option value="${item.name}">${item.name}</option> </c:forEach> </select> <br> <span class="quantity">点数:</span> <form:input path="quantity" size="5" value="1" /> <div class=""> <input type="submit" name="add" value="明細追加"> </div> </div> </form:form> <form:form modelAttribute="salesForm" action="/sales/system"> <div class="main2"> <br> <br> <div class="message"> <c:out value="${message}" /> </div> <br> <br> 売上明細 <br> <table> <tr> <th>削除</th><th>商品ID</th><th>商品名</th><th>単価</th><th>点数</th><th>小計</th> </tr> <c:forEach items="${newList}" var="newList" varStatus="status"> <tr> <th> <form:radiobutton path="name" label="" value="${newList.name}"/> </th> <th>${newList.id}</th><th>${newList.name}</th><th>${newList.price}</th> <th>${newList.quantity}</th><th>${newList.subtotal}</th> </tr> </c:forEach> </table> 合計:<fmt:formatNumber value="${total}" groupingUsed="true" />円 </div> <div class="footer"> <input type="submit" name="delete" value="削除"/> <input type="submit" name="fix" value="確定"> </div> </form:form> </body> </html>
出力したHTML
radiobuttonってチェックボックスではなくて、複数の中から1つを選ぶ要素ですよ。
path="name"のradiobuttonが最低あともう一つ並んでいないと意味がないと思います。
コメントありがとうございます!
実際には、 forEach タグで繰り返し処理をしています。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
<table>
<tr>
<th>削除</th><th>商品ID</th><th>商品名</th><th>単価</th><th>点数</th><th>小計</th>
</tr>
<c:forEach items="${newList}" var="newList" varStatus="status">
<tr>
<th>
<form:radiobutton path="name" label="" value="${newList.name}" checked="false"/>
</th>
<th>${newList.id}</th><th>${newList.name}</th><th>${newList.price}</th>
<th>${newList.quantity}</th><th>${newList.subtotal}</th>
</tr>
</c:forEach>
</table>
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
checked属性を外したらどうなりますか?
checked属性を外しても、falseとした場合と同じ挙動になります。
ラジオボタンがONになった状態になります。
生成されたHTMLはどうなっていますか?
taglibの中見ないと分からないかも。。。
出力したHTMLを上記質問内容に追加いたしました。
taglib の中身とは。。。?すみません、初心者なもので。。。
いや、画像じゃなくて、checked属性がどう生成されているか見たかったんですが。。。
あと、radiobutton要素からchecked属性は外してください。
taglibとはJSPからサーブレットを生成する際に、名前空間指定された特殊な要素を処理するときに使用されているライブラリの呼称です。
taglibの中身とは↓のようなのです。
https://github.com/spring-projects/spring-framework/blob/master/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/form/RadioButtonTag.java
教えてくださりありがとうございます!
JSPのソースコード全体を上記に載せました。
taglib の中身とは、どこから確認できるのでしょうか。。。
ええーっと…今ので分からないのだと説明難しいです。
JSP→Servletという処理は把握していらっしゃいますか?JSPはHTMLを拡張したような構文のファイルです。JSPはビルドされた際にサーブレット(Javaのクラスです)に変換されて、それをコンパイルしてクラスファイルになります。これがbeanの情報を元にHTMLに変換してるのです。よくあるテンプレート処理ですね。JSPはHTMLのタグを拡張した文法なので、JSPから変換されたサーブレットはその専門的なタグを処理するときにtaglibを呼び出すわけです。taglibはJavaのライブラリなので、ソースコードもあって、上に書いたリンクのようなソースコードがform:radiobuttonを扱っている部分ということになります。このソースコードがtaglibの中身です。
本来は実際に使っているライブラリのソースコードを見ないといけない(バージョンが違ってたり、中のコードを編集したものを使っている可能性があるので)のですが、大まかな動きは同じということで、上のリンクのコードを見てました。
ちなみに私がtaglibのソースコードまで見てるのは、私がSpringMVCを使ってないため、ソースコードや仕様からしか見ることができなかったからです。仕様はそこまで詳しくなかったので、コードを見ていたというわけです。実際に動いているコードがあるなら、いろいろ試す方が先ですよ。
なんとなくですが、newList.nameのnameという名前がまずい気がします。そのために、生成された全てのinputでcheckedが付いちゃってるんじゃないかと。。。
あと、HTML(ソース)早く貼ってください。
それから、path="name"をpath="hoge"とかで試せたら試してみてくださいね。
結局自分で一度作ってみましたが、私が作ったものだと、普通に制御出来たので、現象が違います。
最終的にはSalesFormのnameプロパティに商品名を入れることで、ラジオボタンの制御ができることを確認しました。空にしたり、存在しない商品名ならチェックがどこにも付きません。
昼間疑ってたのはコードの読み違いだったのか、合わせても再現はしませんでした。
なお、多分name属性に指定すべきは商品IDです。また、ループに使用している変数名がbeanに指定される変数名と被っていたのも良くありません。
以上で、私の方からの報告は終わりにさせて頂きます。
私の理解と作業が追い付かず、対応が遅くなりすみませんでした。
また親身に考えてくださり大変感謝しております。
>多分name属性に指定すべきは商品IDです。
→ご指摘の通りに修正したら、本件解決できました。
本当にありがとうございました。。。!!
あなたの回答
tips
プレビュー