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

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

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

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

Java

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

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Q&A

解決済

1回答

3867閲覧

【Java・JSP・Servlet】formでsubmitしたものがnullになってしまう

ysda

総合スコア65

JSP

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

Java

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

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

0グッド

0クリップ

投稿2020/09/08 01:23

編集2020/09/08 03:37

発生している問題・エラーメッセージ

Java,JSP,Servletで生徒の成績管理のプログラムを作成しています。
現在、以下のように、受けた試験の試験日と得点を更新・削除の機能の作成を行っております。
イメージ説明

現状、更新や削除を押下するとnullエラーが起きてしまう状態になっております。
このとき、formで送っているものは生徒ID・試験日・教科ID・得点なのですが、すべてnullになっていることを確認しました。
しかし、Chromeの開発ツールで見たところ、すべてvalueに値が入っており、なぜnullになってしまうのかがわからない状態になっております。

同様のロジックで一度削除・更新機能が正常に動いていることは確認したのですが、少しソースをいじったところ、このような状態になってしまいました。
以前のコードの状態に戻してみましたが、同様のエラーが出てしまうようになってしまいました。
こちらの解決方法につきましてご教示いただけますと幸いです。

該当のソースコード(文字制限の関係上、削除機能部分のみの記載です)

test-results-regist.jsp

<!--省略 --> <form action="testResultsRegistEdit" method="post"> <table class="input-form-table"> <tr> <td>試験日</td> <td><select name="test_day"> <option value="">すべての試験日</option> <!-- 試験日のプルダウン記述 --> </select></td> </tr> <tr> <td>学年</td> <td><input type="text" id="year" name="school_year" maxlength='10' placeholder="学年(半角数字)"></td> </tr> <tr> <td>クラス</td> <td><input type="text" id="class" name="school_class" maxlength='10' placeholder="クラス(半角数字)"></td> </tr> </table> <div class="buttons"> <div class="submit-button text-center test-results-button"> <button type="submit" name="mode" value="search">検索</button> </div> <div class="submit-button text-center test-results-button"> <button type="button" onclick="clearField()">クリア</button> </div> </div> </form> </div> <%if(testResults != null) {%> <%for(TestResult data: testResults) {%> <table class="table search-result-table"> <thead> <tr> <th>学年</th> <th>クラス</th> <th>生徒ID</th> <th>名前</th> </tr> </thead> <tbody> <tr> <td><%=data.getSchool_year() %></td> <td><%=data.getSchool_class() %></td> <td><%=data.getStudent_id() %></td> <td><%=data.getStudent_name() %></td> </tr> </tbody> <thead> <tr> <th>試験日</th> <th>科目</th> <th>得点</th> <th>更新</th> <th>削除</th> </tr> </thead> <%for (TestResult data2: testResults2) {%> <%if (data2.getStudent_id().equals(data.getStudent_id())) {%> <form action="testResultsRegistEdit" method="post"> <input type="hidden" name="student_id" value="<%=data.getStudent_id() %>"> <!--生徒IDをsubmit --> <tr> <td><input type="date" name="test_day" value="<%=data2.getTest_day() %>" max="2999-12-31"> <!--試験日をsubmit --></td> <td><%=data2.getSubject_name() %> <input type="hidden" name="subject_id" value="<%=data2.getSubject_id() %>"> <!--教科IDをsubmit --></td> <td><input type="text" name="score" value="<%=data2.getScore() %>"> <!--得点をsubmit --></td> <td> <button type="submit" name="mode" value="update">更新</button> </td> <td> <button type="submit" name="mode" value="delete">削除</button> </td> </tr> </form> <%} %> <%} %> </table> <%} %> <%} %> <!--以下省略 -->

TestResultsBeans.java

//import省略 public class TestResultsBeans { private static String student_id; private static String subject_id; private static String score; private static String test_day; private static Connection conn = null; private static PreparedStatement ps = null; private static ResultSet result = null; static String user = "suser"; static String password = "spass"; static String url = "jdbc:mysql://localhost:3306/mydb?autoReconnect=true&useSSL=false"; public TestResultsBeans(HttpServletRequest request) { setStudent_id(request.getParameter("student_id")); setSubject_id(request.getParameter("subject_id")); setScore(request.getParameter("score")); setTest_day(request.getParameter("test_day")); } public static String getStudent_id() { return student_id; } public static void setStudent_id(String student_id) { TestResultsBeans.student_id = student_id; } public static String getSubject_id() { return subject_id; } public static void setSubject_id(String subject_id) { TestResultsBeans.subject_id = subject_id; } public static String getScore() { return score; } public static void setScore(String score) { TestResultsBeans.score = score; } public static String getTest_day() { return test_day; } public static void setTest_day(String test_day) { TestResultsBeans.test_day = test_day; } public static boolean deleteData() { try { System.out.println("削除処理開始"); String sql = "DELETE FROM test_results WHERE student_id = ? and subject_id = ? and test_day = ?"; Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection(url, user, password); ps = conn.prepareStatement(sql); //以下の3つはすべてnullで出力される System.out.println(student_id); System.out.println(subject_id); System.out.println(test_day); ps.setInt(1, Integer.parseInt(student_id)); ps.setInt(2, Integer.parseInt(subject_id)); ps.setDate(3, Date.valueOf(test_day)); System.out.println(ps); ps.executeUpdate(); return true; } catch(Exception e) { e.printStackTrace(); return false; } finally { if(conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); System.out.println("MySQLのクローズに失敗しました。"); } } } } }

TestResultsRegistEditServlet.java
(かなり省略しました)

//省略 public class TestResultsRegistEditServlet extends HttpServlet{ Connection conn = null; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ request.setCharacterEncoding("UTF-8"); String mode = request.getParameter("mode"); String status = "Success!"; switch(mode) { case "delete": try { if(TestResultsBeans.deleteData() == false) { status = "Failed..."; } } catch(Exception e) { e.printStackTrace(); } finally { try { conn.close();             request.setAttribute("status", status);    request.getRequestDispatcher("test-results-regist.jsp").forward(request, response); } catch (SQLException e) { System.out.println("MySQLのクローズに失敗しました。"); } } } break; } } }

試したこと

・ブラウザのキャッシュクリア
・Eclipseのキャッシュクリア
・新しくプロジェクトを作成し、ソースをコピペして起動

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/09/08 01:26

Servletクラスもご提示ください
ysda

2020/09/08 01:56

コメントありがとうございます。 質問文にも記載させているのですが、Teratailの文字数制限の関係上、Servletを記載することができませんでした。 そのため、仕方なく自己解決のほうにServletのソースを記載して投稿してみたのですが、私からだとどうもうまく表示できていないような状態になっております。 ご了承いただければと思います。
m.ts10806

2020/09/08 02:06

では、html含めて現象が再現する最小構成のプログラムを改めて組んでください(「質問するときのヒント」にもあります)。 本件解決のためにコードが全て必要かというとそうではないと思います。 それに組み直してみると気づけることもありますよ。実務でもよくやります。 削るか簡単なコード組み直して動作検証。
ysda

2020/09/08 03:33

ソースを削って動作できるレベルのものを字数制限内に収めることが難しかったため、抜粋で記載しました。
guest

回答1

0

自己解決

削除処理の記述に引数を持たせることで一応解決はできました。
ただ、なぜinputしたものがnullになってしまったのかは未だに不明です。
取り急ぎ暫定的な対処を行ったことを報告します。

TestResultsBeans.java

public static boolean deleteData(String student_id, String subject_id, String test_day) { try { System.out.println("削除処理開始"); String sql = "DELETE FROM test_results WHERE student_id = ? and subject_id = ? and test_day = ?"; Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection(url, user, password); ps = conn.prepareStatement(sql); ps.setInt(1, Integer.parseInt(student_id)); ps.setInt(2, Integer.parseInt(subject_id)); ps.setDate(3, Date.valueOf(test_day)); System.out.println(ps); ps.executeUpdate(); return true; } catch(Exception e) { e.printStackTrace(); return false; } finally { if(conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); System.out.println("MySQLのクローズに失敗しました。"); } } } }

投稿2020/09/08 04:21

ysda

総合スコア65

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問