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

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

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

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Java

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

Q&A

解決済

2回答

2092閲覧

PostgreSQLからのデータ出力がうまくいかない

kumakura

総合スコア8

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Java

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

0グッド

0クリップ

投稿2020/04/01 08:19

前提・実現したいこと

勉強を始めたばかりの初心者です。
Java(jsp、サーブレット)にて`スケジュール管理のシステムを作成しています。

データベース(PostgreSQL)へ登録済みの予定が各日付部分にデータベースから出力されるように作成しています。(現時点ではカレンダー上の初日のみ作成済み)

しかし前月・来月のボタンを押し、表示している月を変更すると表示されているデータベースからの出力が一切行われません。

前月・来月のボタンを押した際に表示されている日付自体は問題なく変わるので、データベースからの出力部分がうまくいっていないのだとは思いますが、根本的な原因がわからずハマってしまっています。

ご回答いただけると助かります、よろしくお願いします。

JSPページ

jsp

1<%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3<%@ page import="calendar.Top" %> 4<%@ page import="java.util.Calendar"%> 5<%@ page import="java.sql.ResultSet" %> 6<%@ page import="java.time.LocalDate" %> 7<%@ page import="java.time.LocalDateTime"%> 8<%@ page import="java.time.LocalTime" %> 9<%@ page import="java.time.format.DateTimeFormatter" %> 10<% 11Calendar calendar = Calendar.getInstance(); 12 13int year; 14int month; 15int day; 16 17//前月・来月に飛んだ場合 18String move = request.getParameter("move"); 19String syear = request.getParameter("year"); 20String smonth = request.getParameter("month"); 21 22if(move==null){ 23 24 //現時点の日付 25year = calendar.get(Calendar.YEAR); 26month = calendar.get(Calendar.MONTH)+1; 27day = calendar.get(Calendar.DATE); 28 29}else{ 30 31year = Integer.parseInt(syear); 32month = Integer.parseInt(smonth); 33day = 1; 34 35if(month==13) { 36 year += 1; 37 month = 1; 38}else if(month==0) { 39 year = year - 1; 40 month = 12; 41}else { 42 year = year; 43 month = month; 44} 45} 46 47//今月最初の曜日 48calendar.set(year,month-1,1); 49int startWeek = calendar.get(Calendar.DAY_OF_WEEK); 50 51//前月の日数 52calendar.set(year,month-1,0); 53int beforedaycount = calendar.get(Calendar.DATE); 54 55//今月の日数・今月最後の曜日 56calendar.set(year,month,0); 57int daycount = calendar.get(Calendar.DATE); 58int lastWeek = calendar.get(Calendar.DAY_OF_WEEK); 59 60//日付用の配列作成 61int [] cl = new int[42]; 62int count = 0; 63 64//先月の日数を格納 65for (int i = startWeek-2 ; i >= 0 ; i--){ 66 cl[count++] = beforedaycount - i; 67 } 68 69//今月の日数を格納 70for(int i = 0;i<=daycount-1;i++) { 71 cl[count++] = 1+i; 72} 73 74//来月の日数を格納 75for(int i=0;i<=7-lastWeek;i++) { 76 cl[count++] = 1+i; 77} 78 79//何週分を格納したか確認 80int weekCount = count / 7; 81 82//データベースへ接続 83Top db = new Top(); 84db.open(); 85 86//データベース出力用 87LocalDate daydate; 88java.sql.Date sqlday; 89ResultSet rs; 90 91%> 92<!DOCTYPE html> 93<html> 94<head> 95<meta charset="UTF-8"> 96<link rel="stylesheet" href="calender.css"> 97<title>calender</title> 98</head> 99<body> 100<main> 101 <h1> 102 <% out.println(year+"年"+month+"月"); %> 103 <% int yearnow=year; %> 104 <% int monthnow=month; %> 105 </h1> 106 <a href="new.jsp">NEW</a> 107 <div class="calender"> 108 <div class="weeks"> 109 <div class="week sunday"> 110 <b>日</b> 111 </div> 112 <div class="week"> 113 <b>月</b> 114 </div> 115 <div class="week"> 116 <b>火</b> 117 </div> 118 <div class="week"> 119 <b>水</b> 120 </div> 121 <div class="week"> 122 <b>木</b> 123 </div> 124 <div class="week"> 125 <b>金</b> 126 </div> 127 <div class="week saturday"> 128 <b>土</b> 129 </div> 130 </div> 131 <div class="days"> 132 133    //カレンダー上の初日 134 <div class="day sunday"> 135 <% int cday = cl[0]; %> 136 <p> 137 <% out.println(cday); %> 138 </p> 139 <div class="apo"> 140 <% 141 //年月日の算出 142 year = db.prevyear(year,month,cday); 143 month = db.prevmonth(year,month,cday); 144 //年月日の変換、データ参照 145 rs = db.getResultSet("select * from calendar where day='"+db.sql(year, month, cday)+"'"); 146 while (rs.next()){ 147 //SQL時間データをLocalへ変換 148 java.sql.Time starttimes = rs.getTime("starttime"); 149 java.sql.Time lasttimes = rs.getTime("lasttime"); 150 //結果出力部分 151 out.print(db.starttime(year,month,day,starttimes)); 152 out.print(db.timewhile(year,month,day,starttimes,lasttimes)); 153 out.print(db.lasttime(year,month,day,lasttimes)); 154 out.print(db.titlewhile(year,month,day,starttimes,lasttimes)); 155 out.println(rs.getString("title")); 156 out.println(""); 157 %> 158 <br> 159 <% 160 //year,monthを初期値へ戻す 161 month = monthnow; 162 year = yearnow; 163 }%> 164 </div> 165 </div> 166 167   //カレンダー上の2日目 168 <div class="day"> 169 <p> 170 <% out.println(cl[1]); %> 171 </p> 172 <div class="apo"> 173 </div> 174 </div> 175 176   -中略- 177 178 </div> 179 <% }else{ 180 System.out.print(""); 181 }%> 182 </div> 183 <a class="prev" href="calender.jsp?move=prev&year=<%= year %>&month=<%= monthnow-1 %>">前月</a> 184 <a class="next" href="calender.jsp?move=next&year=<%= year %>&month=<%= monthnow+1 %>">来月</a> 185 </main> 186</body> 187</html>

インポートしているオリジナルクラス

Java

1package calendar; 2 3import java.sql.Connection; 4import java.sql.DriverManager; 5import java.sql.ResultSet; 6import java.sql.Statement; 7import java.time.LocalDate; 8import java.time.LocalDateTime; 9import java.time.LocalTime; 10import java.time.format.DateTimeFormatter; 11 12public class Top { 13 14 private String url; 15 private String user; 16 private String password; 17 private Connection conn; 18 private Statement state; 19 private ResultSet rs; 20 21 public Top() { 22 url = "-省略-"; 23 user = "-省略-"; 24 password = "-省略-"; 25 } 26 27 //データベースへの接続する 28 public void open() throws Exception { 29 conn = DriverManager.getConnection(url, user, password); 30 state = conn.createStatement(); 31 } 32 33 //SQL 文を実行した結果の ResultSet を返す 34 public ResultSet getResultSet(String sql) throws Exception { 35 if ( state.execute(sql) ) { 36 return state.getResultSet(); 37 } 38 return null; 39 } 40 41 //データベースを閉じる 42 public void close() throws Exception { 43 if ( rs != null ) rs.close(); 44 if ( state != null ) state.close(); 45 if ( conn != null ) conn.close(); 46 } 47 48 //年の固定(前月分日付の場合) 49 public int prevyear (int year,int month,int day) { 50 if(day>20 && month==1){ 51 return year -= 1; 52 }else{ 53 return year; 54 } 55 } 56 57  //月の固定(前月分日付の場合) 58 public int prevmonth (int year,int month,int day) { 59 if(day>20 && month==1){ 60 return month = 12; 61 }else{ 62 return month -=1; 63 } 64 } 65 66  //年の固定(来月分日付の場合) 67 public int nextyear (int year,int month,int day) { 68 if(day>20 && month==12){ 69 return year += 1; 70 }else{ 71 return year; 72 } 73 } 74 75  //月の固定(来月分日付の場合) 76 public int nextmonth (int year,int month,int day) { 77 if(day>20 && month==12){ 78 return month = 1; 79 }else{ 80 return month +=1; 81 } 82 } 83 84  //予定開始時間の出力 85 public String starttime(int year,int month,int day,java.sql.Time starttimes) { 86 87 DateTimeFormatter dtformat1 = DateTimeFormatter.ofPattern("HH:mm"); 88 89 if(starttimes==null) { 90 return ""; 91 92 }else { 93 94 //SQL時間データをLocalへ変換 95 LocalTime starttimet = starttimes.toLocalTime(); 96 LocalDateTime starttimel = starttimet.atDate(LocalDate.of(year, month, day)); 97 98 //時間の表示方法指定 99 String stime = dtformat1.format(starttimel); 100 101 return stime; 102 } 103 } 104 105//予定開始時間と終了時間間の「~」の出力 106 public String timewhile(int year,int month,int day,java.sql.Time starttimes,java.sql.Time lasttimes) { 107 if(starttimes==null && lasttimes==null) { 108 return ""; 109 }else { 110 return "~"; 111 } 112 } 113 114  //予定終了時間の出力 115 public String lasttime(int year,int month,int day,java.sql.Time lasttimes) { 116 117 DateTimeFormatter dtformat1 = DateTimeFormatter.ofPattern("HH:mm"); 118 119 if(lasttimes==null) { 120 return ""; 121 }else { 122 123 //SQL時間データをLocalへ変換 124 125 LocalTime lasttimet = lasttimes.toLocalTime(); 126 LocalDateTime lasttime = lasttimet.atDate(LocalDate.of(year, month, day)); 127 128 //時間の表示方法指定 129 String ltime = dtformat1.format(lasttime); 130 131 return ltime; 132 } 133 } 134 135  //時間と予定名間の「:」の出力 136 public String titlewhile(int year,int month,int day,java.sql.Time starttimes,java.sql.Time lasttimes) { 137 if(starttimes==null && lasttimes==null) { 138 return ""; 139 }else { 140 return ":"; 141 } 142 } 143 144   //SQLから取り出したデータ型の変換 145 public java.sql.Date sql (int year,int month,int day){ 146 LocalDate daydate = LocalDate.of(year, month, day); 147 java.sql.Date sqlday = java.sql.Date.valueOf(daydate); 148 return sqlday; 149 } 150 151} 152 153 154

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/04/01 09:05

年と月と日って別個のデータだとハンドリングが面倒なので、日付・時刻を扱うクラスに任せた方がらくなんじゃないかな、javaがよくわからないけど。指定フォーマットの文字列として出力するメソッドも必ずあるでしょうし。
jimbe

2020/04/01 10:48

> -中略- もしや, 日毎の記述が一か月分並んでいるんですか...
jimbe

2020/04/01 11:22

コードに全角スペースが入り込んでいます. 省略は仕方ありませんが, こちらに張り付ける際に修正したものと思われます.
jimbe

2020/04/01 13:47

> 前月・来月のボタンを押した際に表示されている日付自体は問題なく変わるので、データベースからの出力部分がうまくいっていないのだとは思います 出力部分の SQL を表示して合っているかを確認するとか, 列名が合っているか確認する等をしてみては如何でしょうか.
guest

回答2

0

自己解決

年・月・日を完全に別データとして扱っていましたが、一つのデータとして扱える別クラスを元に各日付のインスタンスを作成した所うまくいきました。
ご回答ありがとうございました。

Java

1package calendar; 2 3import java.util.Calendar; 4 5public class Cl { 6 7 Calendar cl = Calendar.getInstance(); 8 9 int year; 10 int month; 11 int day; 12 13 //いつの年月日のカレンダーか固定 14 public Cl(int year,int month,int day) { 15 16 int years = year; 17 int months = month; 18 int days = day; 19 20 if(month==12) { 21 year += 1; 22 month = 0; 23 }else if(month==-1) { 24 year = year - 1; 25 month = 11; 26 }else { 27 years = year; 28 months = month; 29 days = day; 30 } 31 32 this.year = years; 33 this.month = months; 34 this.day = days; 35 36 cl.set(years,months,days); 37 38 } 39 40 //今月は何曜日から始まるか 41 //前月日付をいくつ表示する必要があるか 42 public int prevday() { 43 if(cl.get(Calendar.DAY_OF_WEEK)==1){ 44 return 0; 45 }else if(cl.get(Calendar.DAY_OF_WEEK)==2){ 46 return 1; 47 }else if(cl.get(Calendar.DAY_OF_WEEK)==3) { 48 return 2; 49 }else if(cl.get(Calendar.DAY_OF_WEEK)==4) { 50 return 3; 51 }else if(cl.get(Calendar.DAY_OF_WEEK)==5) { 52 return 4; 53 }else if(cl.get(Calendar.DAY_OF_WEEK)==6) { 54 return 5; 55 }else{ 56 return 6; 57 } 58 59 } 60 61 //今月の日数はいつまでか 62 public int nowday() { 63 int nowday = cl.getActualMaximum(Calendar.DAY_OF_MONTH); 64 return nowday; 65 } 66 67 //翌月の日数はいつまでか 68 public int nextday(int prevday,int nowday) { 69 int day = prevday+nowday; 70 if(day%7==0) { 71 return 0; 72 }else if((day+1)%7==0) { 73 return 1; 74 }else if((day+2)%7==0) { 75 return 2; 76 }else if((day+3)%7==0) { 77 return 3; 78 }else if((day+4)%7==0) { 79 return 4; 80 }else if((day+5)%7==0) { 81 return 5; 82 }else{ 83 return 6; 84 } 85 } 86 87 //カレンダー上の初日を決定 88 public void oneday(int prevday) { 89 cl.add(Calendar.DAY_OF_MONTH, -prevday); 90 } 91 92 //年を返す 93 public int year() { 94 return cl.get(Calendar.YEAR); 95 } 96 97 //月を返す 98 public int month() { 99 return cl.get(Calendar.MONTH); 100 } 101 102 //日を返す 103 public int day() { 104 return cl.get(Calendar.DATE); 105 } 106 107 //一日後の日付を返す 108 public int days() { 109 cl.add(Calendar.DAY_OF_MONTH, 1); 110 return cl.get(Calendar.DATE); 111 } 112 113} 114

投稿2020/04/02 07:33

kumakura

総合スコア8

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

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

jimbe

2020/04/02 08:22 編集

//一日後の日付を返す public int days() { cl.add(Calendar.DAY_OF_MONTH, 1); return cl.get(Calendar.DATE); } コメントと違い, 日を進めてしまっていますが大丈夫でしょうか. コンストラクタでの年月の補正個所も, 変数名が s が無かったりしています.
guest

0

回答にはならないのですが, 以下のコードをお試しになることを提案します.

String sy = "2020"; //任意
String sm = "1"; //任意
の数値を変えると, 月跨ぎ年跨ぎが確認出来ると思います.

カレンダーの課題(?)のコードを見る度に思うのですが, 皆さん前後の月の日付を扱うのに苦労されています.
が, 例えば, ある日以前の日曜日を求めるなら, Calendar から一日ずつ日を戻って日曜日を探せばよいわけで, その時に月を跨ごうが年を跨ごうが Calendar が補正してくれます.
そこから必要な分ループし Calendar を一日ずつ進めれば, 例えば(前年)前月から今月を経て(来年)来月までの日付をその都度 Calendar が示しますので, 日を保存しておく必要もありません.
その状態から「日のスケジュールを得て表示する」ようにすれば, 少なくとも日付の(計算)間違いによるデータの取得失敗は防げるかと思います.

java

1package teratail.q250724; 2 3import java.time.LocalDate; 4import java.time.format.DateTimeFormatter; 5import java.util.Calendar; 6 7public class Test { 8 public static void main(String[] args) { 9 Calendar calendar = Calendar.getInstance(); 10 11 String move = "move"; 12 if(move != null) { 13 String sy = "2020"; 14 String sm = "1"; 15 if(sy != null && sy.matches("\d{4}") && sm != null && sm.matches("\d{1,2}")) { 16 int y = Integer.parseInt(sy); 17 int m = Integer.parseInt(sm); 18 if(2000 <= y && y <= 2100 && 1 <= m && m <= 12) { //年の範囲制限はテキトウ 19 calendar.set(Calendar.YEAR, y); 20 calendar.set(Calendar.MONTH, m - 1); 21 } 22 } 23 } 24 25 calendar.add(Calendar.MONTH, -1); //前月 26 int prevYear = calendar.get(Calendar.YEAR); 27 int prevMonth = calendar.get(Calendar.MONTH) + 1; 28 29 calendar.add(Calendar.MONTH, 2); //来月 30 int nextYear = calendar.get(Calendar.YEAR); 31 int nextMonth = calendar.get(Calendar.MONTH) + 1; 32 33 calendar.add(Calendar.MONTH, -1); //今月 34 int year = calendar.get(Calendar.YEAR); 35 int month = calendar.get(Calendar.MONTH) + 1; 36 37 //月初週の日曜日 38 while(calendar.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY) calendar.add(Calendar.DATE, -1); 39 40 System.out.println("今月: "+year+"/"+month); 41 do { 42 //一日分の表示 43 System.out.print(calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY ? "*" : 44 calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY ? "+" : " "); 45 java.sql.Date sqlDate = new java.sql.Date(calendar.getTimeInMillis()); 46 System.out.println(sqlDate+"("+"日月火水木金土".charAt(calendar.get(Calendar.DAY_OF_WEEK)-1)+")"); 47 48 calendar.add(Calendar.DATE, 1); 49 } while(calendar.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY || calendar.get(Calendar.MONTH)+1 == month); 50 51 System.out.println("前月: "+prevYear+"/"+prevMonth); 52 System.out.println("次月: "+nextYear+"/"+nextMonth); 53 } 54}

plain

1今月: 2020/1 2*2019-12-29(日) 3 2019-12-30(月) 4 2019-12-31(火) 5 2020-01-01(水) 6 2020-01-02(木) 7 2020-01-03(金) 8+2020-01-04(土) 9*2020-01-05(日) 10 2020-01-06(月) 11 2020-01-07(火) 12 2020-01-08(水) 13 2020-01-09(木) 14 2020-01-10(金) 15+2020-01-11(土) 16*2020-01-12(日) 17 2020-01-13(月) 18 2020-01-14(火) 19 2020-01-15(水) 20 2020-01-16(木) 21 2020-01-17(金) 22+2020-01-18(土) 23*2020-01-19(日) 24 2020-01-20(月) 25 2020-01-21(火) 26 2020-01-22(水) 27 2020-01-23(木) 28 2020-01-24(金) 29+2020-01-25(土) 30*2020-01-26(日) 31 2020-01-27(月) 32 2020-01-28(火) 33 2020-01-29(水) 34 2020-01-30(木) 35 2020-01-31(金) 36+2020-02-01(土) 37前月: 2019/12 38次月: 2020/2

投稿2020/04/01 14:21

jimbe

総合スコア13209

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問