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

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

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

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

PostgreSQL

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

Java

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

解決済

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

kumakura
kumakura

総合スコア0

JSP

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

PostgreSQL

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

Java

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

2回答

0評価

0クリップ

1037閲覧

投稿2020/04/01 08:19

前提・実現したいこと

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

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

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

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

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

JSPページ

jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="calendar.Top" %> <%@ page import="java.util.Calendar"%> <%@ page import="java.sql.ResultSet" %> <%@ page import="java.time.LocalDate" %> <%@ page import="java.time.LocalDateTime"%> <%@ page import="java.time.LocalTime" %> <%@ page import="java.time.format.DateTimeFormatter" %> <% Calendar calendar = Calendar.getInstance(); int year; int month; int day; //前月・来月に飛んだ場合 String move = request.getParameter("move"); String syear = request.getParameter("year"); String smonth = request.getParameter("month"); if(move==null){ //現時点の日付 year = calendar.get(Calendar.YEAR); month = calendar.get(Calendar.MONTH)+1; day = calendar.get(Calendar.DATE); }else{ year = Integer.parseInt(syear); month = Integer.parseInt(smonth); day = 1; if(month==13) { year += 1; month = 1; }else if(month==0) { year = year - 1; month = 12; }else { year = year; month = month; } } //今月最初の曜日 calendar.set(year,month-1,1); int startWeek = calendar.get(Calendar.DAY_OF_WEEK); //前月の日数 calendar.set(year,month-1,0); int beforedaycount = calendar.get(Calendar.DATE); //今月の日数・今月最後の曜日 calendar.set(year,month,0); int daycount = calendar.get(Calendar.DATE); int lastWeek = calendar.get(Calendar.DAY_OF_WEEK); //日付用の配列作成 int [] cl = new int[42]; int count = 0; //先月の日数を格納 for (int i = startWeek-2 ; i >= 0 ; i--){ cl[count++] = beforedaycount - i; } //今月の日数を格納 for(int i = 0;i<=daycount-1;i++) { cl[count++] = 1+i; } //来月の日数を格納 for(int i=0;i<=7-lastWeek;i++) { cl[count++] = 1+i; } //何週分を格納したか確認 int weekCount = count / 7; //データベースへ接続 Top db = new Top(); db.open(); //データベース出力用 LocalDate daydate; java.sql.Date sqlday; ResultSet rs; %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <link rel="stylesheet" href="calender.css"> <title>calender</title> </head> <body> <main> <h1> <% out.println(year+"年"+month+"月"); %> <% int yearnow=year; %> <% int monthnow=month; %> </h1> <a href="new.jsp">NEW</a> <div class="calender"> <div class="weeks"> <div class="week sunday"> <b>日</b> </div> <div class="week"> <b>月</b> </div> <div class="week"> <b>火</b> </div> <div class="week"> <b>水</b> </div> <div class="week"> <b>木</b> </div> <div class="week"> <b>金</b> </div> <div class="week saturday"> <b>土</b> </div> </div> <div class="days">     //カレンダー上の初日 <div class="day sunday"> <% int cday = cl[0]; %> <p> <% out.println(cday); %> </p> <div class="apo"> <% //年月日の算出 year = db.prevyear(year,month,cday); month = db.prevmonth(year,month,cday); //年月日の変換、データ参照 rs = db.getResultSet("select * from calendar where day='"+db.sql(year, month, cday)+"'"); while (rs.next()){ //SQL時間データをLocalへ変換 java.sql.Time starttimes = rs.getTime("starttime"); java.sql.Time lasttimes = rs.getTime("lasttime"); //結果出力部分 out.print(db.starttime(year,month,day,starttimes)); out.print(db.timewhile(year,month,day,starttimes,lasttimes)); out.print(db.lasttime(year,month,day,lasttimes)); out.print(db.titlewhile(year,month,day,starttimes,lasttimes)); out.println(rs.getString("title")); out.println(""); %> <br> <% //year,monthを初期値へ戻す month = monthnow; year = yearnow; }%> </div> </div>    //カレンダー上の2日目 <div class="day"> <p> <% out.println(cl[1]); %> </p> <div class="apo"> </div> </div>    -中略- </div> <% }else{ System.out.print(""); }%> </div> <a class="prev" href="calender.jsp?move=prev&year=<%= year %>&month=<%= monthnow-1 %>">前月</a> <a class="next" href="calender.jsp?move=next&year=<%= year %>&month=<%= monthnow+1 %>">来月</a> </main> </body> </html>

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

Java

package calendar; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.format.DateTimeFormatter; public class Top { private String url; private String user; private String password; private Connection conn; private Statement state; private ResultSet rs; public Top() { url = "-省略-"; user = "-省略-"; password = "-省略-"; } //データベースへの接続する public void open() throws Exception { conn = DriverManager.getConnection(url, user, password); state = conn.createStatement(); } //SQL 文を実行した結果の ResultSet を返す public ResultSet getResultSet(String sql) throws Exception { if ( state.execute(sql) ) { return state.getResultSet(); } return null; } //データベースを閉じる public void close() throws Exception { if ( rs != null ) rs.close(); if ( state != null ) state.close(); if ( conn != null ) conn.close(); } //年の固定(前月分日付の場合) public int prevyear (int year,int month,int day) { if(day>20 && month==1){ return year -= 1; }else{ return year; } }   //月の固定(前月分日付の場合) public int prevmonth (int year,int month,int day) { if(day>20 && month==1){ return month = 12; }else{ return month -=1; } }   //年の固定(来月分日付の場合) public int nextyear (int year,int month,int day) { if(day>20 && month==12){ return year += 1; }else{ return year; } }   //月の固定(来月分日付の場合) public int nextmonth (int year,int month,int day) { if(day>20 && month==12){ return month = 1; }else{ return month +=1; } }   //予定開始時間の出力 public String starttime(int year,int month,int day,java.sql.Time starttimes) { DateTimeFormatter dtformat1 = DateTimeFormatter.ofPattern("HH:mm"); if(starttimes==null) { return ""; }else { //SQL時間データをLocalへ変換 LocalTime starttimet = starttimes.toLocalTime(); LocalDateTime starttimel = starttimet.atDate(LocalDate.of(year, month, day)); //時間の表示方法指定 String stime = dtformat1.format(starttimel); return stime; } } //予定開始時間と終了時間間の「~」の出力 public String timewhile(int year,int month,int day,java.sql.Time starttimes,java.sql.Time lasttimes) { if(starttimes==null && lasttimes==null) { return ""; }else { return "~"; } }   //予定終了時間の出力 public String lasttime(int year,int month,int day,java.sql.Time lasttimes) { DateTimeFormatter dtformat1 = DateTimeFormatter.ofPattern("HH:mm"); if(lasttimes==null) { return ""; }else { //SQL時間データをLocalへ変換 LocalTime lasttimet = lasttimes.toLocalTime(); LocalDateTime lasttime = lasttimet.atDate(LocalDate.of(year, month, day)); //時間の表示方法指定 String ltime = dtformat1.format(lasttime); return ltime; } }   //時間と予定名間の「:」の出力 public String titlewhile(int year,int month,int day,java.sql.Time starttimes,java.sql.Time lasttimes) { if(starttimes==null && lasttimes==null) { return ""; }else { return ":"; } }    //SQLから取り出したデータ型の変換 public java.sql.Date sql (int year,int month,int day){ LocalDate daydate = LocalDate.of(year, month, day); java.sql.Date sqlday = java.sql.Date.valueOf(daydate); return sqlday; } }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

削除済ユーザー
削除済ユーザー

2020/04/01 09:05

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

2020/04/01 10:48

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

2020/04/01 11:22

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

2020/04/01 13:47

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

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

JSP

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

PostgreSQL

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

Java

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