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

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

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

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

Java

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

サーブレット

サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

Q&A

解決済

1回答

1535閲覧

doPostとmainの違いについて

aki2tyuu

総合スコア2

JSP

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

Java

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

サーブレット

サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

0グッド

1クリップ

投稿2021/03/14 14:39

編集2021/03/14 22:11

前提・実現したいこと

初心者です
JavaのサーブレットJSPを学習中です
簡単な投稿サイトを作成しています

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

変数の中身がnullになってしまいます

サーブレットファイルのdoPostメソッド中だとlistが空で
テストクラスファイルの中だとlistにちゃんと値が入っていることが謎です

該当のソースコード

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { List<Bean> list = new ArrayList<>(); SampleDAO sampleDAO = new SampleDAO(); list = sampleDAO.findAll(); if (list.size() != 0){ RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/sample.jsp"); dispatcher.forward(request, response); } }

フォワードしません。==だと飛びます。isEmpty()でも確認済みです。

試したこと

簡単なテストクラスを作って試したところ、こっちでは出力成功しました。

public class DAOTest { public static void main(String[] args) { List<Bean> list = new ArrayList<>(); SampleDAO sampleDAO = new SampleDAO(); list = sampleDAO.findAll(); System.out.println(list.size()); } } }

テストは異常なく出力されました。

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

テストで問題なく出力されたので文法には間違いがないはず。。。
なぜサーブレットのdoPostになると結果が違うのかはまってます

DAOの該当箇所

public List<Bean> findAll() { List<Bean> list = new ArrayList<>(); try (Connection con = DriverManager.getConnection(DBURL, DBUSER, DBPASS)) { String sql = "SELECT * FROM ACCOUNT"; Statement smt = con.createStatement(); ResultSet rs = smt.executeQuery(sql); while (rs.next()) { String name = rs.getString("NAME"); String text = rs.getString("TEXT"); Bean bean = new Bean(name, text); list.add(bean); } } catch (SQLException e) { e.printStackTrace(); } return list; }

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

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

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

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

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

dodox86

2021/03/15 00:57 編集

スタンドアロンのmainメソッドとJavaサーブレット中のdoPostでの違いというより、SampleDaoクラスのfindAll()メソッド実行時にJDBCドライバーやDBアクセスが正しくできているかどうか、要は、環境設定の問題だと思います。ご提示のコードからはそれ以上のことは分かりません。 > } catch (SQLException e) { > e.printStackTrace(); > } でエラー出力されているのでしょうから、そこから確認しましょう。尚、下記のコード > List<Bean> list = new ArrayList<>(); > SampleDAO sampleDAO = new SampleDAO(); > list = sampleDAO.findAll(); では List<Bean> list = new ArrayList<>();でnew ArrayList<>();の意味はありません。sampleDAO.findAll();の返り値で上書きされてしまうので。
aki2tyuu

2021/03/15 13:03 編集

ご回答ありがとうございます 指摘していただいきましたlistの件、直してみます!ありがとうございます! エラー確認後だめだったら環境構築を全部1からやり直してみます
aki2tyuu

2021/03/15 13:41

解決しました!ありがとうございます!!全てを消す前に間に合いました! ご指摘のとうり、エラー出力を追っていきましたら 「No suitable driver found for jdbc:mysql://localhost」 の表示があり ご指摘の通り、JDBCドライバーがうまくできていなかったようです! (というかドライバーを設定する?一文が無かった) こちらのサイト様で復習しつつ、、、 https://www.javadrive.jp/servlet/database/index2.html (※newInstance()は不要?) Class.forName("com.mysql.cj.jdbc.Driver"); この一文をConnection conn の上の行に挿入 これにより、Javaサーブレット中のdoPostでもDBからデータを取得することに成功しました!感謝! 振り返り教訓、なぜハマったか? ・Java Applicationで実行したときはちゃんとDBと連携できた。その結果を受けてDB周りのコードには不備がないと思い込んだ。 ・そもそもJDBCドライバーについての知識がない(メソッドによって必要だったり必要じゃ無かったりする?) ・エラーログを読むという大切さ ・「スッキリわかるサーブレット&JSP入門」の学習にはClass.forName()メソッドが登場しない?ので気をつけよう! ということで、助かりました!ありがとうございます!
dodox86

2021/03/15 13:46 編集

ご自身で追及し、解決できてよかったです。上記の原因と解決策を自己回答として投稿し、質問を閉じてください。後に同じような問題で困った方の解決の一助になり得ます。
aki2tyuu

2021/03/15 14:00

初めてのサイト利用で助けていただけてなんだか感慨深いです ありがとうございました!
guest

回答1

0

自己解決

行動
ご指摘の通り、エラー出力を追っていきましたら
「No suitable driver found for jdbc:mysql://localhost」
の表示があり

原因発見
またまたご指摘の通り!JDBCドライバーがうまくできていなかったようです!
(というかドライバーを設定する?一文が無かった)

対処
こちらのサイト様でJDBCドライバーを復習しつつ、、、
https://www.javadrive.jp/servlet/database/index2.html
(※newInstance()は不要?)

Class.forName("com.mysql.cj.jdbc.Driver");

この一文をConnection conn の上の行に挿入

解決
これにより、Javaサーブレット中のdoPostでもDBからデータを取得することに成功しました!感謝!

振り返り教訓、なぜハマったか?
・Java Applicationで実行したときはちゃんとDBと連携できた。その結果を受けてDB周りのコードには不備がないと思い込んだ。
・そもそもJDBCドライバーについての知識がない(メソッドによって必要だったり必要じゃ無かったりする?)
・エラーログを読むという大切さ
・「スッキリわかるサーブレット&JSP入門」の学習にはClass.forName()メソッドが登場しない?ので気をつけよう!(特にmysqlに鞍替えして学習するとき)

投稿2021/03/15 13:54

aki2tyuu

総合スコア2

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問