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

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

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

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

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Thymeleaf

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

HTML

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

Spring Boot

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

Q&A

解決済

2回答

6262閲覧

Springとthymeleafを使ってHTML上にカレンダーを表示させたい

sibawajt

総合スコア9

Java

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

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Thymeleaf

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

HTML

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

Spring Boot

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

0グッド

0クリップ

投稿2018/07/26 00:44

プログラミング未経験の初心者です。また、こちらのサイトでの質問が初めてなので至らぬ点ばかりかと思いますが、
どうかお知恵をお貸しいただければ幸いです。

前提・実現したいこと

Springとthymeleafを使ってHTML上にカレンダーを表示させたい

該当のソースコード

java

1@Controller 2@RequestMapping(value = "topPage") 3public class TopPageController { 4 5 @Autowired 6 private ScheduleService scheduleService; 7 8 @Autowired 9 private User user; 10 11 @RequestMapping(value = "getPage", method = RequestMethod.GET) 12 public String getPage(LoginForm form, Model model) { 13 14 Calendar rightNow = Calendar.getInstance(); 15 int day = rightNow.get(Calendar.DATE); 16 int year = rightNow.get(Calendar.YEAR); 17 int month = rightNow.get(Calendar.MONTH); 18 19         /* 今月のはじまり */ 20 rightNow.set(year, month, 1); 21 int startWeek = rightNow.get(Calendar.DAY_OF_WEEK); 22 23         /* 先月分の日数 */ 24 rightNow.set(year, month, 0); 25 int beforeMonthlastDay = rightNow.get(Calendar.DATE); 26 27 /* 今月分の日数 */ 28 rightNow.set(year, month + 1, 0); 29 int thisMonthlastDay = rightNow.get(Calendar.DATE); 30 31 int[] calendarDay = new int[42]; /* 最大で7日×6週 */ 32 int count = 0; 33 34 for (int i = startWeek - 2; i >= 0; i--) { 35 calendarDay[count++] = beforeMonthlastDay - i; 36 } 37 38 for (int i = 1; i <= thisMonthlastDay; i++) { 39 calendarDay[count++] = i; 40 } 41 42 int nextMonthDay = 1; 43 while (count % 7 != 0) { 44 calendarDay[count++] = nextMonthDay++; 45 } 46 47 int weekCount = count / 7; 48 49 for (int i = 0; i < weekCount; i++) { 50 for (int j = i * 7; j < i * 7 + 7; j++) { 51 if (calendarDay[j] < 10) { 52 System.out.print(" " + calendarDay[j] + " "); 53 } else { 54 System.out.print(calendarDay[j] + " "); 55 56 } 57 } 58 System.out.println(); 59 } 60 61 62 return "mypage"; 63 }

HTML

1<!DOCTYPE html> 2<html xmlns:th="http://www.thymeleaf.org"> 3<head> 4 5<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 6<meta http-equiv="Content-Style-Type" content="text/css" /> 7<meta http-equiv="Content-Script-Type" content="text/javascript" /> 8<meta http-equiv="Pragma" content="no-cache" /> 9<meta http-equiv="Cache-Control" content="no-cache" /> 10<meta http-equiv="Expires" content="0" /> 11 12<meta http-equiv="imagetoolbar" content="no" /> 13<title>スケジュール管理</title> 14 15</head> 16 17<body> 18 <h3>スケジュール管理</h3> 19<table> 20 <tr> 21 <td class="week">日</td> 22 <td class="week">月</td> 23 <td class="week">火</td> 24 <td class="week">水</td> 25 <td class="week">木</td> 26 <td class="week">金</td> 27 <td class="week">土</td> 28 </tr> 29!この部分にカレンダーを表示させたいです。! 30</table> 31</body> 32</html>

calendarDayに格納した値を、thymeleafのth:each処理で出すことができればと思うのですが、配列に格納している値を横に7、縦に6表示させる方法が調べてもなかなか思い当りません…。なにかアドバイスやご指示などいただけますと幸いです。

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

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

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

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

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

sibawajt

2018/07/26 01:11

すみません、諸事情でアカウントを作り直してしまいました。model.addAttribute("calendarDay", calendarDay)で送るのは安直すぎでしょうか…。こちらの方法ですと格納したデータは取得して遅れるのですが、縦並び1行の状態で出力されてしまいました。
退会済みユーザー

退会済みユーザー

2018/07/26 01:24

アカウントの作り直しの必要性はないです。
yukihisa

2018/07/26 01:24

できれば、その縦並びまでできるソースが欲しいです。そこからあと少し手を加えれば実現できますよ。回答にModel側のヒントを書いておきますね。
sibawajt

2018/07/26 01:27

yukihisa様 ありがとうございます!いただいたヒントを参考にやってみます!
guest

回答2

0

ベストアンサー

カレンダーを作りたいのなら、カレンダーの形通りにModelに格納させてあげる必要があります。

int[] calendarDay = new int[42]; /* 最大で7日×6週 */

ここまでできているようなので、
weekクラス(mon,tue,...,sunで一週間のデータを格納する)を作って

List<week> calendarDay = new List<week>; /* 一週間分データのリスト */

として一週間ごとにリストに格納していけばうまくいくと思いますよ。

追記

もう少し詳しく。
クラス

Java

1public class week { 2 3 private String[] weekday = new String[6]; 4 5 public String getWeekday(int index) { 6 return getWeekday[index]; 7 } 8 9 public void setWeekday(int index, String weekday) { 10 this.weekday[index] = weekday; 11 } 12} 13

ソース

Java

1 /* 今月のはじまり(曜日) */ 2 rightNow.set(year, month, 1); 3 int startWeek = rightNow.get(Calendar.DAY_OF_WEEK); 4 /* 今月末日 */ 5 rightNow.set(year, month + 1, 0); 6 int thisMonthlastDay = rightNow.get(Calendar.DATE); 7 int lastWeek = rightNow.get(Calendar.DAY_OF_WEEK); 8 9 /* 先月末日 */ 10 rightNow.set(year, month, 0); 11 int beforeMonthlastDay = rightNow.get(Calendar.DATE); 12 13 List<week> calendarDay = new List<week>(); /* 一週間分データのリスト */ 14 int count = 0; 15 16 week week = new week(); 17 String strWeekday = new String(); 18 // 日曜日始まりでなければ前月の日付を格納する。 19 if (startWeek != 1) { 20 for (int i = startWeek - 2; i >= 0; i--) { 21 strWeekday = String.valueOf(beforeMonthlastDay - i); + " " 22 week.setWeekday(count, strWeekday) 23 count++; 24 } 25 } 26 27 // 当月分の日付を格納する。 28 for (int i = 1; i <= thisMonthlastDay; i++) { 29 if (calendarDay[j] < 10) { 30 strWeekday = " " + String.valueOf(beforeMonthlastDay - i); + " " 31 } else { 32 strWeekday = String.valueOf(beforeMonthlastDay - i); + " " 33 } 34 week.setWeekday(count, strWeekday) 35 if (count == 6) { 36 calendarDay.add(week); 37 count = 0; 38 } else { 39 count++; 40 } 41 } 42 43 // 翌月分の日付を格納する。 44 if (lastWeek != 7) { 45 for (int i = lastWeek; i < 7; i++) { 46 strWeekday = " " + String.valueOf(beforeMonthlastDay - i); + " " 47 week.setWeekday(count, strWeekday) 48 count++; 49 } 50 51 } 52 53 calendarDay.add(week); 54 model.addAttribute("calendarDay", calendarDay); 55 56

これでmodelに格納できると思います。

投稿2018/07/26 01:25

編集2018/07/26 05:24
yukihisa

総合スコア672

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

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

退会済みユーザー

退会済みユーザー

2018/07/26 03:21

thymeleaf のかきかたがわからないんでは
yukihisa

2018/07/26 03:51

>asahina1979 様 僕もそう思います。 ただ、プログラミング未経験の初心者ということで、今のままの配列で渡してthymeleaf側で整形するのはもっと慣れてからじゃないと理解しづらく、受け渡すデータをどうするかについて考えることが先かな、と思いひとまずJava側の処理について助言しました。 th:eachでやるということはイメージできているようなので、その部分についてはまず自分でやってみてほしいと思った次第です。
sibawajt

2018/07/26 04:33

yukihisa様 先ほどはヒントをいただきありがとうございました。恥ずかしながら、未だにリストへの格納が出来ていない状態にあります…。おそらく当方の理解が間違っているかと思いますので、ご確認いただくことは可能でしょうか…? Weekクラス→月曜日~日曜日までの7日分を格納するためのクラス List<Week>→Weekクラスで格納した7日間1セットを6週間分格納する Weekクラスでsetterとgetterを作成し、Listで曜日と日付をセットし、modelに値を格納する このような流れで処理を記述すればよいかと思っておりましたが、何か違うところがあればご指摘いただけますと幸いです。
yukihisa

2018/07/26 04:48

>sibarajt 様 よく見たら日曜日始まりですね、すいません。。。 weekクラスに格納するので、 weekで日付を格納し、7日分溜まったらリストに追加する・・・を繰り返す形ですね。 基本的には、 List<week>を作成する weekクラスを作成する 日曜日始まりでない ⇒ 前月末までをweekに格納する 月末までweekに格納 ⇒ 7日分溜まる毎にリストに追加する 月末が土曜日でない ⇒ 翌月第一週の土曜日までweekに格納してリストに追加する 完成したリストをmodelに格納する という流れかな、と思います。
sibawajt

2018/07/26 05:05

yukihisa様 とんでもございません、お気になさらないでいただければと思います。 また、詳しい処理の流れについてご教示いただきありがとうございます。 非常に恐縮ではございますがもう一点ほどお尋ねしたいことがございます。 最初に作成するList<Week>のことについてなのですが、こちらは先ほどご教示いただいたList<week> calendarDay = new List<week>;のソースコードを用いる形で作成すればよろしかったと思うのですが、そのままControllerに記述したところ「型 List<Week> のインスタンスを生成できません」といった旨のエラーが出てしまうため、こちらは元のものから記述を少し変える必要があるのでしょうか? 重ね重ねで大変申し訳ございませんが、ご教示いただけますと幸いです。よろしくお願いいたします。
yukihisa

2018/07/26 05:31

「インスタンスを作成できません」のエラーは抽象クラスを生成しようとしたときに出るエラーです。 abstract が付いていませんか?
sibawajt

2018/07/26 05:55

ご返信ならびにご回答の追記ありがとうございました。abstractはつけていませんので何か別の理由があるみたいです…。 上記に追記いただいたものと合わせて、自身でももう一度よく見直してみます。
退会済みユーザー

退会済みユーザー

2018/07/26 06:41

※ interface は通常の方法では new できません。
guest

0

ちょっとイメージだけ、動作確認なしなのでご自分で調整してください。

<tr th:each="i : ${#numbers.sequence(1, 6)}"> <td th:each="j : ${#numbers.sequence(1, 7)}">*</td> <td th:remove="tag">*</td> <td th:remove="tag">*</td> <td th:remove="tag">*</td> <td th:remove="tag">*</td> <td th:remove="tag">*</td> <td th:remove="tag">*</td> </tr> <tr th:remove="tag"> <td>*</td> <td>*</td> <td>*</td> <td>*</td> <td>*</td> <td>*</td> <td>*</td> </tr> :

投稿2018/07/26 03:32

編集2018/07/26 03:33
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/07/26 04:35 編集

[i * 7 + j] or [i][j]
sibawajt

2018/07/26 04:40

asahina1979様 ご回答ありがとうございます。まだHTMLの処理までたどり着けていないのですが、カレンダーを表示させるためのイメージが、こちらを拝見してつきやすくなりました。本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問