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

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

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

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

Q&A

解決済

1回答

2002閲覧

java.lang.ClassNotFoundException: org.postgresql.Driverのエラーコードの解決方法を教えて頂きたいです

nanashinogombee

総合スコア1

Java

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

0グッド

1クリップ

投稿2022/09/02 10:52

編集2022/09/02 10:57
javaで管理システムを作ります。 どうしても分からないので教えて頂きたいです。 SQLのテーブル名employee_table カラム名は ・id ・password ・name ・comment ・login_time あらかじめ、("09090","admin","nanaumishinya","javaman")が入っています。 HTMLの入力画面からid:09090とpassword:adminと入力されると、 ユーザーのnameとcommentとlogin_timeが表示されるようにしたいのですが、 以下のようなエラーが出てしまっていて解決できません。 EmployeeServiceのコードがおかしいのかと思っています。 どこが間違いなのか教えて頂きたいです。     

エラーメッセージ

java.lang.ClassNotFoundException: org.postgresql.Driver at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1401) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1224) at java.base/java.lang.Class.forName0(Native Method) at java.base/java.lang.Class.forName(Class.java:375) at service.EmployeeService.search(EmployeeService.java:53) at controller.EmployeeController.doPost(EmployeeController.java:41) at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:689) at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:770) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:223) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:543) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:353) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:870) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1696) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.base/java.lang.Thread.run(Thread.java:831)

ソースコード

package service; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.text.SimpleDateFormat; import java.util.Calendar; import bean.EmployeeBean; public class EmployeeService { /** ドライバーのクラス名 */ private static final String POSTGRES_DRIVER = "org.postgresql.Driver"; /** ・JDMC接続先情報 */ private static final String JDBC_CONNECTION = "jdbc:postgresql://localhost:5432/Employee"; /** ・ユーザー名 */ private static final String USER = "postgres"; /** ・パスワード */ private static final String PASS = "postgres"; /** ・タイムフォーマット */ private static final String TIME_FORMAT = "yyyy/MM/dd HH:mm:ss"; // 入力されたIDを条件にログイン時間を更新するUPDATE文 /** ・SQL UPDATE文 */ private static final String SQL_UPDATE = "UPDATE EMPLOYEE_TABLE SET LOGIN_TIME = ? WHERE ID = ?"; // 入力されたIDとPassWordを条件と合致するデータを検索するSELECT文 /** ・SQL SELECT文 */ private static final String SQL_SELECT = "SELECT * FROM EMPLOYEE_TABLE WHERE ID = ? AND PASSWORD = ?; "; EmployeeBean employeeData = null; // 送信されたIDとPassWordを元に社員情報を検索するためのメソッド public EmployeeBean search(String id, String password) { Connection connection = null; Statement statement = null; ResultSet resultSet = null; PreparedStatement preparedStatement = null; try { Class.forName(POSTGRES_DRIVER); connection = DriverManager.getConnection(JDBC_CONNECTION, USER, PASS); // getConnection()で例外発生 statement = connection.createStatement(); // 処理が流れた時間をフォーマットに合わせて生成 Calendar cal = Calendar.getInstance(); SimpleDateFormat sdFormat = new SimpleDateFormat(TIME_FORMAT); // PreparedStatementで使用するため、String型に変換 String login_time = sdFormat.format(cal.getTime()); /* * 任意のユーザーのログインタイムを更新できるように、プリペアドステートメントを記述。 */ // preparedStatementに実行したいSQLを格納 preparedStatement = connection.prepareStatement(SQL_UPDATE); //preparedStatementを使って、第一引数に現在時刻を、第二引数にIDをセット preparedStatement.setString(1, login_time); preparedStatement.setString(2, id); //UPDATEを実行する文 preparedStatement.executeUpdate(); /* * UPDATEが成功したものを即座に表示 任意のユーザーを検索できるように、プリペアドステートメントを記述。 */ preparedStatement = connection.prepareStatement(SQL_SELECT); // preparedStatementを使って、第一引数にIDを、第二引数にPASSWORDをセット preparedStatement.setString(1, id); preparedStatement.setString(2, password); // SQLを実行。実行した結果をresultSetに格納。 resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { // tmpName,tmpComment,tmpLoginTimeに適当なデータを格納 String tmpName = resultSet.getString("name"); String tmpComment = resultSet.getString("comment"); String tmpLoginTime = resultSet.getString("login_time"); // EmployeeBeanに⑦で取得したデータを格納 EmployeeBean employeeData = new EmployeeBean(); employeeData.setName(tmpName); employeeData.setComment(tmpComment); employeeData.setLogin_Time(tmpLoginTime); } // forName()で例外発生 } catch (ClassNotFoundException e) { e.printStackTrace(); // getConnection()、createStatement()、executeQuery()で例外発生 } catch (SQLException e) { e.printStackTrace(); } finally { try { if (resultSet != null) { resultSet.close(); } if (statement != null) { statement.close(); } if (connection != null) { connection.close(); } } catch (SQLException e) { e.printStackTrace(); } } return employeeData; } }

ソースコード

package bean; public class EmployeeBean { private String Id; private String PassWord; private String Name; private String Comment; private String Login_Time; public void setId(String Id) { this.Id = Id; } public String Id() { return Id; } public void setPassWord(String PassWord) { this.PassWord = PassWord; } public String getPassWord() { return PassWord; } public void setName(String Name) { this.Name = Name; } public String getName() { return Name; } public void setLogin_Time(String Login_Time) { this.Login_Time = Login_Time; } public String getLogin_Time() { return Login_Time; } public void setComment(String Comment) { this.Comment = Comment; } public String getComment() { return Comment; } }

ソースコード

package controller; import java.io.IOException; import bean.EmployeeBean; import jakarta.servlet.RequestDispatcher; import jakarta.servlet.ServletContext; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import service.EmployeeService; public class EmployeeController extends HttpServlet { @Override public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { // index.htmlから送信されたIDとPassWordの値を取得 String id = request.getParameter("id"); String password = request.getParameter("pass"); System.out.println(password); /* * IDとPassWordと元に、社員情報を検索する関数の呼び出し、結果をJSPに渡す処理 ※ * EmployeeBeanとEmployeeServiceをimportするのを忘れないでください。 */ // EmployeeServiceクラスをインスタンス化 EmployeeService eys = new EmployeeService(); //EmployeeBeanに、EmployeeServiceよりsearch関数を呼び出し、返り値を格納 EmployeeBean empData = eys.search(id, password); // 適切な引数をセット。 request.setAttribute("EmployeeBean", empData); } catch (Exception e) { e.printStackTrace(); } finally { ServletContext context = this.getServletContext(); RequestDispatcher dispatcher = context.getRequestDispatcher("/index.jsp"); dispatcher.forward(request, response); } } }

ソースコード

<%@page import="service.EmployeeService"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="bean.EmployeeBean"%> <%@ page import="controller.EmployeeController"%> <% // getAttributeに適切な引数をセットして、EmployeeControllerから渡されたEmployeeBeanを取得 EmployeeBean employeeBean = (EmployeeBean) request.getAttribute("EmployeeBean"); %> <!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>検索結果</title> </head> <body> <div align="center"> <!-- 検索が成功した場合の表示 --> <% if (employeeBean != null) { %> <table border="1"> <tr> <th>社員名</th> <td><%=employeeBean.getName()%></td> </tr> <tr> <th>コメント</th> <td><%=employeeBean.getComment()%></td> </tr> <tr> <th>ログインタイム</th> <td><%=employeeBean.getLogin_Time()%></td> </tr> </table> <!-- 問② それ以外の表示(エラーの場合)--> <% }else { %> <p>IDもしくはパスワードが間違っています</p> <% } %> </div> </body> </html> ### 試したこと ドライバーの接続情報が間違っていると思ったのですが、他のファイルで試してみると接続できていたので間違っていないと思います。 jarファイルのパスも通しています。 SQL文も間違っていないようなので、本当にどこが間違っているのか分からないです

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

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

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

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

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

jimbe

2022/09/02 11:08

日本語による説明がコードのマークダウン内のようにならないようにしてください。 コードのマークダウン内になってしまうと開閉やスクロール等でとても読み難くなってしまいます。 また、コードはそれぞれに何のコードなのか、言語名やファイル名等を付加してください。全て「ソースコード」ではテキトウ過ぎます。 なお、JDBC ドライバのクラスが読めないというエラーは FAQ なみによくあることで、ネットにも teratail にも情報があります。それらを検索等されていないのでしょうか。
m.ts10806

2022/09/02 11:47

ドライバはどこに置いてるんでしょう。 どのようにパスを通しているのでしょう。
guest

回答1

0

ベストアンサー

実行時のクラスパスにPostgreSQLのドライバが含まれていません。クラスパスにドライバを配置しましょう。
ビルド時、テスト時のクラスパスの設定を揃えるにはMavenやGradleを使うと不整合が生じるのを防ぐことができますのでお勧めです。

投稿2022/09/02 12:52

yusukey

総合スコア51

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

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

nanashinogombee

2022/09/03 06:15

ご回答ありがとうございます。 フォルダに入れるだけではなくクラスパスにも追加しないといけなかったことを気付けました。 で、前回のエラーは実行してみると消えたのですが、 以下のエラーが出ました。。 重大: パス[/SC3-A]を持つコンテキスト内のサーブレット[search]のServlet.service() が例外[サーブレットの実行により例外を投げました]が根本的要因と共に投げられました。 調べてみてもいまいちよく分からなかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問