###前提・実現したいこと
Javaで社員検索アプリケーションを実装しています。
###発生している問題・エラーメッセージ
ログインする際に次のようなエラーが発生します。
説明 The server encountered an internal error that prevented it from fulfilling this request.
例外
java.lang.NullPointerException
bz.action.inaba.UserDAO.selectByIdAndPassword(UserDAO.java:44)
bz.action.LoginServlet.doPost(LoginServlet.java:44)
javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
###該当のソースコード
LoginServlet.java
package bz.action;
import java.io.IOException;
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 javax.servlet.http.HttpSession;
import bz.action.inaba.UserDAO;
/**
- @author AA450
- Servlet implementation class LoginServlet
/
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/*
* @see HttpServlet#doGet(HttpServlet request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException,IOException{
response.setContentType("text/html; charset=UTF-8"); // ログイン画面に遷移する処理を実行 response.sendRedirect("login.jsp"); } /** * @see HttpServlet#doPost(HttpServlet request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ // ログイン画面の入力値を取得する request.setCharacterEncoding("UTF-8"); String id = request.getParameter("id"); String password = request.getParameter("pass"); UserDAO dao = new UserDAO(); // セッションを取得する HttpSession session = request.getSession(false); // ログイン失敗の場合以下の条件を実行 if(!dao.selectByIdAndPassword(id,password)){ // セッションにエラーメッセージを保持する session.setAttribute("error_message", "ログインIDまたはパスワードが間違っています。"); // ログイン画面に転送する doGet(request,response); return; } // エラーメッセージを削除する session.removeAttribute("error_message"); // 従業員一覧サーブレットに転送する request.getRequestDispatcher("empView").forward(request, response); }
}
UserDAO.java
package bz.action.inaba;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import bz.action.DataSourceManager;
/**
- USERテーブルをIDとパスワードで検索する
- <pre>
- 引数(IDとパスワード)で完全一致検索する
- 該当するデータがある場合はtrue,データがない場合はfalseを返す
- </pre>
- @param id ログインID
- @param password パスワード
- @return 検索結果の有無
*/
public class UserDAO extends DataSourceManager {
public boolean selectByIdAndPassword(String id,String password) {
StringBuffer sb = new StringBuffer(); sb.append("select"); sb.append(" COUNT(*) 'COUNT'"); sb.append(" from"); sb.append(" USER"); sb.append(" where"); sb.append(" USER_ID = ?"); sb.append(" and PASSWORD = ?"); try{ PreparedStatement ps = conn.prepareStatement(sb.toString()); ps.setString(1, id); ps.setString(2, password); ResultSet rs = ps.executeQuery(); if(rs.next()){ return rs.getInt("COUNT") == 1; } } catch (SQLException e){ // TODOエラーメッセージを表示する }finally{ try{ conn.close(); } catch (SQLException e) { // TODOエラーメッセージを表示する } } return false; }
}
DataSourceManager.java
package bz.action;
import java.sql.Connection;
import java.sql.SQLException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
public class DataSourceManager {
/*コネクション/
protected Connection conn;
/*コンストラクタ/
public DataSourceManager() {
try{ Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/test"); conn = ds.getConnection(); } catch (NamingException | SQLException e){ } }
}
###試したこと
mysqlとのデータベースの接続に問題があると思ったため、設定内容については確認しました。
eclipseではコード自体にエラー箇所はないと思われます。
###補足情報(言語/FW/ツール等のバージョンなど)
実行環境
開発ツール:eclipse
ローカルサーバー:tomcat
データベース:mysql