import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.Calendar; import java.sql.*; public class MonthView7 extends HttpServlet{ 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()); } } public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{ res.setContentType("text/html;charset=Shift_Jis"); PrintWriter out = res.getWriter(); int[] calendarDay; int count; int year; int month; int day = 1; calendarDay = new int[42]; /* 最大で7日×6週 */ count = 0; String param = req.getParameter("YEAR"); if (param == null || param.length() == 0){ year = -999; }else{ try{ year = Integer.parseInt(param); }catch (NumberFormatException e){ year = -999; } } param = req.getParameter("MONTH"); if (param == null || param.length() == 0){ month = -999; }else{ try{ month = Integer.parseInt(param); }catch (NumberFormatException e){ month = -999; } } /* パラメータが指定されていない場合は本日の日付を設定 */ if (year == -999 || month == -999){ Calendar calendar = Calendar.getInstance(); year = calendar.get(Calendar.YEAR); month = calendar.get(Calendar.MONTH); day = calendar.get(Calendar.DATE); }else{ if (month == 12){ month = 0; year++; } if (month == -1){ month = 11; year--; } } /* ユーザー情報を取り出す */ HttpSession session = req.getSession(false); String username = (String)session.getAttribute("username"); String tmpuserid = (String)session.getAttribute("userid"); int userid = 0; if (tmpuserid != null){ userid = Integer.parseInt(tmpuserid); } StringBuffer sb = new StringBuffer(); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append("スケジュール管理"); sb.append(""); sb.append(""); sb.append(""); sb.append("

"); sb.append(username); sb.append("さんのスケジュールです"); sb.append("

"); /* 日付データを配列に格納 */ count = setDateArray(year, month, day, calendarDay, count); /* 年月のリンク作成 */ sb.append(createMonthLink(year, month)); sb.append(""); sb.append(""); int weekCount = count / 7; for (int i = 0 ; i < weekCount ; i++){ /* スケジュールの日付画面を作成する */ sb.append(""); for (int j = i * 7 ; j < i * 7 + 7 ; j++){ if (calendarDay[j] > 35){ sb.append(""); } sb.append(""); /* カレンダーのスケジュール登録画面を作成する */ sb.append(createScheduleStr(year, month, i * 7, calendarDay, userid)); } sb.append("
"); sb.append(calendarDay[j] - 35); }else{ sb.append(""); sb.append(calendarDay[j]); } sb.append("
"); sb.append(""); sb.append(""); out.println(new String(sb)); } /* スケジュール登録へのリンクを設定する */ protected String createScheduleStr(int year, int month, int startDayNo, int[] calendarDay, int userid){ StringBuffer sb = new StringBuffer(); sb.append(""); for (int i = startDayNo ; i < startDayNo + 7 ; i++){ if (calendarDay[i] > 35){ /* 前月及び翌月の箇所にはアイコンは表示しない */ sb.append(""); }else{ sb.append(""); sb.append(""); sb.append(""); sb.append("
"); /* スケジュールの表示 */ sb.append(""); 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, userid); pstmt.setString(2, startDateStr); ResultSet rs = pstmt.executeQuery(); while(rs.next()){ int id = rs.getInt("id"); String starttime = rs.getString("starttime"); String endtime = rs.getString("endtime"); String schedule = rs.getString("schedule"); if (starttime == null || endtime == null){ sb.append("* "); }else{ sb.append(starttime.substring(0, 5)); sb.append("-"); sb.append(endtime.substring(0, 5)); sb.append(" "); } sb.append(""); sb.append(schedule); sb.append("
"); } rs.close(); pstmt.close(); }catch (SQLException e){ log("SQLException:" + e.getMessage()); } sb.append("
"); sb.append(""); } sb.append(""); } sb.append(""); return (new String(sb)); } protected int setDateArray(int year, int month, int day, int[] calendarDay, int count){ Calendar calendar = Calendar.getInstance(); /* 今月が何曜日から開始されているか確認する */ calendar.set(year, month, 1); int startWeek = calendar.get(Calendar.DAY_OF_WEEK); System.out.println("今月の曜日は" + startWeek + "から"); /* 先月が何日までだったかを確認する */ calendar.set(year, month, 0); int beforeMonthlastDay = calendar.get(Calendar.DATE); System.out.println("先月は" + beforeMonthlastDay + "日まで"); /* 今月が何日までかを確認する */ calendar.set(year, month + 1, 0); int thisMonthlastDay = calendar.get(Calendar.DATE); System.out.println("今月は" + thisMonthlastDay + "日まで\r\n"); /* 先月分の日付を格納する */ for (int i = startWeek - 2 ; i >= 0 ; i--){ calendarDay[count++] = beforeMonthlastDay - i + 35; } /* 今月分の日付を格納する */ for (int i = 1 ; i <= thisMonthlastDay ; i++){ calendarDay[count++] = i; } /* 翌月分の日付を格納する */ int nextMonthDay = 1; while (count % 7 != 0){ calendarDay[count++] = 35 + nextMonthDay++; } return count; } protected String createMonthLink(int year, int month){ StringBuffer sb = new StringBuffer(); sb.append("

"); sb.append("前月  "); sb.append(year); sb.append("年"); sb.append(month + 1); sb.append("月  "); sb.append("翌月"); sb.append("

"); return (new String(sb)); } }