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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Thymeleaf

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Spring Boot

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

Q&A

解決済

2回答

2640閲覧

thymeleafのループについて

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Thymeleaf

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Spring Boot

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

0グッド

1クリップ

投稿2020/06/05 05:21

前提・実現したいこと

SpringBootとThymeleafを導入し、勤怠表を作成しています。具体的には、勤務時間を入力して更新することでDBへ登録(更新)し、ページを再表示した際にはDBの値を初期値として出力しておくものです。。その際に、
各tr,td,selectにyyyyMMdd形式のidと、平日、土曜、日曜でそれぞれclassを付与したい。
かつDBから取得してきたデータを初期値として出力しておきたい。
現在Logicのクラスに直接HTMLタグを文字列として使用し、各td要素を作成してリスト化したのち、trに対してそのtdのリストをth:eachで回して表示しています。エラーではないのですが、このような場合、HTMLタグを文字列として記述してしまうようなやり方はどうなのでしょうか。
HTMLに記述しようと思ったのですが、うまいやり方が分からず迷走しています。

Logic

1 2public class AttendanceLogic { 3 4 public Model attendancePage(Attendance attendance, Model model) { 5 model.addObject("attendances", attendance); 6 7 // DBに登録済の勤務表 8 List<String> workStartList = new ArrayList<String>(Arrays.asList(attendance.getWork_start().split(","))); 9 List<String> workEndList = new ArrayList<String>(Arrays.asList(attendance.getWork_end().split(","))); 10 List<String> workBreakList = new ArrayList<String>(Arrays.asList(attendance.getBreak_time().split(","))); 11 12 LocalDate now = LocalDate.now(); 13 // 当月を0埋め表記 14 int currentMonthValue = now.getMonthValue(); 15 String currentMonthZero = "0" + String.valueOf(currentMonthValue); 16 String currentMonthStr = currentMonthZero.substring(currentMonthZero.length() - 2); 17 // うるう年等の判定のため、yearを取得 18 int currentYear = now.getYear(); 19 // 当月末 20 int endOfTheMonth = LocalDate.of(currentYear, currentMonthValue, 1).lengthOfMonth(); 21 22 // 当月の各データ一覧(td)を代入するリスト 23 List<String> fullDayList = new ArrayList<String>(); 24 25 // 1日~月末までループする 26 for (int i = 1; i <= endOfTheMonth; i++) { 27 // 日にちを0埋め表記 28 String dateZero = "0" + String.valueOf(i); 29 String dateStr = dateZero.substring(dateZero.length() - 2); 30 String oneDayStr = currentYear + "-" + currentMonthStr + "-" + dateStr; 31 // 当月/i日にフォーマット 32 LocalDate oneDay = LocalDate.parse(oneDayStr); 33 // oneDayの曜日を追加 34 DateTimeFormatter formatterWeek = DateTimeFormatter.ofPattern("(EEE)"); 35 String dayOfWeek = formatterWeek.format(oneDay); 36 String fullDay = currentMonthValue + "/" + i + "日" + dayOfWeek; 37 // fullDayのid属性に付与する値(yyyyMMdd) 38 DateTimeFormatter formatterId = DateTimeFormatter.ofPattern("yyyyMMdd"); 39 String oneDayId = formatterId.format(oneDay); 40 // 勤務区分のセレクトボタン 41 String workCategorySelect = "<select id='" + oneDayId + " work-category-select' class='" + oneDayId + " work-category-select'>" + 42 "<option value='出勤'>出勤</option>" + 43 "<option value='休み'>休み</option>" + 44 "<option value='有給休暇'>有給休暇</option>" + 45 </select>"; 46 47 // tdのテンプレート 48 String workDetailsHtml = "<td id=work-category" + i + " class=work-category" + i + ">" + workCategorySelect + "</td>" + 49 "<td id=work-start" + i + " class=work-start" + i + "><input type=time name=work_start value=" + workStartList.get(i - 1) + " id=work-start-input" + i + " class=work-start></td>" + 50 "<td id=work-end" + i + " class=work-end" + i + "><input type=time name=work_end value=" + workEndList.get(i - 1) + " id=work-end-input" + i + " class=work-end></td>" + 51 "<td id=break-time" + i + " class=break-time" + i + "><input type=text name=break_time value=" + workBreakList.get(i - 1) + " id=break-time-input" + i + " class=break-time></td>" + 52 "<td id=actual-work" + i + " class=actual-work" + i + ">" + result + "</td>" + 53 "<td id=remarks" + i + " class=remarks" + i + "></td>"; 54 // 土日と平日にそれぞれidを付与 55 if (dayOfWeek.equals("(土)")) { 56 String fullDayHtml = "<td id='" + oneDayId + " saturday'" + " class='" + oneDayId + " saturday'>" + fullDay + "</td>" + workDetailsHtml; 57 fullDayList.add(fullDayHtml); 58 } else if (dayOfWeek.equals("(日)")) { 59 String fullDayHtml = "<td id='" + oneDayId + " sunday'" + " class='" + oneDayId + " sunday'>" + fullDay + "</td>" + workDetailsHtml; 60 } else { 61 String fullDayHtml = "<td id='" + oneDayId + " weekday'" + " class='" + oneDayId + " weekday'>" + fullDay + "</td>" + workDetailsHtml; 62 } 63 } 64 model.addObject("fullDayList", fullDayList); 65 66 return model; 67 } 68} 69 70

HTML

1 <form th:action="@{/attendance}" th:method="post" th:object="${attendanceForm}"> 2 <input type="hidden" name="user_id" th:value="${loginUser.id}" /> 3 <table id="time-table" class="time-table" border="1"> 4 <thead> 5 <tr id="category" class="category"> 6 <th id="date" class="date">日付</th> 7 <th id="work-division" class="work-division">出勤区分</th> 8 <th id="work-start" class="work-start">出勤時間</th> 9 <th id="work-end" class="work-end">退勤時間</th> 10 <th id="break-time" class="break-time">休憩時間(分)</th> 11 <th id="actual-time" class="actual-time">実働時間</th> 12 <th id="remarks" class="remarks">備考</th> 13 </tr> 14 </thead> 15 <tbody> 16 <tr th:each="fullDay : ${fullDayList}" th:utext="${fullDay}"> 17 </tr> 18 </tbody> 19 </table> 20 <input type="submit" value="更新" /> 21 </form>

試したこと

省略しているところもありますが、概ね上記のような状態です。ちなみにこの状態だとtrにはidは付いてないのですが、trタグをつけた状態でHTMLのtbodyでeach文を回すと、tbodyも一緒に増えてしまうためこのようになっています。(本当はtrにもidやclassを条件で付与したい)
よろしくお願いします。

補足情報(FW/ツールのバージョンなど)

SpringBoot
Thymeleaf

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/06/05 07:51

とりあえず直すのはコンパイルエラーですね
guest

回答2

0

ベストアンサー

numbers.sequenceで解決しました。

投稿2020/06/12 07:41

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

HTMLタグを文字列として記述してしまうようなやり方はどうなのでしょうか。

HTMLはそもそも文字列の集合体です。

というのはさておき、Thymeleafのようなテンプレートエンジンを導入するメリットは「ロジックとビューの分離」にありますので、Javaのコードにビューに相当する記述を書くのは好ましくないと思います。
あっちこっちにビューが書かれるので、メンテナンスもしにくくなるはずです。

必要な情報を渡して、HTMLの描画はThymeleafに任せた方が良いです。

フォーマット等はJava側でしてしまった方が良いかもしれませんね。

投稿2020/06/05 06:07

m.ts10806

総合スコア80875

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

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

退会済みユーザー

退会済みユーザー

2020/06/05 07:12 編集

回答ありがとうございます。 確かにメンテナンスはしにくいですよね..... ただ、上記のような条件で出力を行いたいときにHTML側でどのように記述すればよいかが分からずこのようになりました。 th:eachを複数回したりjavascript等で後からclassを付与したりしたほうがよいのか。どのみち煩雑になってしまうのはないかと思ったのですが。
m.ts10806

2020/06/05 07:13

んーと、それだけですか? アドバイスを得た上でどうなったかとかどうするつもりとかフィードバックください。お礼だけが欲しい回答者っていないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問