質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Thymeleaf

Thymeleaf(タイムリーフ)とは、Java用のテンプレートエンジンで、特定のフレームワークに依存せず使用することが可能です。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

2回答

13360閲覧

thymeleaf Spring チェックボックスのチェック状態を保持する方法

退会済みユーザー

退会済みユーザー

総合スコア0

Thymeleaf

Thymeleaf(タイムリーフ)とは、Java用のテンプレートエンジンで、特定のフレームワークに依存せず使用することが可能です。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

1グッド

0クリップ

投稿2020/06/27 14:54

編集2020/06/27 14:57

イメージ説明
チェックをつけて検索ボタンを押下すると検索結果は同じですが、チェックが外れた状態になってしまいます。
チェック状態を保持する方法を教えてください。
FORMではStringのListにしていますがBooleanじゃないといけないとかわかっていません。

FORM

1@Data 2public class Form { 3 private int id; 4 private Date datefrom; 5 private Date dateto; 6 private String koumoku; 7 private int kingaku; 8 private String syousai; 9 private String bikou; 10 //チェックボックスの情報 11 private List<String> deleteList;

Controllerクラスでチェックボックスの値はdeleteListに格納されているのは確認済みですが、HTMLのチェックボックスの連携の仕方がわからず未実装です。

HTML

1<table> 2 <tr th:each="obj:${resultList}" th:object="${obj}"> 3 <td style="display: none;"><input type="hidden" 4 th:text="*{id}"></td> 5 <td><input type="button" value="更新"></td> 6 <td th:text="*{date}"></td> 7 <td th:text="*{koumoku}"></td> 8 <td th:text="*{kingaku}"></td> 9 <td th:text="*{syousai}"></td> 10 <td th:text="*{bikou}"></td> 11           <!-- チェックボックス--> 12 <td><input type="checkbox" th:value="*{id}" name="deleteList"></td> 13 </tr> 14 </table>

チェックボックスにはidをvalueとしてチェックをつけたものをidを元に削除する機能を作る予定です。

yyyyssss👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

「どういうときにチェックが入るか」が今一つわかりませんが
th:checked="true"でチェックになり、falseだと外れます。
あとは三項演算子で条件書いて、true/falseを切り分けてください。

投稿2020/06/27 20:52

m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/06/28 01:45

回答ありがとうございます。 Controllerクラス for(int i=0; i<form.getDeleteList().size();i++) { model.addAttribute("deleteList",form.getDeleteList().get(i)); } HTML <input type="checkbox" th:value="*{id}" name="deleteList" th:checked="${deleteList}==*{id} ? true : false"> にして複数チェックをつけるとチェックをつけた一番最後に出力されたレコードのみチェック状態がほじされてしまいます。 何か対策はありますか。
m.ts10806

2020/06/28 02:42

deleteListという同じキーで上書きしてるからです。各行にそったキーをつけてください。
退会済みユーザー

退会済みユーザー

2020/06/28 02:51

申し訳ございません。 お手数ですがもう少し詳細に教えていただけないでしょうか。
m.ts10806

2020/06/28 03:06 編集

for(int i=0; i<form.getDeleteList().size();i++) { model.addAttribute("deleteList",form.getDeleteList().get(i)); } 上記、modelにaddするときのキーが同じものが設定されています。 HashMapとかと同じで、同じキーが指定されれば、後のもので上書きされます。 つまり、「個々の値をそれぞれ入れたい」なら一意なキーを指定する必要があるわけです。 それは決めてください。IDでつけるのが良いでしょうけど。 ただ、ListをFormに持つのが本当にいいのかとかその辺から考えた方が良さそうには思います。 Form自体がListならdeleteflgをbooleanで持つとかの方が簡単でしょうし、データの持ち方がちょっと画面出力やりづらい内容になってると思います。 thymeleafでもcontainskeyあるみたいなので、できないことはないでしょうけど。 https://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf_ja.html#appendix-a-expression-basic-objects
guest

0

Formの

java

1private List<String> deleteList;

はListにする必要ありますか?
単体での削除であれば、private int deleteId等にして、htmlを

html

1<td><input type="checkbox" th:value="*{id}" th:field="*{deleteId}"></td>

でボタンの実装は行けないですかね?

そもそもですが、deleteIdをFormから切り離して、コントローラー側の@RequestParamや@PathVariable等で値を取得して、それをキーにして、削除した方が良い気がします。
Spring MVC コントローラの引数

更新(update)と削除(delete)ボタンにname属性を付与し、コントローラー側のparamsで分岐させることも出来ます。
@PostMapping(value = "/{id}/edit", params = "delete")
@PostMapping(value = "/{id}/edit", params = "update")

投稿2020/06/27 15:39

tattakahiiii

総合スコア27

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/06/27 15:57

ご回答ありがとうございます。 private List<String> deleteList;にしている理由として、 for(int i=0; i<form.getDeleteList().size();i++) { repository.deleteById(form.getDeleteList().get(i)) のように単体ではなくチェックがついたもの全てを一回の処理で削除するためです。 私の質問の仕方が悪くてすいませんが、今回は削除の方法ではなくチェックボックスのチェック状態の保持の仕方をご教授いただければ幸いです。
tattakahiiii

2020/06/27 17:01

なるほど。 では、チェック状態にする方法ですが、コントローラー側にHashMapを作成し、modelに登録。 その値をth:valueに渡してあげて、HashMapのキーとFormのフィールドの値が同じであれば、チェック状態になると思います。 下記のようなイメージです。 <input type="checkbox" th:value="${Map.key}" th:field="*{deleteId}"/>
退会済みユーザー

退会済みユーザー

2020/06/28 00:49

ありがとうございます。 私の勉強不足でHashMapとhtml側のth:value="${Map.key}との関連のイメージがつきません。 参考になるサイトなどはご存しないでしょうか。
退会済みユーザー

退会済みユーザー

2020/06/28 05:02

ControllerにHashMapを作ってみました Map<String, String> selectMap = new HashMap<String, String>(); for(int i=0; i<form.getDeleteList().size();i++) { selectMap.put(form.getDeleteList().get(i), ""); model.addAttribute("selectMap",selectMap); } HTML <tr th:each="obj:${resultList}" th:object="${obj}"> <td style="display: none;"><input type="hidden" th:text="*{id}"></td> <td><input type="button" value="更新"></td> <td th:text="*{date}"></td> <td th:text="*{koumoku}"></td> <td th:text="*{kingaku}"></td> <td th:text="*{syousai}"></td> <td><input type="checkbox" th:value="*{id}" th:field="*{selectMap}" ></td> </tr> Formクラスには String配列のselectMapを作りました。 <input type="checkbox" th:value="${Map.key}" th:field="*{deleteId}"/> ↑先ほど教えていただいたこの内容ですが th:field="*{selectMap}"のところでgetのリクエスト時にエラーが起きてしまいます。 HashMapのキーとFormのフィールドの値が同じの場合チェックを保持する方法についてもう少し教えていただけないでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問