初学者です。よろしくお願いいたします。
jsp画面で一覧表示したListから、form post送信でデータを選択したものを dao sqlで抽出したいのですが、サーブレットで取得したidパラメータが0になってしまい、抽出表示画面ではデータがnullとなります。
質問に対する追記・変更
変更:一覧表示jsp form のname="id"と訂正し、servletでidをInteger.parseIntに戻しました。
id=5と数字が入るようになりました。ご指摘ありがとうございました。
次に、以下のような警告が出ました。
org.postgresql.util.PSQLException: 適切な位置にいない ResultSetです。おそらく、nextを呼ぶ必要があります。
変更:エラーメッセージが rs.next();の行を示していたので、if(rs.next()){ }と書き換えました。
警告は消えましたが、抽出したいデータ cName,address,tel_numberはnullのままです。
基礎が甘く、多方面で調べたコードを参考にしており、統一性がなく読みづらいコードで申し訳ありません。
java
eclipse
postgresql
tomcat
jsp
--- <%List<Customer>customerList=(List<Customer>)session.getAttribute("customerList"); %> --- <%for(Customer cs : customerList){ %> <form action="/Sukkiri/ShowServlet" method="post"> <td><input type="submit" **name=" id"** value="<%=cs.getId()%>"></td> </form> --
dao
public Customer select_customer(int myId) { Customer customer=new Customer(); try { Class.forName("org.postgresql.Driver"); } catch (Exception e) { e.printStackTrace(); } //データベース接続 try (Connection conn = DriverManager.getConnection(JDBC_URL,DB_USER,DB_PASS)){ //SELECT文の準備 String sql= "SELECT * FROM CUSTOMER WHERE ID=?"; PreparedStatement pStmt= conn.prepareStatement(sql); conn.setAutoCommit(false); pStmt.setInt(1, myId); //SELECT文を実行 ResultSet rs=pStmt.executeQuery(); //SELECT文の結果をcustomerに格納 **if(rs.next());{** int id=myId; String cName=rs.getString("cName"); String address=rs.getString("address"); String tel_number=rs.getString("tel_number"); customer = new Customer(id,cName,address,tel_number); **}** }catch(SQLException e){ e.printStackTrace(); } return customer; }
servlet
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); int id=0; Customer customer=new Customer(); UpdateDao dao = new UpdateDao(); Customer oneCustomer =dao.select_customer(id); **id=Integer.parseInt(request.getParameter("id"));** String cName =request.getParameter("cName"); String address=request.getParameter("address"); String tel_number=request.getParameter("tel_number"); System.out.println(id+cName+address+tel_number); ** //ここで出力結果が(5 null null null)になります。** request.setAttribute("oneCustomer", oneCustomer); RequestDispatcher dispatcher=request.getRequestDispatcher("/WEB-INF/jsp/show.jsp"); dispatcher.forward(request, response); }
jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import ="java.util.List" %> <% //request scope data Customer oneCustomer =(Customer)request.getAttribute("oneCustomer"); %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>顧客詳細</title> </head> <body> <div class="mx-auto" style="width:300px"> <h1 class = "mb-3" style="text-align:center">顧客詳細</h1> <form action="/Sukkiri/UpdateServlet" method="post"> <div class="mb-3"> <%=oneCustomer.getId() %> <label for="customercName" class="form-label">お客様名</label> <input type="text" class="form-control" id="cName" name="cName" placeholder=<%=oneCustomer.getCname() %>> </div> <div class="mb-3"> <label for="customerAddress" class="form-label">住所</label> <input type="text" class="form-control" id="address" name="address" placeholder=<%= oneCustomer.getAddress()%>> </div> <div class="mb-3"> <label for="customerTel" class="form-label">電話番号</label> <input type="text" class="form-control" id="tel_number" name="tel_number" placeholder=<%=oneCustomer.getTel_number()%>> </div> <a href='UpdateServlet?id=<%=oneCustomer.getId()%>'>編集する</a> <a href='DestroyServlet?id=<%=oneCustomer.getId()%>'>削除する</a> </form> <a href='ShowServlet?id=<%=oneCustomer.getId()%>'>CANCEL</a> <div style="text-align:center;"> </div> </div> <a href="/Sukkiri/ListServlet"/>顧客管理一覧</a> </body> </html>
例外
servletにてInteger.parseInt使用時に出たエラー
TTPステータス 500 – Internal Server Error タイプ 例外報告 メッセージ Cannot parse null string 説明 サーバーは予期しない条件に遭遇しました。それはリクエストの実行を妨げます。 例外 java.lang.NumberFormatException: Cannot parse null string java.base/java.lang.Integer.parseInt(Integer.java:630) java.base/java.lang.Integer.parseInt(Integer.java:786) servlet.ShowServlet.doPost(ShowServlet.java:48) javax.servlet.http.HttpServlet.service(HttpServlet.java:681) javax.servlet.http.HttpServlet.service(HttpServlet.java:764) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) 注意 原因のすべてのスタックトレースは、サーバのログに記録されています
model
package model; public class Customer { private int id; private String cName; private String address; private String tel_number; public Customer() {} public Customer(String cName,String address,String tel_number) { this.cName=cName; this.address=address; this.tel_number=tel_number;} public Customer(int id,String cName,String address,String tel_number) { this.id=id; this.cName=cName; this.address=address; this.tel_number=tel_number; } public int getId() {return id;} public void setId(int id) {this.id =id;} public String getCname() {return cName;} public void setCname(String cName) {this.cName = cName;} public String getAddress() {return address;} public void setAddress(String address) {this.address = address;} public String getTel_number() {return tel_number;} public void setTel_number(String tel_number) {this.tel_number = tel_number;} }
回答1件
あなたの回答
tips
プレビュー