今javaの勉強をしていて商品管理のシステムを作っています。
追加ボタンを押すと商品がリストに追加され、それが表示されるという処理をしています。
追加ボタンを押すたびにリストが初期化されてしまう状況です。
何かアドバイスいただけると幸いです。
よろしくお願いします。
サーブレット
package Section3; import java.io.IOException; import java.util.ArrayList; import java.util.List; import DAO.SalesSearchDAO; import bean.Product; import jakarta.servlet.RequestDispatcher; import jakarta.servlet.ServletContext; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; @WebServlet("/AddSalesServlet") public class AddSalesServlet extends HttpServlet{ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String code = request.getParameter("product_inf"); int quantity = Integer.parseInt(request.getParameter("quantity")); SalesSearchDAO dao = new SalesSearchDAO(); List<Product> saleslist = (dao.search(quantity , code)); HttpSession session = request.getSession(); session.setAttribute("saleslist", saleslist); RequestDispatcher rd = request.getRequestDispatcher("./sales.jsp"); rd.forward(request, response); } }
DAO
public List<Product> search(int quantity , String code){ int product_code = Integer.parseInt(code); List<Product> saleslist = new ArrayList<>(); Connection con = null; Statement smt = null; String sql = null; try { con = getConnection(); smt = con.createStatement(); sql = "SELECT product_name FROM m_product WHERE product_code = " + product_code + " "; rs = smt.executeQuery(sql); while (rs.next()) { String name = rs.getString("product_name"); Product product = new Product(quantity , name , code); saleslist.add(product); } }catch (Exception e) { throw new IllegalStateException(e); }finally { if(smt != null) { try{smt.close();}catch(SQLException ignore){} } if(con != null) { try{con.close();}catch(SQLException ignore){} } } return saleslist; }
JSP
</body> </html><h1>売上登録</h1> <div style="padding: 0 0 20px 46px"> <label style="text-align: center;">売上日</label> <% GregorianCalendar cal = new GregorianCalendar(); SimpleDateFormat format = new SimpleDateFormat("yyyy/M/d"); String datestr = format.format(cal.getTime()); out.println(datestr); %> </div> <div style="text-align: center;"> <form method="POST" action="./AddSalesServlet" style="margin-bottom: 50px"> <div style="boder-bottom: 1px solid"> <label style="padding-rigth: 100px">商品名</label> <select name="product_inf" type = "hidden" style="padding-rigth: 40px; width: 250px;"> <%for (Product product : list) {%> <option value="<%= product.getproduct_code()%>"><%= product.getproduct_name()%></option> <%}%> </select> <label style="padding-rigth: 30px;">数量</label> <input type="text" name="quantity" style="width: 40px;"> <button type="submit"> 追加</button> </div> </form> </div> <% %> <div style="boder: solid 1px"> <table> <tr> <th style="width: 20%">商品名</th> <th style="width: 5%">数量</th> </tr> <% for (Product product : list) { %> <tr> <td><%=product.getproduct_name()%></td> <td><%=product.getquantity()%></td> </tr> <%}%> <% if(saleslist!=null) { for (Product product : saleslist) { %> <tr> <td><%=product.getproduct_name()%></td> <td><%=product.getquantity()%></td> </tr> <% } } %> </table> </div> <form style="margin-bottom: 30px"> <button type="submit" style="margin-left: 83%">登録</button> </form>
どこまで「想定通り実行」されていて、どこまで「想定通りにデータが届き/生成されている」でしょうか。
たとえば DAO の search メソッドのパラメータは想定通りの値で呼ばれているでしょうか。
編集した SQL 文は想定通りであり、それによってデータベースから想定通りのデータが saleslist に入っているでしょうか。
(ちなみに、 SQL 文を文字列として編集することはセキュリティ上問題があります。)
JSP に saleslist がちゃんと渡っているでしょうか。
説明不足で失礼いたしました。
値を取りSQL文で必要な情報は取得できています。
またリストには想定通りの値を入れることができており、JSPにも欲しい値を表示できています。
この一連の処理に関しては問題なく動いています。
2回目以降の追加時に1度目にリストに入れた内容を保持しておきたいという処理ができておりません。
追加を押すたびにリフトの内容がリセットされてしまうのでリストの値を保持しておきたいというのがやりたいことです。
見たところ、データを取得するコードしかないように見えますが、リストの値の保持はどのように行う想定でしたか?
例えば、DBに保存する、セッションに保存する、ブラウザのローカルストレージに保存するなど。
AddSalesServletというServletがあるようなので、DBに保存するのかな?という予感はありますが、現在提示されているコードだけでは正確な回答はできない気がしますね。
値を保持しておいてまとめてDBに登録するという仕様にしたいのでサーブレットの中で保持しておきたいと考えています。
DAOでリストに値が入りそれをサーブレットでセッションに入れた場合2回め以降の処理の際にセッションの中に前の値が入ったままになるのでしょうか??
表示自体に問題は無いものの、登録操作をしてもその後の表示に登録したものが追加されないということでしょうか。
そもそも「サーブレット」「DAO」「JSP」とされているコードがどのタイミングで動くものなのかが分かりません。
JSP というのは sales.jsp でしょうか。
DAO は SalesSearchDAO クラスの search メソッド部分で、 サーブレットは… AddSalesServlet の? どの部分でしょう。
その通りです。
追加した物がどんどん表示されるようにしたいと考えていますが、今は追加するたびに表示は新しく追加したものに上書きされてしまうという状況です。
JSPとDAOはおっしゃる通りです。
AddSalesServletは上記に記載しているサーブレットです。
追加ボタンを押すとAddSalesServletに飛んでいきDAOでDBから必要な情報を取り出しリストに入れています。
AddSalesServletはそのリストを取得してJSPに返すという流れで動いています。
自分でもいろいろ調べながら進めてみました。
DAOの中のList<Product> saleslist = new ArrayList<>();で毎回初期化が起こっていると思うのでここの処理を最初にの一回だけにすればリストにたまっていくのかなと思います。
DAO内でList<Product> saleslist = new ArrayList<>();の処理を最初の一回だけにする方法なにかありませんでしょうか?
出来ましたら、「サーブレット」等の記述をファイル名にしてくださると分かり易いです。
>追加ボタンを押すとAddSalesServletに飛んでいきDAOでDBから必要>情報を取り出しリストに入れています。
>AddSalesServletはそのリストを取得してJSPに返すという流れ
既に madoka-t さんがご指摘されていますが、どこに「登録したデータをリストに入れる処理」があるでしょうか。
どうも、登録の処理も一覧表示の処理もデータベースの使い方もあちこちに綻びがあるように見えます。
そもそも search メソッドは ”これまで登録処理をしたデータを返す” メソッドでしょうか?
パラメータや処理内容からはそうは見えません。
単に "指定されたプロダクトコードのマスター情報("m_product"テーブル?)を Product オブジェクトのリストで返す" だけに見えます。(なのになぜか quantity が入るという謎もあります。)
最終的に登録したデータ(プロダクトコードと数量)が入るテーブルはどこなのでしょうか。
回答2件
あなたの回答
tips
プレビュー