DBへの接続がうまくいかない
解決したいこと
POSTをした際に想定しているJSPを表示したい
例)
Javaのサーブレットでログイン機能を実装しております。
データベースにあらかじめ入っているデータとログインページで入力されたものが一致した場合にログインが成功した旨のJSPを表示する仕組みを想定しております。
現在、入力フォームにデータベースに入っている内容と同じものをPOSTするとエラーメッセージにIndex 0 out of bounds for length 0とでてしまいます。
どうか解決方法を教えて下さい。
発生している問題・エラー
エラーメッセージにあるservlet.LoginServlet.doPost(LoginServlet.java:43)は
下記のLoginServlet.javaの
String login_pass = login.get(0).getPassword(); を指しております。
該当するソースコード
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で記載
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の接続の情報は間違っていませんが接続がうまくいっておりません
#managementsystem_dbをmysqlから接続する情報
url=jdbc:mysql://localhost:3306/managementsystem_db
user=root
password=""