前提・実現したいこと
初心者です
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; }
スタンドアロンの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();の返り値で上書きされてしまうので。
ご回答ありがとうございます
指摘していただいきましたlistの件、直してみます!ありがとうございます!
エラー確認後だめだったら環境構築を全部1からやり直してみます
解決しました!ありがとうございます!!全てを消す前に間に合いました!
ご指摘のとうり、エラー出力を追っていきましたら
「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()メソッドが登場しない?ので気をつけよう!
ということで、助かりました!ありがとうございます!
ご自身で追及し、解決できてよかったです。上記の原因と解決策を自己回答として投稿し、質問を閉じてください。後に同じような問題で困った方の解決の一助になり得ます。
初めてのサイト利用で助けていただけてなんだか感慨深いです
ありがとうございました!
回答1件
あなたの回答
tips
プレビュー