前提・実現したいこと
現在JSP・サーブレットを使用してブラウザ上からDBの操作をできるプログラムを作成しております。
その際にうまく値渡しができておらず、こちらの原因や解決方法につきましてご教示いただけますと幸いです。
発生している問題・エラーメッセージ
DBのテーブルとして従業員テーブル(EMPLOYEE)・部署テーブル(DEPARTMENT)が存在し、各カラムは以下のようになっております。
部署テーブル
部署ID | 部署名 |
---|---|
主キー |
従業員テーブル
|社員ID|社員名|社員名カナ|メールアドレス|パスワード|部署ID|
|:--|:--:|--:|
|主キー|||||部署テーブルの外部キー|
従業員テーブル操作画面にて検索を行う際に、部署テーブルから部署IDを取得して、条件検索用の検索バーに部署IDをOPTIONで選択できるようにしたいと考えているのですが、その取得がうまくできないという状態になっております。
該当のソースコード
EmpPreSearchServlet.java
package servlet; 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 javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class EmpPreSearchServlet extends HttpServlet{ Connection conn = null; PreparedStatement ps = null; ResultSet result = null; String user = "suser"; String password = "spass"; String url = "jdbc:mysql://localhost:3306/shaindb?autoReconnect=true&useSSL=false"; protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{ req.setCharacterEncoding("UTF-8"); try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection(url, user, password); String sql = "select * from department"; ps = conn.prepareStatement(sql); ps.execute(); result = ps.executeQuery(); req.setAttribute("emp_preResult", result); //サーブレット上で値が取れているかの確認用→こちらは問題なし while(result.next()) { System.out.println(result.getString(1)); System.out.println(result.getString(2)); } //確認ここまで req.getRequestDispatcher("emp_search.jsp").forward(req, res); } catch(Exception e) { e.printStackTrace(); } finally { try { conn.close(); } catch (SQLException e) { System.out.println("MySQLのクローズに失敗しました。"); } } } }
emp_home.jsp
<!-- 省略 --> <div class="mode-all-buttons"> <div class="mode-buttons"> <div class="mode-button"> <form action="empPreSearchResult" method="post">//ここからemp_search.jspに飛んだ時に、 <input type="submit" class="btn btn-primary btn-lg" value="検索"> </form> </div> <div class="mode-button"> <button type="button" class="btn btn-primary btn-lg" onclick="location.href='emp_add.jsp'" >登録</button> </div> <div class="mode-button"> <button type="button" class="btn btn-primary btn-lg" onclick="location.href='emp_update.jsp'">更新</button> </div> <div class="mode-button"> <button type="button" class="btn btn-primary btn-lg" onclick="location.href='emp_delete.jsp'" >削除</button> </div> </div> </div> <!-- 省略 -->
emp_search.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@page import="java.sql.*"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <link rel="stylesheet" href="css/common.css"> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script> <title>社員検索</title> </head> <body> <jsp:include page="template/header.jsp"/> <div class="container"> <h2>社員検索</h2> <div class="input-form"> <form action="empSearchResult" method="post"> <table class="input-form-table"> <tr> <td>社員ID</td> <td><input type="text" name="id_emp" maxlength='10' placeholder="社員ID(半角数字)"></td> </tr> <tr> <td>社員名</td> <td><input type="text" name="name" maxlength='50' placeholder="社員名"></td> </tr> <tr> <td>社員名カナ</td> <td><input type="text" name="kn_name" maxlength='50' placeholder="社員名のカタカナ(全角カナ)"></td> </tr> <tr> <td>メールアドレス</td> <td><input type="text" name="mail" maxlength='100' placeholder="メールアドレス"></td> </tr> <tr> <td>パスワード</td> <td><input type="text" name="pass" maxlength='15' placeholder="パスワード(半角英数字)"></td> </tr> <tr> <% ResultSet preResult = (ResultSet)request.getAttribute("emp_preResult"); %> <td>部署</td> <td> <input type="text" name="id_dept" list="dept" maxlength='10' placeholder="部署ID(半角数字)" autocomplete="off"> <datalist id="dept"> <% if(preResult != null){ %> <% while(preResult.next()) { %> <option value="<%=preResult.getString(1) %>"><%=preResult.getString(2) %> <%} %> <%} %> </datalist> </td> </tr> </table> <div class="submit-button text-center"> <input type="hidden" value="search" name="searchMode"> <input type="submit" value="検索" > </div> </form> </div> <!-- JSP上でサーブレットから渡された値が取得できているかの確認用→値が取得できていない --> <% if(preResult != null){ %> <table class="table search-result-table"> <thead> <tr> <th>部署ID</th> <th>部署名</th> </tr> </thead> <% while(preResult.next()) {%> <tr> <td><%=preResult.getString(1)%></td> <td><%=preResult.getString(2)%></td> </tr> <%} %> </table> <%} %> <!-- 確認ここまで --> <% ResultSet result = (ResultSet)request.getAttribute("emp_result"); %> <% if(result != null){ %> <table class="table search-result-table"> <thead> <tr> <th>社員ID</th> <th>社員名</th> <th>社員名カナ</th> <th>メールアドレス</th> <th>パスワード</th> <th>部署ID</th> </tr> </thead> <% while(result.next()) {%> <tr> <td><%=result.getString(1)%></td> <td><%=result.getString(2)%></td> <td><%=result.getString(3)%></td> <td><%=result.getString(4)%></td> <td><%=result.getString(5)%></td> <td><%=result.getString(6)%></td> </tr> <%} %> </table> <%} %> </div> </body> </html>
試したこと
まずサーブレット上で値が取得できているかの確認をしました。
EmpPreSearchServlet.java
while(result.next()) { System.out.println(result.getString(1));//部署ID System.out.println(result.getString(2));//部署名 }
こちらは想定通り、コンソール上に部署IDと部署名が表示されました。
続いて、JSPで出力できるかどうかの確認をしました。
<% if(preResult != null){ %> <table class="table search-result-table"> <thead> <tr> <th>部署ID</th> <th>部署名</th> </tr> </thead> <% while(preResult.next()) {%> <tr> <td><%=preResult.getString(1)%></td> <td><%=preResult.getString(2)%></td> </tr> <%} %> </table> <%} %>
こちらについては、tdには何も表示されないという状態でした。
そのため、値渡しができていないことまでは理解できているのですが、フォームを使った検索機能については同様のロジックではあるものの、正常に値渡しができているため、原因がわからない状態になっております。
長文申し訳ございませんが、ご教示いただけますと幸いです。
回答1件
あなたの回答
tips
プレビュー