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

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

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

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

JSP

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

Java

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

サーブレット

サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

Q&A

解決済

1回答

3523閲覧

【JSP&サーブレット&MySQL】ネットショップによくある残りXX個と表示させるためには?

nasulrj

総合スコア38

MySQL

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

JSP

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

Java

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

サーブレット

サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

0グッド

0クリップ

投稿2016/02/03 08:54

編集2016/02/04 01:44

ご無沙汰しています。
今、JSP&サーブレットで試しにネットショップを作っています。
SQLの部分で在庫管理をしているのですが、サーブレットからSQLに受け渡しがうまく行かず在庫残りXX個と表示させたいのですが、残り0個のままでうまく行きませんOTL
どのようにしたらうまくいくでしょうか?よろしくお願いします。
最終的にはindex.jspにこの残りの在庫を表示させたいです。

【TestServlet.java】

TestServlet.java

1//Servlet.java-JSPで作成したフォームを受け渡す 2 3import java.io.IOException; 4import java.io.PrintWriter; 5 6import javax.servlet.ServletException; 7import javax.servlet.annotation.WebServlet; 8import javax.servlet.http.HttpServlet; 9import javax.servlet.http.HttpServletRequest; 10import javax.servlet.http.HttpServletResponse; 11 12@WebServlet("/hoge/TestServlet") 13 14public class TestServlet extends HttpServlet{ 15 @Override 16 public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{ 17 response.setContentType("text/html;charset=UTF-8"); 18 PrintWriter out = response.getWriter(); 19 20 KeisanSql ks = new KeisanSql(); 21 22 int uriage,zaiko; 23 zaiko=0; 24 uriage=0; 25 //カートに入れられたアイテムによって処理を分岐 26 if(request.getParameter("item1")!=null){ 27 uriage=Integer.parseInt(request.getParameter("s2_tanka"))*Integer.parseInt(request.getParameter("s2_suryo")); 28 //数量を取得 29 zaiko = Integer.parseInt(request.getParameter("s2_suryo")); 30 31 } 32 33 ks.getInfos(zaiko); 34 out.println("商品カートに"+request.getParameter("s2_suryo")+"入りました<br />"); 35 out.println("残りは"+ks.getInfos(zaiko)+"個です"); 36 //response.sendRedirect("index.jsp"); 37 38 39 } 40 41 42 43} 44 45

【KeisanSql.java】

//KeisanSql.java -SQLで在庫管理するプログラム import java.io.Serializable; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.sql.DataSource; public class KeisanSql implements Serializable{ public KeisanSql(){ /*コンストラクタ*/} private int id; public void setId(String id){ this.id=Integer.parseInt(id); } public int getId(){ return this.id;} private String name; public void setTitle(String name){ this.name=name; } public String getTitle(){ return this.name; } private int tanka; public void setTanka(String tanka){ this.tanka=Integer.parseInt(tanka); } public int getTanka(){ return this.tanka;} private int suryo; public void setSuryo(String suryo){ this.suryo=Integer.parseInt(suryo); } public int getSuryo(){ return this.suryo; } private int nokori; public void setNokori(String nokori){ this.nokori=Integer.parseInt(nokori); } public int getNokori(){ return this.nokori;} public static int getInfos(int zaiko) { //ArrayList<KeisanSql> list = new ArrayList<KeisanSql>(); Connection db = null; PreparedStatement ps =null; ResultSet rs = null; try { Context context = new InitialContext(); DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/Jsp10"); db = ds.getConnection(); KeisanSql ks = new KeisanSql(); //ks.setId(rs.getInt("id")); //ks.setTitle(rs.getString("name")); //ks.setTanka(rs.getInt("tanka")); //ks.setSuryo(rs.getInt("suryo")); //ks.setnokori(rs.getInt("nokori")); //商品ごとに引くので多分この辺にifが入るけど条件がわからないOTL ps=db.prepareStatement("SELECT * FROM shouhin_zaiko WHERE id=2;"); rs=ps.executeQuery(); //TestServletから取得した数量を元あった在庫から引く。 zaiko=rs.getInt("nokori")-zaiko; //ps=db.prepareStatement("UPDATE shouhin_zaiko SET nokori=?;"); //ps.setInt(5,1); rs=ps.executeQuery(); //list.add(ks); } catch (NamingException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { try { if(rs != null) { rs.close(); } if(ps != null) { ps.close(); } if(db != null) { db.close(); } } catch (SQLException e) { e.printStackTrace(); } } return zaiko; } }

【追記】わからないところ
①TestServlet.javaでks.getInfos(zaiko);にて
KeisanSql.java(以後K)に値が渡っているはずですが、
どの部分で0を返しているのか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ネットショップによくある残りN個の表示

自分が見てるページを触った時に個数が変化するパターンと、説明書き読んでる間にいつの間にか個数が減ってるというパターンと2つくらいあると思います。前者は、画面更新されるので新しい画面を作る際に個数を取得して表示、後者は現在表示中の画面の裏作業として、コッソリサーバに問い合わせて最新個数を取得してひょうじする。
データベースの接続などは自分で調べて解決してもらう前提として、何が分からないのか箇条書きでおしえてkyださい。
追記

提示されたコードだとdb接続部分が中途半端、リクエストパラメタ取得処理も中途半端、レスポンス返却も中途半端、どれも上手くいってないように見えます。

提案ですが、
1.db接続とか考えないで、パラメタを取得してそのものを返却する サーブレットを作成。
2.db接続しないで、受けたパラメタからSQL文を生成してそれを返却するサーブレットを生成。
3.db接続が成功したか失敗したかを返すサーブレットを生成。
4.sqlを実行して結果をベタで一覧表示するサーブレットを生成。

段階追って作っていけば理解も早いと思いますよ。わからないことをいっぺんにやろうとしても無駄です。
一つ一つ理解しながら作業されてはどうですか。

投稿2016/02/04 00:53

編集2016/02/04 01:03
ipadcaron

総合スコア1693

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

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

nasulrj

2016/02/04 01:46

ありがとうございますm(_ _)m 分からないところを追加しました。もしお時間がありましたらよろしくお願いします。 1つずつ作業しながら理解力を深めていきたいと思います。
ipadcaron

2016/02/04 02:08

KeisanSql クラスについて、 メンバー変数のかたはそれぞれですが、setter の引数がもじれつになってるのはなぜでしょうか。 public class ShouhinZaikoDto { public static String TABLENANE = "shouhin_zaiko"; private Integer id,suryo,tanka,nokori; private String name; // getter/setter は省略 } プリミティブ変数だと nullが表現できないので、 クラス型の方がいいと思います。 getter/setter は、eclipse の自動生成機能で生成できます。 データベースのテーブルと対になるデータ格納するクラスを DTOとかビーンとかエンティティとか言いますが、ShouhinZaikoDto は、Shiuhin_zaiko テーブルと対になるdtoです。dbの定義した型と同じタイプのデータ型で定義します。
ipadcaron

2016/02/04 02:15

web画面からのリクエストは基本全て文字列で取得できるので、dtoに詰める時に同時に文字列型から対応するデータ型にコンバートするようにするといいです。 たとえば、 ShouhinZaikoDto sz = new ShouhinZaikoDto(); sz.setId( Integer.valuOf( request.getParaneter("id") ) ); みたいに。エラーチェックも同時に行いますけど。 データベース接続、sql実行処理は、ShouhinZaikoDto クラスには含めず、別クラスで定義します。
nasulrj

2016/02/05 23:25

有難うございます┏○))ペコり ただいま一つずつ実行し、おかげ様でSQLなしで在庫プログラムを管理するサーブレットまで作成できました。 頂いたコメントまでたどり着くまでまだ時間がかかりますが、参考にして完成していきたいと思います。 時間がかかりそうなので先にコメントを返しました。
nasulrj

2016/02/10 05:14

2016/2/10追記 ipadcaronの追記の通りにやりましたらできました。 感謝申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問