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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

2回答

1268閲覧

リスト内が毎回初期化される

yamamoto_isamu

総合スコア25

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2022/04/05 10:23

編集2022/04/06 01:33

今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

<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>
</body> </html>

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

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

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

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

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

jimbe

2022/04/05 11:36

どこまで「想定通り実行」されていて、どこまで「想定通りにデータが届き/生成されている」でしょうか。 たとえば DAO の search メソッドのパラメータは想定通りの値で呼ばれているでしょうか。 編集した SQL 文は想定通りであり、それによってデータベースから想定通りのデータが saleslist に入っているでしょうか。 (ちなみに、 SQL 文を文字列として編集することはセキュリティ上問題があります。) JSP に saleslist がちゃんと渡っているでしょうか。
yamamoto_isamu

2022/04/05 11:53

説明不足で失礼いたしました。 値を取りSQL文で必要な情報は取得できています。 またリストには想定通りの値を入れることができており、JSPにも欲しい値を表示できています。 この一連の処理に関しては問題なく動いています。 2回目以降の追加時に1度目にリストに入れた内容を保持しておきたいという処理ができておりません。 追加を押すたびにリフトの内容がリセットされてしまうのでリストの値を保持しておきたいというのがやりたいことです。
madoka-t

2022/04/05 12:00

見たところ、データを取得するコードしかないように見えますが、リストの値の保持はどのように行う想定でしたか? 例えば、DBに保存する、セッションに保存する、ブラウザのローカルストレージに保存するなど。 AddSalesServletというServletがあるようなので、DBに保存するのかな?という予感はありますが、現在提示されているコードだけでは正確な回答はできない気がしますね。
yamamoto_isamu

2022/04/05 12:28

値を保持しておいてまとめてDBに登録するという仕様にしたいのでサーブレットの中で保持しておきたいと考えています。 DAOでリストに値が入りそれをサーブレットでセッションに入れた場合2回め以降の処理の際にセッションの中に前の値が入ったままになるのでしょうか??
jimbe

2022/04/05 18:51

表示自体に問題は無いものの、登録操作をしてもその後の表示に登録したものが追加されないということでしょうか。 そもそも「サーブレット」「DAO」「JSP」とされているコードがどのタイミングで動くものなのかが分かりません。 JSP というのは sales.jsp でしょうか。 DAO は SalesSearchDAO クラスの search メソッド部分で、 サーブレットは… AddSalesServlet の? どの部分でしょう。
yamamoto_isamu

2022/04/05 21:24

その通りです。 追加した物がどんどん表示されるようにしたいと考えていますが、今は追加するたびに表示は新しく追加したものに上書きされてしまうという状況です。 JSPとDAOはおっしゃる通りです。 AddSalesServletは上記に記載しているサーブレットです。 追加ボタンを押すとAddSalesServletに飛んでいきDAOでDBから必要な情報を取り出しリストに入れています。 AddSalesServletはそのリストを取得してJSPに返すという流れで動いています。
yamamoto_isamu

2022/04/06 01:41

自分でもいろいろ調べながら進めてみました。 DAOの中のList<Product> saleslist = new ArrayList<>();で毎回初期化が起こっていると思うのでここの処理を最初にの一回だけにすればリストにたまっていくのかなと思います。 DAO内でList<Product> saleslist = new ArrayList<>();の処理を最初の一回だけにする方法なにかありませんでしょうか?
jimbe

2022/04/06 05:57

出来ましたら、「サーブレット」等の記述をファイル名にしてくださると分かり易いです。 >追加ボタンを押すとAddSalesServletに飛んでいきDAOでDBから必要>情報を取り出しリストに入れています。 >AddSalesServletはそのリストを取得してJSPに返すという流れ 既に madoka-t さんがご指摘されていますが、どこに「登録したデータをリストに入れる処理」があるでしょうか。 どうも、登録の処理も一覧表示の処理もデータベースの使い方もあちこちに綻びがあるように見えます。 そもそも search メソッドは ”これまで登録処理をしたデータを返す” メソッドでしょうか? パラメータや処理内容からはそうは見えません。 単に "指定されたプロダクトコードのマスター情報("m_product"テーブル?)を Product オブジェクトのリストで返す" だけに見えます。(なのになぜか quantity が入るという謎もあります。) 最終的に登録したデータ(プロダクトコードと数量)が入るテーブルはどこなのでしょうか。
guest

回答2

0

ありがとうございます。
助かりました。
今回ご指摘いただいたことを含めて勉強していきます。

投稿2022/04/06 11:18

yamamoto_isamu

総合スコア25

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

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

0

ベストアンサー

おそらく、 AddSalesServlet の doPost で DAO.search をご提示のコードのように用いるのは間違いです。
また、マスターデータ(プロダクト) と入力されたデータ(売上?)を混在させてしまっているのも問題に思います。

※以下のコードは切り貼り・直書きしたもので、コンパイル・動作確認はしておりません。

Product クラスは例えば

java

1public class Product { 2 final String code; 3 final String name; 4 Product(String code, String name) { 5 this.code = code; 6 this.name = name; 7 } 8}

とし、本システムで入力したデータは SaleData クラスで表すとします。

java

1public class SaleData { 2 final Product product; 3 final int quantity; 4 SaleData(Product product, int quantity) { 5 this.product = product; 6 this.quantity = quantity; 7 } 8}

"プロダクトコードから Product オブジェクト (1 件 ) を返す" ようなメソッドを作ります。(もしかしたら既にあるのかもしれませんので仮に) ProductDAO クラスとします。

java

1public class ProductDAO { 2 public Product getProduct(String code) throws SQLException { 3 String sql = "SELECT product_name FROM m_product WHERE product_code = ?"; 4 5 try(Connection con = getConnection(); 6 PreparedStatement pstmt = con.prepareStatement(sql);) { 7 pstmt.setString(1, code); 8 try(ResultSet rs = pstmt.executeQuery();) { 9 if(rs.next()) { 10 String name = rs.getString("product_name"); 11 return new Product(code, name); 12 } 13 } 14 } 15 return null; 16 } 17 //getConnection メソッドとか他に必要/ありそうですが省略 18}

AddSalesServlet の doPost メソッドでは以下のようにできるのではないでしょうか。

java

1String code = request.getParameter("product_inf"); 2int quantity = Integer.parseInt(request.getParameter("quantity")); 3 4Product product = new ProductDAO().getProduct(code); 5//product が null だったり search の例外の処理は省略 6 7HttpSession session = request.getSession(); 8List<SaleData> saleslist = session.getAttribute("saleslist"); 9if(saleslist == null) { 10 saleslist = new ArrayList<SaleData>(); 11 session.setAttribute("saleslist", saleslist); 12} 13saleslist.add(new SaleData(product, quantity)); 14 15RequestDispatcher rd = request.getRequestDispatcher("./sales.jsp"); 16rd.forward(request, response);

jsp のほうの table 部分も直すとこんなでしょうか。(jsp は良く知らないので変かもしれません。)

jsp

1<table> 2<tr> 3 <th style="width: 20%">商品名</th> 4 <th style="width: 5%">数量</th> 5</tr> 6<% 7if(saleslist!=null) { 8for(SaleData saledata : saleslist) { 9%> 10<tr> 11 <td><%=saledata.product.name%></td> 12 <td><%=saledata.quantity%></td> 13</tr> 14<% 15} 16} 17%> 18</table>

投稿2022/04/06 07:35

編集2022/04/06 10:09
jimbe

総合スコア12632

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問