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

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

ただいまの
回答率

87.92%

サーブレットを直接表示させたい

受付中

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 1,853

score 11

前提・実現したいこと

スケジュールを登録、更新、削除するwebアプリケーションを作成しています
サーブレットの名前をアドレスバーに打ち込んだら直接サーブレットの内容が表示されるようにしたいです。
web.xmlに何か書けばいいのはわかっているのですが、さっぱりわかっていません(違っていたらすみません)
もしくは下記のコードをjspに書くとしたらどのようなコードを書けばいいのでしょうか。

該当のソースコード

入りきらないので分割します

package calendar;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Calendar;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**

  •  
  • @author hoge
  •   */
    public class MonthView7 extends HttpServlet {

protected Connection conn = null;

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

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=utf-8");
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("<!DOCTYPE html>");

sb.append("<html lang=\"ja\">");
sb.append("<head>");
sb.append("<meta http-equiv=\"Content-Type\" Content=\"text/html;charset=Shift_JIS\">");

sb.append("<title>スケジュール管理</title>");

sb.append("<style>");
sb.append("table{border:1px solid #a9a9a9;width:90%;padding:0px;margin:0px;border-collapse:collapse;}");
sb.append("td{width:12%;border-top:1px solid #a9a9a9;border-left:1px solid #a9a9a9;"
+ "vertical-align:top;margin:0px;padding:2px;}");
sb.append("td.week{background-color:#f0f8ff;text-align:center;}");
sb.append("td.day{background-color:#f5f5f5;text-align:right;font-size:0.75em;}");
sb.append("td.otherday{background-color:#f5f5f5;color:#d3d3d3;text-align:right;font-size:0.75em;}");
sb.append("td.sche{background-color:#fffffff;text-align:left;height:80px;}");
sb.append("img{border:0px;}");
sb.append("span.small{font-size:0.75em;}");
sb.append("</style>");

sb.append("</head>");
sb.append("<body>");

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

/* 日付データを配列に格納 */
count = setDateArray(year, month, day, calendarDay, count);

/* 年月のリンク作成 */
sb.append(createMonthLink(year, month));

sb.append("<table>");

sb.append("<tr><td class=\"week\">日</td><td class=\"week\">月</td>"
+ "<td class=\"week\">火</td><td class=\"week\">水</td>"
+ "<td class=\"week\">木</td><td class=\"week\">金</td><td class=\"week\">土</td></tr>");

int weekCount = count / 7;

for (int i = 0; i < weekCount; i++) {
/* スケジュールの日付画面を作成する */
sb.append("<tr>");

for (int j = i * 7; j < i * 7 + 7; j++) {
if (calendarDay[j] > 35) {
sb.append("<td class=\"otherday\">");
sb.append(calendarDay[j] - 35);
} else {
sb.append("<td class=\"day\">");
sb.append(calendarDay[j]);
}
sb.append("</td>");
}

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

/* カレンダーのスケジュール登録画面を作成する */
sb.append(createScheduleStr(month, i * 7, calendarDay, userid));
}

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

sb.append("</body>");
sb.append("</html>");

out.println(new String(sb));
}

補足情報(言語/FW/ツール等のバージョンなど)

Eclipse tomcat6.0

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

上の続きです
/**

  • スケジュール登録へのリンクを設定する
    */
    protected String createScheduleStr(int month, int startDayNo, int[] calendarDay, int userid) {
    StringBuffer sb = new StringBuffer();

sb.append("<tr>");

for (int i = startDayNo; i < startDayNo + 7; i++) {
if (calendarDay[i] > 35) {
/* 前月及び翌月の箇所にはアイコンは表示しない */
sb.append("<td class=\"sche\"></td>");
} else {
sb.append("<td class=\"sche\">");
sb.append("<a href=\"/schedule/NewSchedule");

/**

  • パラメータの作成 */
    sb.append("&MONTH=");
    sb.append(month);
    sb.append("&DAY=");
    sb.append(calendarDay[i]);

sb.append("\">");
sb.append("<img src=\"./img/memo.png\" width=\"14\" height=\"16\">");
sb.append("</a><br>");

/* スケジュールの表示 */

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 = (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("<a href=\"/schedule/ScheduleView?ID=");
sb.append(id);
sb.append("\">");
sb.append(schedule);
sb.append("</a><br>");
}

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

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

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

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

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

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("<p>");

sb.append("<a href=\"/schedule/MonthView?YEAR=");
sb.append(year);
sb.append("&MONTH=");
sb.append(month - 1);
sb.append("\"><span class=\"small\">前月</span></a>&nbsp;&nbsp;");

sb.append(year);
sb.append("年");
sb.append(month + 1);
sb.append("月&nbsp;&nbsp;");

sb.append("<a href=\"/schedule/MonthView?YEAR=");
sb.append(year);
sb.append("&MONTH=");
sb.append(month + 1);
sb.append("\"><span class=\"small\">翌月</span></a>");

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

return (new String(sb));
}

}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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