erenyaaayger
@erenyaaayger (izuku midoriya)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

DBへの接続がうまくいかない

解決したいこと

POSTをした際に想定しているJSPを表示したい

例)
Javaのサーブレットでログイン機能を実装しております。
データベースにあらかじめ入っているデータとログインページで入力されたものが一致した場合にログインが成功した旨のJSPを表示する仕組みを想定しております。
現在、入力フォームにデータベースに入っている内容と同じものをPOSTするとエラーメッセージにIndex 0 out of bounds for length 0とでてしまいます。
どうか解決方法を教えて下さい。

発生している問題・エラー

スクリーンショット 2022-09-01 120154.png

エラーメッセージにあるservlet.LoginServlet.doPost(LoginServlet.java:43)は
下記のLoginServlet.javaの
String login_pass = login.get(0).getPassword(); を指しております。

該当するソースコード

LoginServlet.java
package servlet;

import java.io.IOException;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import dao.SqlDao;
import dto.LoginUser;

/**
 * Servlet implementation class LoginServlet
 */
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
   //ログイン画面の表示処理
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {		
		RequestDispatcher dispatcher = request.getRequestDispatcher("WEB-INF/jsp/login.jsp");
		dispatcher.forward(request, response);
	}
	
   //ログイン認証のメインロジック
   protected void doPost(HttpServletRequest request , HttpServletResponse response) throws ServletException,IOException{
	   //文字コードの設定
	   response.setContentType("text/html; charset=UTF-8");
	   request.setCharacterEncoding("UTF-8");
	   
	   //ログイン画面で入力された値を取得
	   String user = request.getParameter("user_name");
	   String password = request.getParameter("password");
	   
	   SqlDao sql = new SqlDao();
	   List <LoginUser> login = sql.check(user,password);
	   
	   String login_user = login.get(0).getName();
	   String login_pass = login.get(0).getPassword();
	   
	   if(user.equals(login_user) && password.equals(login_pass)) {
		   //ログイン成功→次の画面へ
		   RequestDispatcher dispatcher = request.getRequestDispatcher("WEB-INF/jsp/customer_list.jsp");
		   dispatcher.forward(request, response);
	   }else {
		   //ログイン失敗→ログイン画面へ戻る
		   RequestDispatcher dispatcher = request.getRequestDispatcher("WEB-INF/jsp/login.jsp");
		   dispatcher.forward(request, response);
	   }
   }
	
}

checkメソッドの内容は以下SqlDao.javaで記載

SqlDao.java
package dao;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import config.DBconfig;
import dto.LoginUser;

//アクセスロジック(DAO)
public class SqlDao {
		//DBconfig.propertiesのフルパス
		public final String file_path = "C:/pleiades/2022-06/workspace/ManagementSystem/DBconfig.properties";
		//DBconfigのオブジェクト生成
		DBconfig config = new DBconfig();
		
		//ログイン認証のメソッド
		public List<LoginUser> check(String user,String password)throws IOException{
			//DBconfig.propertiesの各値をlist形式で取得
			String[] DbInfo = config.getDBinfo(file_path);
			
			//DBconfig.propertiesのurlを取得
			String url = DbInfo[0];
			//DBconfig.propertiesのuserを取得
			String db_user_name = DbInfo[1];
			//DBconfig.propertiesのpasswordを取得
			String db_password = DbInfo[2];
			
			//login_user_tbのうち指定されたnameかつpasswordのものを検索するSQL文
			String sql = "select * from login_user_tb" + "where name = ? and password = ?";
			
			//ログインユーザのオブジェクト生成(DTO)
			LoginUser login_user = new LoginUser();
			List<LoginUser> user_info = new ArrayList<LoginUser>();
			
			
			try{
				  Class.forName("com.mysql.cj.jdbc.Driver");
		        } catch (ClassNotFoundException e){
		          throw new IllegalStateException("失敗しました。");
		     }
			
			//データベースへの接続
			try(Connection conn = DriverManager.getConnection(url,db_user_name,db_password)){
				PreparedStatement stmt = conn.prepareStatement(sql);
				//変数sqlの1番目の?に引数のuserをセットする
				stmt.setString(1,user);
				//変数sqlの2番目の?に引数のpasswordをセットする
				stmt.setString(2,password);
				//sqlを実行し該当するデータを格納
				ResultSet rs = stmt.executeQuery();
				
				if(rs.next()) {
					login_user.setId(rs.getInt("id"));
					login_user.setName(rs.getString("name"));
					login_user.setPassword(rs.getString("password"));
					user_info.add(login_user);
				} else {
					login_user.setName("No user");
					login_user.setPassword("Not match password");
					user_info.add(login_user);
				}
			}catch (SQLException e) {
				e.printStackTrace();
			}
			return user_info;
		}
}

LoginUser.javaでID,Name,Passwordのgetterとsetterを書いております。

自分で試したこと

ここに問題・エラーに対して試したことを記載してください。
Index out of bounds系のエラーなので
SqlDao.javaの
List user_info = new ArrayList();にきちんとデータが入れられていないのかとは思いましたが、なぜそうなってしまったか原因が突き止められませんでした。。

どうかご教示いただきますよう、お願いいたします。

追記:エラーの原因が特定できました。

どうやらDBへの接続ができてないことがわかりました。

java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
	at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
	at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:828)
	at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:448)
	at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:241)
	at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198)
	at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:681)
	at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:229)
	at dao.SqlDao.check(SqlDao.java:49)
	at servlet.LoginServlet.doPost(LoginServlet.java:40)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:681)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:687)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1787)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.base/java.lang.Thread.run(Thread.java:833)
重大: サーブレット [servlet.LoginServlet] のServlet.service()が例外を投げました

DBの接続の情報は間違っていませんが接続がうまくいっておりません

DBcongig.properties
#managementsystem_dbをmysqlから接続する情報

url=jdbc:mysql://localhost:3306/managementsystem_db
user=root
password=""
0

2Answer

check() メソッドで user_info が空になるのはデータベースへの接続が失敗して catch 節に入ったときだけです。 e.printStackTrace(); が出しているログを確認するか、エラーを再スローするように変えてエラー画面で確認するとよさそうです。

1Like

Comments

  1. @erenyaaayger

    Questioner

    ご回答ありがとうございます。原因は@uasi様ご指摘の通りエラー原因はDBへの接続が失敗していることがわかりました。
    しかしながら、DBへの接続するためのURL、ユーザー名、パスワードはあっているはずなのに接続ができず悩んでおります。。
password=""

なのが気になります。こちらは単にパスワードをマスクしたものでしょうか。

一旦設定ファイルではなく、ソースコードに直接接続情報を書いてみてはいかがでしょうか。

//DBconfig.propertiesのurlを取得
String url = "jdbc:mysql://localhost:3306/managementsystem_db";
//DBconfig.propertiesのuserを取得
String db_user_name = "root";
//DBconfig.propertiesのpasswordを取得
// TODO: 書き換える
String db_password = "xxxxxx";

余談ですが、

String sql = "select * from login_user_tb" + "where name = ? and password = ?";

login_user_tbの後にスペースが必要です。

0Like

Your answer might help someone💌