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

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

ただいまの
回答率

89.62%

jspからjspへセッションを用いて値を渡したい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,273

nagomi72

score 39

scheduleIndex.jspの値をセッションに保存し、scheduleDetail.jspでセッションに保存された値を取得したいと考えています。

ScheduleToday.javaでセッションに保存した値をscheduleIndex.jspで取得することは成功し、リンクで移動した先のscheduleDetail.jspでも同様にサーブレットクラスでセッションに保存した値を取得しようとしたところ、値がないとのエラーが出ました。

scheduleIndex.jspからscheduleDetail.jspへリンクで移動した段階でサーブレットクラスでセッションに保存された値は消失してしまうため、
scheduleIndex.jspで再びセッションに値を保存する必要があると聞いたため、scheduleIndex.jsp内でセッションに値を再度セットし、再セットしたセッションから値を取得するコードを書いたのですが再度セットがうまくできていません。

変数year_nowはnullではないことは確認できています。

どの部分に問題があるのか、ご教授頂きたく存じます。

scheduleIndex.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<style>
div.inputForm {
    position: absolute;
    top: 10px;
    right: 600px;
}
</style>
</head>
<body>




    <%
        //セッションから値を取得
        int year_now = Integer.parseInt((String)request.getAttribute("YEAR"));
        int month_now = Integer.parseInt((String)request.getAttribute("MONTH"));
        int day_now = Integer.parseInt((String)request.getAttribute("DAY"));
        String[] schedule_array  = ((String[]) request.getAttribute("SCHEDULEARRAY"));
    %>

        <!-- ここでセッションに値を入れているつもりが入っていない -->
        <% session.setAttribute("TESTYEAR", year_now); %>
        <!-- ここでjava.lang.NumberFormatException: nullが発生する -->
        <% int test_year = Integer.parseInt((String)request.getAttribute("TESTYEAR")); %>
        <%= test_year %>






    スケジュール詳細ページ&nbsp;<br>

    <a
        href="/CalendarJsp/Calendar.jsp?YEAR=<%=year_now%>&MONTH=<%=month_now%>">戻る</a>
    <table border="1">
        <tr>
            <td>時刻</td>
            <td>予定</td>
        </tr>

        <!-- 0時から23時までを表示 -->
        <%
            for (int i = 0; i < 24; i++) {
        %>
        <tr>
            <td><%=i%>:00</td>
            <!--  <td width="800" height="30"><%= schedule_array[i] %></td> -->
            <td width="800" height="30"><a href="/CalendarJsp/scheduleDetail.jsp?YEAR=<%=year_now%>&MONTH=<%=month_now%>&DAY=<%=day_now%>"><%= schedule_array[i] %></a></td>
        </tr>





        <%
            }
        %>

    </table>

    <!--セレクトボックスを作っていく
        まずは年度から            -->

    <div class="inputForm">

        <form action="/CalendarJsp/AddSchedule" method="post">
            <table>
                <tr>
                    <td nowrap>日付</td>
                    <td><select name="YEAR">

                            <%
                                for (int i = year_now; i < year_now + 5; i++) {
                            %>

                            <%
                                //パラメータをプルダウンメニューの初期値にする
                                    if (i == year_now) {
                            %>

                            <option value=<%=year_now%> selected><%=i%><%
                                }
                            %>

                            <option value=<%=year_now%>><%=i%><%
                                                            }
                                                        %>

                    </select> <select name="MONTH">


                            <%
                                for (int j = 1; j < 13; j++) {
                            %>

                            <%
                                if (j == month_now) {
                            %>

                            <option value=<%=j%> selected><%=j%><%
                                }
                            %>

                            <option value=<%=j%>><%=j%><%
                                                            }
                                                        %>

                    </select> <select name="DAY">

                            <%
                                for (int k = 1; k < 32; k++) {
                            %>

                            <%
                                if (k == day_now) {
                            %>

                            <option value=<%=k%> selected><%=k%><%
                                }
                            %>

                                <%
                                    if (k != day_now) {
                                %>

                            <option value=<%=k%>><%=k%><%
                                                            }
                                                        %>


                                <%
                                    }
                                %>

                    </select></td>
                </tr>


                <tr>
                    <td nowrap>時刻</td>
                    <td><select name="SHOUR">

                            <%
                                for (int i = 0; i < 24; i++) {
                            %>

                            <option value=<%=i%>><%=i%><%
                                }
                            %>

                    </select> <select name="SMINUTE">

                            <option value="0">00分
                            <option value="30">30分
                    </select><select name="EHOUR">

                            <%
                                for (int i = 0; i < 24; i++) {
                            %>

                            <option value=<%=i%>><%=i%><%
                                }
                            %>

                    </select> <select name="EMINUTE">




                            <option value="0">00分
                            <option value="30">30分
                    </select></td>
                </tr>

                <tr>
                    <td nowrap>予定</td>
                    <td><input type="text" name="PLAN" value="" size="30"
                        maxlength="100"></td>
                </tr>


                <tr>
                    <td valign="top" nowrap>メモ</td>
                    <td><textarea name="MEMO" cols="30" rows="10" wrap="virtual"></textarea></td>
                </tr>
            </table>



            <p>
                <input type="submit" value="登録する"> <input type="reset"
                    value="入力し直す">
            <p>
        </form>


    </div>
</body>
</html>

scheduleToday.java

package servlet;

import java.io.IOException;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.concurrent.ScheduledExecutorService;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.xml.crypto.Data;

import org.eclipse.jdt.internal.compiler.ast.ArrayAllocationExpression;
import org.omg.CosNaming.NamingContextExtPackage.StringNameHelper;

import model.Month;

@WebServlet("/ScheduleToday")
public class ScheduleToday extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {


        // パラメータ取得
        String year_now = request.getParameter("YEAR");
        String month_now = request.getParameter("MONTH");
        String day_now = request.getParameter("DAY");

        // 0埋め
        String month_shaping = String.format("%02d", Integer.parseInt(month_now));
        String day_shaping = String.format("%02d", Integer.parseInt(day_now));

        // where旬でつかう
        String specified_day = year_now + "-" + month_shaping + "-" + day_shaping + " 00:00:00";
        // ログイン機能をつけた時に考える
        int id = 1;

        String[] schedule_array = new String[24];

        for (int i = 0; i < 24; i++) {

            schedule_array[i] = "";

        }

        response.setContentType("text/html; charset=UTF-8");

        Connection conn = null;

        try {
            // JDBCドライバを読み込み
            Class.forName("oracle.jdbc.driver.OracleDriver");

            // データベースへ接続
            conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.132:1521:xe", "stockuser", "moriara0029");



            PreparedStatement stmt = conn.prepareStatement(
                    "SELECT * FROM schedule WHERE ID = ? and scheduledate = to_date(?,'YYYY-MM-DD HH24:MI:SS')");
            System.out.println(specified_day);
            // sql文の値をセット
            stmt.setInt(1, 1);
            stmt.setString(2, specified_day);
            // selectを実行し、結果票を取得
            ResultSet rs = stmt.executeQuery();

            // 結果表に格納されたレコードの内容を表示
            while (rs.next()) {

                String start_time = rs.getString("STARTTIME");
                String end_time = rs.getString("ENDTIME");
                String schedule = rs.getString("SCHEDULE");

                //0から23の数字と比較したいから時分秒の時分を抜き出し
                String start_time_time = start_time.substring(11, 13);
                String start_time_minute = start_time.substring(14, 16);
                String end_time_time = end_time.substring(11, 13);
                String end_time_minute = end_time.substring(14, 16);
                //スケジュール欄に表示させる時間
                String totale_time = start_time_time + ":" + start_time_minute + "-" + end_time_time + ":"
                        + end_time_minute + " ";

                for (int i = 0; i < 24; i++) {

                    String character_conversion = Integer.toString(i);
                    String time_schedule = String.format("%02d", Integer.parseInt(character_conversion));

                    if (start_time_time.equals(time_schedule)) {

                        schedule_array[i] = totale_time + schedule;

                    }

                }

            }

        } catch (ClassNotFoundException e) {

            e.printStackTrace();

        } catch (SQLException e) {

            e.printStackTrace();

        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            try {

                if (conn != null) {

                    conn.close();

                }

            } catch (SQLException e) {

                e.printStackTrace();
            }

        }

        System.out.println("sessionにはこいつらをいれるよ.year" + year_now + ":month:" + month_now + ":day:" + day_now);

        request.setAttribute("YEAR", year_now);
        request.setAttribute("MONTH", month_now);
        request.setAttribute("DAY", day_now);
        request.setAttribute("SCHEDULEARRAY", schedule_array);

        // ユーザーのスケジュール表示画面へフォワード
        RequestDispatcher dispatcher = request.getRequestDispatcher("/scheduleIndex.jsp");
        dispatcher.forward(request, response);

    }
}

エラー文

9 12, 2018 2:57:42 午後 org.apache.catalina.core.StandardWrapperValve invoke
重大: Servlet.service() for servlet [servlet.ScheduleToday] in context with path [/CalendarJsp] threw exception [An exception occurred processing JSP page /scheduleIndex.jsp at line 35

32:         <!-- year_nowにはちゃんと値が入っていることを確認 -->
33:         <% System.out.println(year_now); %>
34:         <!-- ここでjava.lang.NumberFormatException: nullが発生する -->
35:         <% int test_year = Integer.parseInt((String)request.getAttribute("TESTYEAR")); %>
36:         <%= test_year %>
37:         
38: 


Stacktrace:] with root cause
java.lang.NumberFormatException: null
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+3

<% session.setAttribute("TESTYEAR", year_now); %>


でセッションスコープに値を保存していますが、
取り出しているのは

<% int (...省略...) request.getAttribute("TESTYEAR"); %>


とあるようにリクエストスコープで取得しているのが原因です。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/09/12 16:01

    取得先が違うかったんですね…
    ありがとうございます!

    キャンセル

+1

セッションを使ったデータの書き込みと読み込み
【JSP】セッションを使う

全体の流れはさっぱり分かりませんが、こういうことでしょうか?
session.setAttribute()
session.getAttribute()

        <% session.setAttribute("TESTYEAR", year_now); %>
<% int test_year = Integer.parseInt((String)session.getAttribute("TESTYEAR")); %>

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/09/12 16:01

    その通りです。
    ご回答頂きましてありがとうございました。

    キャンセル

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

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