前提・実現したいこと
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
回答2件
あなたの回答
tips
プレビュー