カレンダー画面でスケジュールの表示

広告

前回でスケジュールの登録が行えるようになりましたので、今度はカレンダー画面を開いた時に登録されているスケジュールを表示するように変更してみます。

カレンダーの日付毎にアイコンを表示している箇所で、日付毎にデータベースへ問い合わせを行いその日付のスケジュールがあれば表示するようにしています。

for (int i = startDayNo ; i < startDayNo + 7 ; i++){

    /* 途中略 */

    /* スケジュールの表示 */
    sb.append("<span class=¥"small¥">");

    try {
      String sql = "SELECT * FROM schedule WHERE userid = ? and scheduledate = ? ORDER BY starttime";
      PreparedStatement pstmt = conn.prepareStatement(sql);

      String startDateStr = year + "-" + (month + 1) + "-" + calendarDay[i];
      pstmt.setInt(1, 1);
      pstmt.setString(2, startDateStr);

      ResultSet rs = pstmt.executeQuery();

      while(rs.next()){
        String starttime = rs.getString("starttime");
        String endtime = rs.getString("endtime");
        String schedule = rs.getString("schedule");

        if (starttime == null || endtime == null){
          sb.append("* " + schedule + "<br>");
        }else{
          String startTimeStr = starttime.substring(0, 5);
          String endTimeStr = endtime.substring(0, 5);
          sb.append(startTimeStr + "-" + endTimeStr + " " + schedule + "<br>");
        }
      }

      rs.close();
      pstmt.close();

    }catch (SQLException e){
      log("SQLException:" + e.getMessage());
    }

    sb.append("</span>");

    sb.append("</td>");
  }
  sb.append("</td>");
}

データベースへの接続をinit()メソッド内で行う

今まではdoGetメソッド又はdoPostメソッド内でデータベースへの接続と切断を記述していましたが、ここからはinitメソッドにて接続を行い、destroyメソッドで切断を行うように変更します。

doGetメソッド内に記述していた場合にはサーブレットが呼び出されるたびにデータベースへの接続と切断が発生してしまうのに対して、initメソッド内に記述した場合にはサーブレットが最初にロードされた時にデータベースに接続が行われ、サーブレットが破棄される時に切断が行われるようになります。

protected Connection conn = null;

public void init() throws ServletException{
  String url = "jdbc:mysql://localhost/servletschedule";
  String user = "scheduleuser";
  String password = "schedulepass";

  try {
    Class.forName("com.mysql.jdbc.Driver").newInstance();
    conn = DriverManager.getConnection(url, user, password);
  }catch (ClassNotFoundException e){
    log("ClassNotFoundException:" + e.getMessage());
  }catch (SQLException e){
    log("SQLException:" + e.getMessage());
  }catch (Exception e){
    log("Exception:" + e.getMessage());
  }
}

public void destory(){
  try{
    if (conn != null){
      conn.close();
    }
  }catch (SQLException e){
    log("SQLException:" + e.getMessage());
  }
}

サンプルプログラム

修正したプログラムは次のようになります。

MonthView5.java [HTMLで表示]

コンパイルして作成されたクラスファイルを「(root)¥WEB-INF¥classes¥」ディレクトリに配置します。

D:¥servlet-sample
   |
   +--schedule
       |
       +-- (top.html)
       |
       +-- WEB-INF
       |    |
       |    +-- classes
       |          |
       |          +-- (MonthView5.class)
       |          |
       |          +-- (NewSchedule3.class)
       |          |
       |          +-- (ScheduleInsert1.class)
       |
       +-- img

また作成したサーブレットを呼び出せるように「web.xml」を次のように書き換えます。

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
  version="2.4">

  <servlet>
    <servlet-name>MonthView</servlet-name>
    <servlet-class>MonthView5</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>MonthView</servlet-name>
    <url-pattern>/MonthView</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>NewSchedule</servlet-name>
    <servlet-class>NewSchedule3</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>NewSchedule</servlet-name>
    <url-pattern>/NewSchedule</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>ScheduleInsert</servlet-name>
    <servlet-class>ScheduleInsert1</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>ScheduleInsert</servlet-name>
    <url-pattern>/ScheduleInsert</url-pattern>
  </servlet-mapping>
</web-app>

それではブラウザで「http://localhost:8080/schedule/MonthView」へアクセスします。次のように登録されているスケジュールが表示されます。

スケジュール管理

ここで画面左上の「前月」をクリックして下さい。

スケジュール管理

他の月に移動しても、その月に登録されているスケジュールが表示されます。

( Written by Tatsuo Ikura )