社員を登録する際にエラーが起きてしまいます
解決済
回答 1
投稿
- 評価
- クリップ 1
- VIEW 1,186
前提・実現したいこと
私は、JSPとサーブレットで社員を登録するシステムを作っています。
社員登録確認画面まではいくのですが、社員完了画面にいく際に、500エラーが発生してしまいます。
コンソールで原因を調べてみると、DAOのps.setString(7, employee.getDepartment().getDeptId());
というコードでエラーが出ていました。
実現したいことは、社員完了画面までいって社員登録ができていることと、パスワードの表示を・・・・という表示にしたいです。
該当のソースコード
JSP
ソースコード
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>社員登録</title>
</head>
<body>
<h3>社員登録確認画面</h3>
<div class="update">
<div class="form">
<div class="label">パスワード:</div>
<div class="input">${employee.empPass}</div>
</div>
<div class="form">
<div class="label">社員名:</div>
<div class="input">${employee.empName}</div>
</div>
<div class="form">
<div class="label">性別:</div>
<div class="input"><c:choose><c:when test="${employee.gender==1}">男性</c:when>
<c:when test="${employee.gender==2}">女性</c:when>
<c:otherwise> ? </c:otherwise></c:choose></div>
</div>
<div class="form">
<div class="label">住所:</div>
<div class="input">${employee.address}</div>
</div>
<div class="form">
<div class="label">生年月日:</div>
<div class="input">${employee.birthday}</div>
</div>
<div class="form">
<div class="label">権限:</div>
<div class="input"><c:choose><c:when test="${employee.authority==1}">一般</c:when>
<c:when test="${employee.authority==2}">管理者</c:when>
<c:otherwise> ? </c:otherwise></c:choose></div>
</div>
<div class="form">
<div class="label">部署名:</div>
<div class="input">${employee.department.deptName}</div>
</div>
<form action="<%=request.getContextPath()%>/Insert" method="post">
<div class="form">
<div class="label"></div>
<div class="input">
<input type="hidden" name="empPass" value="${employee.empPass}" />
<input type="hidden" name="empName" value="${employee.empName}" />
<input type="hidden" name="gender" value="${employee.gender}" />
<input type="hidden" name="address" value="${employee.address}" />
<input type="hidden" name="birthday" value="${employee.birthday}" />
<input type="hidden" name="authority"value="${employee.authority}" />
<input type="hidden" name="deptName" value="${department.deptId}" />
<input type="submit" value="登録" />
</div>
</div>
</form>
<form action="/servlet_crud/jsp/sample01/regist_input.jsp">
<div class="form">
<div class="label"></div>
<div class="input">
<input type="submit" value="戻る" />
</div>
</div>
</form>
</div>
</div>
</body>
</html>
サーブレット
ソースコード
package jp.co.sss.servlet.regist;
import java.io.IOException;
import java.sql.SQLException;
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 jp.co.sss.crud.bean.Department;
import jp.co.sss.crud.bean.Employee;
import jp.co.sss.crud.db.DepartmentDAO;
import jp.co.sss.crud.db.EmployeeDAO;
@WebServlet("/Insert")
public class Insert extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String empPass = request.getParameter("empPass");
String empName = request.getParameter("empName");
String gender = request.getParameter("gender");
String address = request.getParameter("address");
String birthday = request.getParameter("birthday");
String authority = request.getParameter("authority");
String deptId = request.getParameter("deptId");
Department department = null;
try {
department = DepartmentDAO.findByDepartment(deptId);
} catch (SQLException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
Employee employee = new Employee();
employee.setEmpPass(empPass);
employee.setEmpName(empName);
employee.setGender(gender);
employee.setAddress(address);
employee.setBirthday(birthday);
employee.setAuthority(authority);
employee.setDepartment(department);
EmployeeDAO.insert(employee);
request.getRequestDispatcher("/jsp/sample01/regist_complete.jsp").forward(request, response);
}
}
DAO
ソースコード
package jp.co.sss.crud.db;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import jp.co.sss.crud.bean.Department;
import jp.co.sss.crud.bean.Employee;
public class EmployeeDAO {
/**
- 社員を登録
- @return 社員登録
- @throws SQLException
- データベース操作失敗時に送出
*/
public static void insert(Employee employee) {
Connection con = null;
PreparedStatement ps = null;
try {
con = DBManager.getConnection();
ps = con.prepareStatement("INSERT INTO EMPLOYEE(EMP_PASS,EMP_NAME,"
+ "GENDER,ADDRESS,BIRTHDAY,AUTHORITY,DEPT_ID)VALUES(?, ?, ?, ?, ?, ?, ?)");
ps.setString(1, employee.getEmpPass());
ps.setString(2, employee.getEmpName());
ps.setString(3, employee.getGender());
ps.setString(4, employee.getAddress());
ps.setString(5, employee.getBirthday());
ps.setString(6, employee.getAuthority());
ps.setString(7, employee.getDepartment().getDeptId());
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBManager.close(ps, con);
}
}
}
試したこと
ps.setString(7, employee.getDepartment().getDeptId());のコードを消すと社員完了画面まではいくのですが、社員登録はされませんでした。
また、パスワードの表示もどうしたら・・・・という表示にできるのか分からず、2日間考えたり調べたりしたのですが、解決できなかったので、アドバイス等頂けると大変助かります。
ソースコードが多く、大変ご迷惑だと思いますが、宜しくお願い致します。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
try {
department = DepartmentDAO.findByDepartment(deptId);
} catch (SQLException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
の部分でエラーが出ている場合、スタックトレースをコンソールに出すだけでそのまま処理が継続してしまうので、まずはdepartmentが取得できているときのみ後続処理をするようにしなければ、次の登録処理でもまたエラーが出てしまうでしょう。
サーブレットで実装されているなら少なくとも、
try {
department = DepartmentDAO.findByDepartment(deptId);
} catch (SQLException e) {
throw new ServletException(e);
}
で処理中断をします。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.19%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
y_waiwai
2019/07/28 10:14
エラーメッセージを提示しましょう