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

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

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

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

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

Q&A

2回答

1922閲覧

社員を登録する際にエラーが出てしまいます

Ryo1504

総合スコア8

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

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

0グッド

0クリップ

投稿2019/07/28 23:48

編集2019/07/29 06:46

私は、JSPとサーブレットで社員を登録するシステムを作っています。
社員登録確認画面まではいくのですが、社員完了画面にいく際に、500エラーが発生してしまいます。
コンソールで原因を調べてみると、DAOのps.setString(7, employee.getDepartment().getDeptId());
というコードでエラーが出ていました。
実現したいことは、社員完了画面までいって社員登録ができていることです。

JSP

1<%@ page language="java" contentType="text/html; charset=UTF-8" 2pageEncoding="UTF-8"%> 3<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 4<!DOCTYPE html> 5<html> 6<head> 7<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 8<title>社員登録</title> 9</head> 10<body> 11<h3>社員登録確認画面</h3> 12<div class="update"> 13<div class="form"> 14<div class="label">パスワード:</div> 15<div class="input">${employee.empPass}</div> 16</div> 17<div class="form"> 18<div class="label">社員名:</div> 19<div class="input">${employee.empName}</div> 20</div> 21<div class="form"> 22<div class="label">性別:</div> 23<div class="input"><c:choose><c:when test="${employee.gender==1}">男性</c:when> 24<c:when test="${employee.gender==2}">女性</c:when> 25<c:otherwise> ? </c:otherwise></c:choose></div> 26</div> 27<div class="form"> 28<div class="label">住所:</div> 29<div class="input">${employee.address}</div> 30</div> 31<div class="form"> 32<div class="label">生年月日:</div> 33<div class="input">${employee.birthday}</div> 34</div> 35<div class="form"> 36<div class="label">権限:</div> 37<div class="input"><c:choose><c:when test="${employee.authority==1}">一般</c:when> 38<c:when test="${employee.authority==2}">管理者</c:when> 39<c:otherwise> ? </c:otherwise></c:choose></div> 40</div> 41<div class="form"> 42<div class="label">部署名:</div> 43<div class="input">${employee.department.deptName}</div> 44</div> 45<form action="<%=request.getContextPath()%>/Insert" method="post"> 46<div class="form"> 47<div class="label"></div> 48<div class="input"> 49<input type="hidden" name="empPass" value="${employee.empPass}" /> 50<input type="hidden" name="empName" value="${employee.empName}" /> 51<input type="hidden" name="gender" value="${employee.gender}" /> 52<input type="hidden" name="address" value="${employee.address}" /> 53<input type="hidden" name="birthday" value="${employee.birthday}" /> 54<input type="hidden" name="authority"value="${employee.authority}" /> 55<input type="hidden" name="deptName" value="${department.deptId}" /> 56<input type="submit" value="登録" /> 57</div> 58</div> 59</form> 60<form action="/servlet_crud/jsp/sample01/regist_input.jsp"> 61<div class="form"> 62<div class="label"></div> 63<div class="input"> 64<input type="submit" value="戻る" /> 65</div> 66</div> 67</form> 68</div> 69</div> 70</body> 71</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) { throw new ServletException(e); } 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

1package jp.co.sss.crud.db; 2import java.sql.Connection; 3import java.sql.PreparedStatement; 4import java.sql.ResultSet; 5import java.sql.SQLException; 6import java.util.ArrayList; 7import java.util.List; 8import jp.co.sss.crud.bean.Department; 9import jp.co.sss.crud.bean.Employee; 10public class EmployeeDAO { 11/** 12* 社員を登録 13*   14* @return 社員登録 15* @throws SQLException 16*             データベース操作失敗時に送出 17* */ 18* public static void insert(Employee employee) { 19* Connection con = null; 20* PreparedStatement ps = null; 21try { 22con = DBManager.getConnection(); 23ps = con.prepareStatement("INSERT INTO EMPLOYEE(EMP_PASS,EMP_NAME," 24+ "GENDER,ADDRESS,BIRTHDAY,AUTHORITY,DEPT_ID)VALUES(?, ?, ?, ?, ?, ?, ?)"); 25ps.setString(1, employee.getEmpPass()); 26ps.setString(2, employee.getEmpName()); 27ps.setString(3, employee.getGender()); 28ps.setString(4, employee.getAddress()); 29ps.setString(5, employee.getBirthday()); 30ps.setString(6, employee.getAuthority()); 31ps.setString(7, employee.getDepartment().getDeptId()); 32ps.executeUpdate(); 33} catch (SQLException e) { 34e.printStackTrace(); 35} finally { 36DBManager.close(ps, con); 37} 38}

DepartmentDAO

import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import jp.co.sss.crud.bean.Department; public class DepartmentDAO { /** * 部署情報を部署IDで検索 * * @param genreId * 部署ID * @return 部署情報 * @throws SQLException * データベース操作失敗時に送出 */ public static Department findByDepartment(int deptId) throws SQLException { Department department = null; Connection connection = DBManager.getConnection(); PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM DEPARTMENT WHERE DEPT_ID = ?"); preparedStatement.setInt(1, deptId); ResultSet resultSet = preparedStatement.executeQuery(); if (resultSet.next()) { department = new Department(); department.setDeptId(resultSet.getInt("dept_id")); department.setDeptName(resultSet.getString("dept_name")); } DBManager.close(preparedStatement, connection); return department; } }

HTTPステータス500-というエラーが起き、説明に、The server encountered an internal error that prevented it from fulfilling this request.というのが表示されています。

ps.setString(7, employee.getDepartment().getDeptId());のコードを消すと社員完了画面まではいくのですが、社員登録はされませんでした。
2日間考えたり調べたりしたのですが、解決できなかったので、アドバイス等頂けると大変助かります。
ソースコードが多く、大変ご迷惑だと思いますが、宜しくお願い致します。

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

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

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

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

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

sazi

2019/07/28 23:58

EMPLOYEEのテーブル定義を質問に追記されて下さい。
m.ts10806

2019/07/29 00:09

DBは何でしょうか。
Ryo1504

2019/07/29 00:58

DBのSQL文です。 CREATE TABLE department ( dept_id NUMBER(2) PRIMARY KEY, dept_name VARCHAR2(15 CHAR) NOT NULL ); -- 社員テーブルの作成 CREATE TABLE employee ( emp_id NUMBER(5) PRIMARY KEY, emp_pass VARCHAR2(16 CHAR) NOT NULL, emp_name VARCHAR2(30 CHAR) NOT NULL, gender NUMBER(1) NOT NULL, address VARCHAR(60 CHAR) NOT NULL, birthday DATE NOT NULL, authority NUMBER(1) NOT NULL, dept_id NUMBER(2) NOT NULL REFERENCES department(dept_id) ); -- シーケンスの作成 CREATE SEQUENCE seq_emp NOCACHE;; -- 部署テーブルへのレコード登録 INSERT INTO department VALUES(1, '営業部'); INSERT INTO department VALUES(2, '経理部'); INSERT INTO department VALUES(3, '総務部'); -- 社員テーブルへのレコード登録 INSERT INTO employee VALUES(seq_emp.nextval,'1111','鈴木太郎',1,'東京都','1986/10/12',1,1); INSERT INTO employee VALUES(seq_emp.nextval,'2222','田中二郎',1,'千葉県','1979/07/02',2,2); INSERT INTO employee VALUES(seq_emp.nextval,'3333','渡辺花子',2,'大阪府','1988/04/23',2,2); COMMIT;
m.ts10806

2019/07/29 01:01

質問を編集して追記してください
m.ts10806

2019/07/29 01:02

DBの種類とバージョンも追記いただければと
m.ts10806

2019/07/29 01:14 編集

回答に移行
Ryo1504

2019/07/29 01:49

departmentのdeptidの定義をStringからintに変えて、 setStringもsetIntに変えたのですが、 int deptId = request.getParameter("deptId");のところで、 「型の不一致:Stringからintには変換できません」というエラーがでます。 下記はdepartmentのbeanです。 package jp.co.sss.crud.bean; /** * 部署情報Bean * * @author system_shared */ public class Department { /** 部署ID */ private int deptId; /** 部署名 */ private String deptName; /** * 部署IDを取得 * * @return 部門ID */ public int getDeptId() { return deptId; } /** * 部門IDを保存 * * @param deptId * 部門ID */ public void setDeptId(int deptId) { this.deptId = deptId; } /** * 部門を取得 * * @return 部門名 */ public String getDeptName() { return deptName; } /** * 部門名を保存 * * @param deptName * 部門名 */ public void setDeptName(String deptName) { this.deptName = deptName; } }
m.ts10806

2019/07/29 01:58

そりゃそうなります。 もう少し型の概念をきちんと学んだほうが良いです。
Ryo1504

2019/07/29 02:25

型の概念を復習し、自分なりに考えたのですが、よく分かりませんでした。 大変恐縮ではあるのですが、具体的にどう直せばよいのか教えていただけないでしょうか? 宜しくお願い致します。
guest

回答2

0

employee.getDepartment().getDeptId()が何をしているのか分かりませんが、値が返却されていないのでしょう。

それをコメントにした場合、employeeのdept_idはNot Null制約ですのでエラーが発生して登録されないはずです。

そもそも登録する際にはdept_idは決定されていないとおかしいのではないですか?
なので、作り的には、employee.getDeptId()を指定するんじゃないでしょうか。

投稿2019/07/29 02:33

sazi

総合スコア25173

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

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

Ryo1504

2019/07/29 03:14

アドバイスありがとうございます。 早速試してみたのですが、@WebServlet("/Check")のint deptId = request.getParameter("deptId");で、 「型の不一致:Stringからintには変換できません」というエラーがでます。 deptIdの型はintにはしています。
Ryo1504

2019/07/29 04:08

ありがとうございます。 参考にさせて頂きます。
guest

0

おかしいところはDBの数値型カラムに対してsetString()してるところくらいしか見当たりませんが、departmentのdeptidの定義も確認してください。
数値型におさめるなら変数の定義も数値型にしておくべきですね。

int deptId = request.getParameter("deptId");

入力パラメータは型としては基本的に全て文字列型となります。
ですので、Java側で変数として別の型で受ける場合、適切に変換してあげる必要があります。
検索ワードは「言語名 変換元の型 変換先の型」です。

投稿2019/07/29 01:15

編集2019/07/29 02:27
m.ts10806

総合スコア80850

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

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

Ryo1504

2019/07/29 03:22

アドバイスありがとうございます。 deptIdに関するコードの型は全てintにしたのですが、どうしても、int deptId = request.getParameter("deptId");のところで、「型の不一致:Stringからintには変換できません」というエラーがでてしまいます。 下記はdepartmentのDAOです。 package jp.co.sss.crud.db; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import jp.co.sss.crud.bean.Department; public class DepartmentDAO { /** * 部署情報を部署IDで検索 * * @param genreId * 部署ID * @return 部署情報 * @throws SQLException * データベース操作失敗時に送出 */ public static Department findByDepartment(int deptId) throws SQLException { Department department = null; Connection connection = DBManager.getConnection(); PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM DEPARTMENT WHERE DEPT_ID = ?"); preparedStatement.setInt(1, deptId); ResultSet resultSet = preparedStatement.executeQuery(); if (resultSet.next()) { department = new Department(); department.setDeptId(resultSet.getInt("dept_id")); department.setDeptName(resultSet.getString("dept_name")); } DBManager.close(preparedStatement, connection); return department; } }
m.ts10806

2019/07/29 03:23

「変換してあげる必要がある」と追記した部分をもとに調べてみましたか?
Ryo1504

2019/07/29 03:36

調べましたが、よく分かりませんでした。 大変恐縮ではあるのですが、変換の仕方について具体的にどう直せばよいのか教えていただけないでしょうか? 宜しくお願い致します。
m.ts10806

2019/07/29 03:38

参考にした記事はどれでしょう? 「java 文字 数値」で私が意図している情報は割と沢山出てきます。
Ryo1504

2019/07/29 04:04

自分で調べてString deptId = String.valueOf(deptId);というふうに書いてみたのですが、 それだと、department = DepartmentDAO.findByDepartment(deptId);のところで、 「型 DepartmentDAO のメソッド findByDepartment(int) は引数 (String) に適用できません」というエラーがでてしまいました。 アドバイスお願い致します。
m.ts10806

2019/07/29 04:10

参考にした記事はどれでしょう? 「文字列を数値に変換しなければならない」ということは理解されてますか?
m.ts10806

2019/07/29 04:32

いえ。そこは型の概念です。 変数宣言の時に型を宣言するかと思いますが、入れようとしている情報が宣言した型と違うと変数に値として設定できないから変換が必要になります。
m.ts10806

2019/07/29 04:33

>参考にした記事です。 それsaziさんから提示された記事では。 私が教えてほしいのはRyo1504さんがどういう風に調べ、何を参考にしたか、ですよ。 その方向性を知ることでアドバイスの方向性が変わります。 きちんと探すことができれば質問することなく自己解決でガンガン進めるようになるからです。
m.ts10806

2019/07/29 05:04 編集

Stringで宣言したdeptIdを別の型(int)で宣言したからでは。
m.ts10806

2019/07/29 05:06

IDEで開発していたら実行しなくてもエラー出そうに思います。 NG: String deptId = "1"; int deptId = Integer.parseInt(deptId); エラー: variable deptId is already defined in~~~ OK: String deptIdstr = "1"; int deptId = Integer.parseInt(deptIdstr);
Ryo1504

2019/07/29 05:20

String deptIdstr = "1"; int deptId = Integer.parseInt(deptIdstr);を書いてみると、エラーはなくなったのですが、実行するとエラーがでてしまいました。 500エラー type 例外レポート メッセージ 説明 The server encountered an internal error that prevented it from fulfilling this request. 例外 java.lang.NullPointerException jp.co.sss.crud.db.EmployeeDAO.insert(EmployeeDAO.java:162) jp.co.sss.servlet.regist.Insert.doPost(Insert.java:46) 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) jp.co.sss.crud.filter.EncodingFilter.doFilter(EncodingFilter.java:25) やはり、EmployeeDAOのps.setInt(7, employee.getDeptId());というコードの処理を考えなければならないと思うのですが、なせ処理されないのかが分かりません。 アドバイスお願い致します。
m.ts10806

2019/07/29 05:24

> やはり、EmployeeDAOのps.setInt(7, employee.getDeptId());というコードの処理を考えなければならないと思うのですが はいもともとそれにつながるアドバイスをしています。 結局employeeのdeptIdはint型になったのでしょうか。 saziさんが仰っているようにnullになっているとかはないのでしょうか。 いずれにしてこれ以上は、 DepartmentDAO.findByDepartment()のコードが提示されていないと他者から言えることはないと思います
m.ts10806

2019/07/29 05:25

いずれにしても地道にデバッグするしかないとも思います。
Ryo1504

2019/07/29 05:30

employeeのdeptIdはbeanでint型と宣言しました。 下記はDepartmentDAOのコードです。 package jp.co.sss.crud.db; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import jp.co.sss.crud.bean.Department; public class DepartmentDAO { /** * 部署情報を部署IDで検索 * * @param genreId * 部署ID * @return 部署情報 * @throws SQLException * データベース操作失敗時に送出 */ public static Department findByDepartment(int deptId) throws SQLException { Department department = null; Connection connection = DBManager.getConnection(); PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM DEPARTMENT WHERE DEPT_ID = ?"); preparedStatement.setInt(1, deptId); ResultSet resultSet = preparedStatement.executeQuery(); if (resultSet.next()) { department = new Department(); department.setDeptId(resultSet.getInt("dept_id")); department.setDeptName(resultSet.getString("dept_name")); } DBManager.close(preparedStatement, connection); return department; } }
m.ts10806

2019/07/29 05:32

こちらに書かれても全員の目につくわけではないので、 質問要件につながる情報は全て質問本文に追記してください。 あと、「確実にデータが設定されているか」もデバッグしてください。
Ryo1504

2019/07/29 05:38

分かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問