今日したこと 11/7(火)
■カートに追加した商品情報を保持するために作ったクラスの名前をSelectedItemに変更
・nameインスタンスとpriceインスタンスの追加
■cart.jspで取り出したい商品名や値段を取り出す方法をDBを使う方法にする
・request.getParameterで選択されたIDと数量を取得。この情報はSelectedItemインスタンスをnewしてそこに詰めておく
・購入ボタンが押されたらjava側で選択されたIDからname,priceを検索(AddCart.java(コントローラ)で商品情報をDBから取ってくる)
・ItemDaoクラスにfindItemNameAndPriceBySelectedId(String selectedItemId)を追加
・selectedItemIdでitemNameとpriceをDBから取ってきて、Listに入れる(このためItemクラスにStringとint型の引数を受け取るコンストラクタを追加)
・AddCart.java(コントローラ)でListにつめた要素を取り出しSelectedItemクラスに代入する
■jsp側でsessionに詰めておいたSelectedItemインスタンスに代入されているフィールドのデータを取り出す。
◎今日は選択した商品情報がcart.jspにうまく受け渡せない問題に取り組んだ。
Listの使い方がよくわかってないようで、内部でどのような動作をしているのか、どんな風に使えるのかをわかるようにすることが課題だ。
今日は直すところが多すぎて、結構混乱した。
一気に色々言われて固まってたら、やる必要がある作業を順序化してゆっくり教えてもらえた。
今日はItemIDでDBからname,priceを取ってくるところとかは褒めてもらえた。
ショボいかもしれないけど褒めてもらえると嬉しい。
今日の発見
SQLsyntaxErrorの確認方法
You have an error in your SQL syntax
こういう感じのエラーがコンソールに出ていて、それに気がついたはいいんだけど、何が違うのか全くわからなくて放っておいたら、質問した時やっぱりそこ注意された。
「スペースが全角かも。(スペース直しながら)ターミナルでこのSQL試してみた?」って聞かれて、そうやって確認するんやなって学んだ。
日本語と英語切り替えながら作業してるから、そんなつもりなくても全角スペースにしてることってあるんだなぁ。
最近、エラー読めば全て解決するわけじゃないなって思う。いや、できる人は解決するのかな?
でも、エラーの意味はわかっても、このエラーが出てきた時はこの可能性とこの可能性があるみたいなのがわかってすぐ対処できるようになるのかなって。
私が今日どうしても何が違うかわからなかったのに、教えてくれる人はすぐ思いついたように。
エラーを出して解決する過程というのは、本当に大事なんだなと思った。
メソッドの戻り値
Eclipseを使っているんだけど、今日初めて知ったのは、メソッドの戻り値が確認できること。
例えばListではsizeメソッドが使えるけど、size()ってところにマウスオーバーすれば、そのメソッドの戻り値が確認できる。
int java.util.List.size()
size
int size()
このリスト内にある要素の数を返します。このリストにInteger.MAX_VALUEより多くの要素がある場合は、Integer.MAX_VALUEを返します。
こういうのが出てくる!
今更かって思うけど、そんな余裕なかったし、みてもわかんなかったということなのよね、、
みたことなかったわけじゃないけど、意識してなかったからなんとも思ってなかった。難しげなの出てくるなあとしか。。別に難しいこと書いてなかった、、、
こんな感じでわかることがちょ〜〜〜〜少しずつ増えていってます。
人より進むの遅いかもしれないけど頑張ろう〜。
今日学んだことと、今後の課題 10/31
カートの情報の保存先(何をどういう風に見せたいかでどれを使うか変わる)
セッション(画面をまたげる。今回はこれ使う)
サーバーのメモリ上に情報が載っている
tomcatでセッション有効期間を変更できる
ブラウザを変えるとユニークユーザーを特定できない
セッション有効期限が切れたら情報を保持できない(30分~2時間くらいが基本)
クッキー
クライアントのローカルにファイルとして書き出す
クッキーのファイルが消えたり、ブラウザを変えると情報保持できない
期間は長いが履歴消去などで無効になる
DB
確実だが本人特定が必要
クッキーと併用するケースが多い
実装していない機能
!のところはやるけどちょっと後回しかなあ。
・カートに商品を追加する(商品Idと数量を受け取る。カートに追加ボタンでカートのページに飛ぶ)
・購入に進むか商品一覧へ戻る
!カート内で数量変更や商品を削除する(jspで)
!商品一覧に戻った場合在庫数は減らす?(購入確定のタイミングで減らす)
・購入に進んだ場合購入確認画面へ
・購入確定の場合historyテーブルに商品を追加
!購入履歴が見られるようにする
これからやること
Idと数量を持つクラスを作る
取得したデータをListに入れてセッションに保存する
ショッピングカート画面でセッションからデータを取り出し中身を表示する
注意されているところ
これは今日が初めてじゃないんだけど、名前の付け方について。
他の人のソースを参考にしながら書いているところと、自分で書いているところがあるからっていうのもあるけど、どんな名前にするのが良いのかあんまりわからないで書いてる時もあるかも。
例えば取ってくるのはIDなのに、変数の名前はNameだったりとか。
クラスやメソッドの名前だったりとか。
その名前を見れば何をするかわかるのが良い。
もう少し意識して名前付けしていこうと思う。
最近思うこと
専門用語を正しく使えたり、人に説明するときに正確に何をしているかちゃんと伝えられるようにしたい。
それって、この機能は何をするとか、どういう仕組みなのかとか、ちゃんと分かってると思うし、
人に伝えるには、自分で理解してないとうまく伝えられないから。
昨日、今日と解決したところ 10/30,31
Tomcatが始動しないことについて
Eclipseでサーバーを起動しようとするとエラーが出てしまっていた件。
これ、サーブレットの問題で、アノテーションの/以降が同じになってるサーブレットクラスが2つあって、どっちのクラスなの?わかんないよ〜みたいな感じで起動できなくなってたみたい。
それを直したら、普通につながるようになった。
ポートが使われているみたいな警告が出てたけど、それは関係なかったようだ。
コンソールにログが出るんだけど、全部読まないで、これっぽい!と思ったやつにしか目を向けてなかった。しっかり読まないといけないね。
PreparedStatementの複数テーブルからのデータ取得でitem情報を取り出せない件について
うまくいかなかった時
select itemName,price,quantity from item join stock on item.itemId = stock.itemId;
Select文で最初‼️とのパラメータの数が合ってなかった。
itemList.add(new Item(
‼️rs.getString("itemId"),
rs.getString("itemName"),
rs.getInt("price"),
rs.getInt("quantity")
じゃあこれにitemId付け足そうと思って書いたら、結合してる時はどのテーブルのカラムっていうのを明確にしないといけないのでした。
select item.itemId,itemName,price,quantity from item join stock on item.itemId = stock.itemId;
これで動くようになった。
10/17 つまづいたとこ
◎RequestDispatcher
リソースにリクエストをフォワードするか、レスポンスのなかのリソースをインクルードする目的で使用。
リソースは動的、静的どちらにも適用可。
パス名は "/" で始まらなければならない。これによりWebアプリケーションのコンテキストルートに対する相対パスであると解釈される。
外部のコンテキストに属するリソースを利用するには getContext() メソッドを使って RequestDispatcher オブジェクトを取得する。
このメソッドはServletContextがRequestDispatcherを返せなかった場合にnullを返す。
サーブレットからサーブレットへPOSTしようとしたら『パス ほにゃらら が"/"文字で始まりません』って怒られまくってそのエラー文をずっと調べてたんだけど解決せず。
web.xmlになんか付け足す記事が何個か出ていたけど、関係なかったぽい。解決しなかった。
最終的にforwardのこと調べてたら
http://mergedoc.osdn.jp/tomcat-servletapi-5-ja/javax/servlet/RequestDispatcher.html
ここにたどり着いて、決まりを確認したら解決できた。
"/"これつけてないだけだった・・・。
つけて試したりもしたはずなんだけどなぁ・・?
でも今回のは確実にわかってて出来る方がいい。なんとなくじゃなくて。
エラーで調べることばかり考えてたけど、そもそもまだルールや仕様がよくわかってないことの方が多いんだったと思ったつまづきでした。
◎DBからSelectで取って来た値を配列へ
List<Item> itemList = new ArrayList<Item>();
while (rs.next()) {
itemList.add(new Item(
rs.getString("itemId"),
rs.getString("itemName"),
rs.getInt("price")
));
}
return itemList;
前回学んだ余計な変数を作らないみたいな話がもっとよくわかった感じだった。
itemList.add(new Item(
ここ、new Itemでインスタンス生成してるけど、それに名前はついてない(変数に代入してない)。
説明下手だけど、なんかnewするとき変数あるパターンしか見たことなかったから、こういう書き方あるんか!って思った。
あとやっとかないとと思ったのはfinallyでDBcloseするとこ。
でも商品一覧まできたな〜すごい〜
最近学んだこと
今日はいろんなことを学んだのでメモ
◎めっっちゃ初歩的なミス
String url = "****";
String user = "****";
String password = "****";
//DB接続開始
try {
//JDBCドライバのロード
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url,user,password);
}
⭕️conn = DriverManager.getConnection(url,user,password);
❌conn = DriverManager.getConnection("url","user","password");
❌の方にしてて接続ができてなかった。
デバッグで接続できてないことを確認できたことだけはよかった。
◎ResultSetについて
全然よくわかってなかった。
executeQueryの使い方とか。入門書に載ってたはずだけど、自分はほんと問題につきあたらないと学ばない奴なんだなと思った。
ResultSet executeQuery() throws SQLException
T getXxxxx(String column)
T:データ型(String、int、double、Blobなど)
column:フィールド名
ちなみにexecuteQuery()の戻り値はnullにはならないので
ifで判定したい場合は
ResultSet rs;
if(rs.next()) {
//結果ありの処理
} else {
//結果なしの処理
}
こうする
お世話になりました↓
http://niconico-pin.hatenablog.com/entry/2016/11/14/17072
◎変数の命名について
基本的にクラスと同じ名前にする。
LoginDao loginDao = new LoginDao();
こういう感じ。
◎変数に代入すること
無意味な代入をしない
行数も減ってスッキリする
今日でショッピングサイトのログインに関する処理が一旦完成!
やっとだよ。めっちゃ時間かかてる。。。
次はメインのページ。
ログイン処理を作って出来るようになったのは
・クラスやメソッドを作ること
・GitHub活用
・デバッグ
・エラー処理
とかかなぁ。
多分もっとあるけど・・・
中でもクラスやメソッドを作ることとデバッグが使えるようになってきたことにはめちゃくちゃ感動している。
クラス・メソッドに関しては、やっとかよ感があるんだけど、参考書に書かれてるのを自分で書くとかではなく、
自分で必要だと思って作るクラス・メソッドの方が、今までより知識が身にしみて理解できたし(日本語が変?)楽しかった。
あと今週はつまづいた時普通にデバッグし始めて、どこができてないかなんかわかる自分がいて驚愕した。
意味がわからない。
最近までデバッグ使い方わかんなくて嫌いだったのに今ではデバッグさまさまである。使ってるのEclipseのだけだけど。
ショッピングサイトを作るの、始めた頃もだし、今もたまに「これ意味ないんじゃないか」って思うけど
学んだことまとめると、そんなこともないんだなあと思える。
いずれ勉強が進んで、フレームワークとか使うようになったら
こんなに作るの大変じゃないらしいけど
簡単に作れるその仕組みがわかるエンジニアになろうねと言われてるので頑張ろうと思う。
最近教わったこと
メソッドを書く上で大事なこと
メソッドの名前について
呼び出しているメソッドを見に行かなくても、何をしているのかすぐわかる名前をつけること。
public User getUserSingleResult(String id, String pass) throws SQLException {
List<User> list = findUserByIdAndPass(id, pass);
if(isNotSingleResult(list)) {
throw new NonUniqueResultException();
}
return getListFirst(list);
}
例えばこのメソッドは、他のたくさんのメソッドを呼び出している
これら呼び出されているメソッドは名前で何をしているか判断できるので
読み解く時わざわざそのメソッドに行かなくてもわかる。
メソッド名をわかりやすくしているのだから内容がそれに一致してないと!(当たり前だけど)
例外処理について
throw
throwは例外が発生した場合
そのあとの処理はやらない
private List<User> convertResultSetToUserList(ResultSet rs) throws SQLException {
List<User> list = new ArrayList();
if (rs == null) {
throw new DataNotFoundException();
}
while (rs.next()) {
list.add(new User(
rs.getString("id"),
rs.getString("name"),
rs.getString("pass"),
rs.getInt("age")
)
);
}
例えばこのメソッドの場合
trycatchがないので、whileの部分の処理はせずに、このメソッドの呼び出し元まで戻る。
呼び出し元でもcatchされない時は
最終的な呼び出しもとでcatchしてあげること
ログイン処理での例外が、null~だった時
IDかパスワードが間違っている旨を伝える
どちらが間違っているか教えることもできるが、例えばIDはあっている場合、そのIDが登録されていることを外部に知られてしまうので、どちらが間違っているのか教えないようになっている
modelの基本
データベースに登録してあるカラムと
クラスのフィールドは基本的には内容を統一する
クラス
private String id;
private String name;
private String pass;
private int age;
DB
+-------+----------+--------+------+
| id | pass | name | age |
+-------+----------+--------+------+
Githubにpushする一連の流れ
Githubにpushすることがまた増えてきたので
前まとめた時は普段使わないのもまとめてたから
最近必要なとこだけまとめ
cd 作ったフォルダ
ファイルの追加/保存
git add ファイル名
git commit -m "コメント"
作業内容をリモートにPushする
git push origin master
コメントの注意点
GitHubにcommitするときのコメントの注意点
コメント内容について
❌「~を変更した」
⭕️「何を追加したか」「どういうことができるようになったか」
(どこを変更したかは見ればわかるため)
commit頻度について
❌複数行に渡るコメント
⭕️だいたい一行くらいのコメント
(複数行必要になるのはcommitの単位がでかすぎるということ)
(頻繁に分けてcommitすること)