- ベストアンサー
JSPでショッピングサイト(会員登録画面実装)
- JSPを使用してショッピングサイトの新規会員登録画面を作成しています。入力フォームに名前やメールアドレスなどを入力し、会員登録ボタンを押すと入力情報確認画面に遷移します。データベースへの追加後、登録完了画面とトップページへのリンクが表示されます。
- ただし、データベースに追加される情報がすべてnullになってしまっている問題があります。この問題の原因を調査するため、入力情報確認画面の表示を省略したところ、データベースへの追加は成功しました。また、変更後のコードでも同じ問題が発生しました。
- ソースコードは下記に掲載しています。原因特定のための指南をお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>転職時に提出すると一目置かれるようなものってどんなものがありますか? もしかして完全に違う分野から? それともWebじゃないけどプログラマ? 違う分野からならまあこの会員のシステムみたいなのであれば、一通りの基礎 (データベースの利用、登録、削除、更新、画面表示) が含まれてるからいいかもしれない。 ただ、どんな開発をしたいかによって評価されるものが違うからなぁ。 Webシステムでいいのかな? まあ今のものを進めていいと思うよ。
その他の回答 (4)
- Taiyonoshizuku
- ベストアンサー率37% (183/489)
>今回、このHPの開発は勉強と転職時に提出するつもりで作成しています。 >始めはテキスト等で勉強していましたが、それよりも実践で使えるようにならないと >いけないですし、提出用にも流用できるので一つ一つ考えながら作成している次第です。 実際作ってみるというのはいい手だけど、いきなりWebじゃなくても良かったと思うよ。 Webの場合覚えないといけないことが余計にあるから。 http通信の仕組みだったり、サーバ側で動くJava(JSP)、クライアント側で動くhtml,css,JavaScript。 ちょっと近道しすぎたかな。 ちなみに、このくらいのシステムだと転職時に提出しても、出来て当たり前レベルなので、違うものを検討したほうがいいかも。
補足
そうですね。。。 そう言われれば近道というか焦りすぎてたかも知れません。 できて当たり前なこの件を提出するかは置いといて引き続き進めるとして、 転職時に提出すると一目置かれるようなものってどんなものがありますか? 質問ばかりになってしまいますが、お願いします。
- Taiyonoshizuku
- ベストアンサー率37% (183/489)
>2の画面で、下記のように修正しました。 >String last_name=request.getParameter("last_name"); >session.setAttribute("last_name","last_name"); これじゃセッションのlast_nameに入るのは常にlast_nameっていう文字列だけど? >続いて、3の画面は下記に修正しました。 >String last_name=request.getParameter("last_name"); >String strLast_name = (String)session.getAttribute("last_name"); セッションに入れたならパラメータからとる必要は無し。 String last_name = (String)session.getAttribute("last_name"); >PreparedStatement strSql=conn.prepareStatement("INSERT INTO member(last_name) VALUES(?)"); >strSql.setString(1,request.getParameter("strLast_name")); >strSql.executeUpdate(); 上記と同じで、なぜセッションに入れたのにSQLに使う値がパラメータからなのか? >3の取り出す時の変数名を「last_name」にすると「Duplicate local variable」 >エラーとなり、変数名が重複しているとのことなので、変数名を >「strLast_name」としています。 そりゃ、同じ変数名は定義できない。というかまた上記と一緒でなぜ二つ必要か。 パラメータを使うのかセッションを使うのかはっきり設計しなさい。 パラメータを使うなら最初に回答したようにhidden項目をすべての項目に準備すること。 >この記述でもやはりnullになってしまっています。 >("INSERT INTO member(last_name) VALUES(?)");を >("INSERT INTO member(strLast_name) VALUES(?)");にするとデータベースに >nullも追加されていない状態です。 まずは基本的なところを学んでから手を出したほうが良い気がするよ。 insert into 【データを追加したいテーブル名】 (対象のカラム) values (値) なんだから 2つめのSQLはおかしいんじゃないの? strLast_nameっていうカラムがあるなら構文的な間違いは無いと思うけど、今やりたいことでそこの値が変わることは想像できない。 何か勘違いしていると思う。 ちなみにnullすら入っていないっていうのはおそらくSQLExceptionが発生しているからじゃないかな。 何で開発してるかはわからないけど、デバッグ機能無いの? またはエラーログを見る癖を付けるかExceptionが発生するところでstackTraceを出力するか。 開発中は大体この辺の情報を見ればなぜ動かないか見えてくるよ。 ><%@ page session="true" %>も各画面のコード中に必要なんですよね? 各画面に必要かはわからない。使うなら書かないとだし、 Servletでセッションの内容を処理してrequest.setAttribute("atai", "値"); で書き込んだものをJSP側で取得して使うなら必要ないだろうし。
補足
ありがとうございます。 成功しました。 2の画面は一部を下記のように修正しました。 値の方は""がいらなかったですね。 session.setAttribute("last_name",last_name); 3の画面は下記のように修正しました。 --------------------------------------------------------- <%@ page language="java" %> <%@ page import="java.sql.*,java.util.*,java.text.*"%> <%@ page contentType="text/html; charset=Shift_JIS"%> <% String last_name = (String)session.getAttribute("last_name"); String first_name = (String)session.getAttribute("first_name"); String last_name_kana = (String)session.getAttribute("last_name_kana"); String first_name_kana = (String)session.getAttribute("first_name_kana"); String mail = (String)session.getAttribute("mail"); String zip_1 = (String)session.getAttribute("zip_1"); String zip_2 = (String)session.getAttribute("zip_2"); String prefecture = (String)session.getAttribute("prefecture"); String city = (String)session.getAttribute("city"); String address = (String)session.getAttribute("address"); String apartment = (String)session.getAttribute("apartment"); String tel = (String)session.getAttribute("tel"); String password_1 = (String)session.getAttribute("password_1"); String password_2 = (String)session.getAttribute("password_2"); String strConn="jdbc:mysql://localhost/****" + "?user=****&password=****" + "&useUnicode=true&characterEncoding=Shift_JIS"; Connection conn = DriverManager.getConnection(strConn); try{ PreparedStatement strSql=conn.prepareStatement("INSERT INTO member(last_name,first_name,last_name_kana,first_name_kana,mail,zip_1,zip_2,prefecture,city,address,apartment,tel,password_1,password_2) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?)"); strSql.setString(1,(last_name)); strSql.setString(2,(first_name)); strSql.setString(3,(last_name_kana)); strSql.setString(4,(first_name_kana)); strSql.setString(5,(mail)); strSql.setString(6,(zip_1)); strSql.setString(7,(zip_2)); strSql.setString(8,(prefecture)); strSql.setString(9,(city)); strSql.setString(10,(address)); strSql.setString(11,(apartment)); strSql.setString(12,(tel)); strSql.setString(13,(password_1)); strSql.setString(14,(password_2)); strSql.executeUpdate(); }catch(SQLException e){ e.printStackTrace(); }finally{ conn.close(); } %> <jsp:forward page="add_member_success.jsp"/> --------------------------------------------------------- 下記に関しては勘違いでした。 >("INSERT INTO member(last_name) VALUES(?)");を >("INSERT INTO member(strLast_name) VALUES(?)");にするとデータベースに >nullも追加されていない状態です。 おっしゃられる通り、strLast_nameというカラムがないのに追加しようとしてしまってました。 >><%@ page session="true" %>も各画面のコード中に必要なんですよね? >各画面に必要かはわからない。使うなら書かないとだし、 >Servletでセッションの内容を処理してrequest.setAttribute("atai", "値"); >で書き込んだものをJSP側で取得して使うなら必要ないだろうし。 理解できてなくて、セッションを使用する際には必要でおまじない程度に記載していました。 結論から言うと、今回はどのページにも<%@ page session="true" %>の記述はなくても 成功しています。 今回、このHPの開発は勉強と転職時に提出するつもりで作成しています。 始めはテキスト等で勉強していましたが、それよりも実践で使えるようにならないと いけないですし、提出用にも流用できるので一つ一つ考えながら作成している次第です。
- Taiyonoshizuku
- ベストアンサー率37% (183/489)
セッションに追加するのは2の画面でパラメータを受け取った直後だよ。 パラメータ名は共通で問題ない。 String v1 = request.getParameter("v1"); sesstion.setAttribute("v1", v1); んで取り出すのは String v1 =(String)session.getAttribute("v1");
補足
2の画面で、下記のように修正しました。 String last_name=request.getParameter("last_name"); session.setAttribute("last_name","last_name"); 続いて、3の画面は下記に修正しました。 String last_name=request.getParameter("last_name"); String strLast_name = (String)session.getAttribute("last_name"); PreparedStatement strSql=conn.prepareStatement("INSERT INTO member(last_name) VALUES(?)"); strSql.setString(1,request.getParameter("strLast_name")); strSql.executeUpdate(); 3の取り出す時の変数名を「last_name」にすると「Duplicate local variable」 エラーとなり、変数名が重複しているとのことなので、変数名を 「strLast_name」としています。 この記述でもやはりnullになってしまっています。 ("INSERT INTO member(last_name) VALUES(?)");を ("INSERT INTO member(strLast_name) VALUES(?)");にするとデータベースに nullも追加されていない状態です。 <%@ page session="true" %>も各画面のコード中に必要なんですよね? 何度も申し訳ないですが、宜しくお願いします。
- Taiyonoshizuku
- ベストアンサー率37% (183/489)
セッションかhiddenに持たないと。 パラメータ名は関係ない。 リクエストの中身は1回のリクエストで消える。 1→2 2→3 ここで明示的に値を渡さないと それか2のところでセッションにぶちこむ。
補足
ありがとうございます。 セッションを利用しようと修正しましたが、やはりnullになってしまいます。 2のところでセッションを開始してスコープを設定をしていますが その直前でパラメータを取得して変数を設定していますが ここの変数名とセッションの入れる値を揃えないといけないのかどうか、 または全然違うところに原因があるのか分かりません。 //パラメータを取り出す際の文字コードを設定 request.setCharacterEncoding("Shift_JIS"); //パラメータから名前(苗字)を取得 String strLast_name=request.getParameter("last_name"); <%@ page session="true" %> <% session.setAttribute("last_name","last_name"); %>←ここの値をstrLast_nameにしないといけない? 3の画面ではgetするのに下記のように記載していますが 同じようにパラメータと変数の関係性がいまいち分かっていません。 //パラメータを取り出す際の文字コードを設定 request.setCharacterEncoding("Shift_JIS"); //パラメータから名前(苗字)を取得 String strLast_name=request.getParameter("last_name"); <%@ page session="true" %> <% String last_name = (String)session.getAttribute("last_name");
お礼
遅くなりまして、すみません。 完全ではないですが、違う分野です。 今はソフトウェアテスト、検証をしています。 提出する先、やりたいことによって提出すれば良いものが 変わってくると思いますが、とりあえずやりたいことは このシステムなので、最後まで作ってみます。 最後までご丁寧にありがとうございました。