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すること)
eclipseとtomcatとmysql DB接続で躓いたところ
夏から練習として作り始めたショッピングサイトでずっと躓いていたDB接続の問題、少し進歩があって嬉しかったのでメモ。
環境がだいたい同じだったので、こちらの記事を参考に接続テストを試みた。
突き当たっていた問題は二つほどある。
一つ目はブラウザで日本語が文字化けすること。(???みたいになる)
サーブレットのhtmlの日本語部分を英語や数字にするとそれはちゃんと表示される。
ブラウザ側に「これはutf-8で」とお知らせする記述はしてあったので、
このソースは何で記述しますという宣言をする。
結果的に
response.setCharacterEncoding("UTF-8");
を書いたらうまく表示された。
これを書かなくても、多分server.xmlとかそういうのに記述する方法があるはずだよと言われたのでそれは後々。
なんかもっとわかりやすい説明してもらったんだけど、
昨日書く時間なかったから抜けてる・・・。
わかったら追記。
ここら辺は今度また勉強し直す予定。
もう一つの問題は、そもそもDBに接続できていない疑惑があったこと。
これはライブラリの問題だった。
訳のわからないところから参照していたのがいけなかったみたい。
tomcatがあるところが/Library/Tomcatなので、/Library/Tomcat/libからのみ参照することにしたら、うまく繋がるようになった。
教えてもらったのでわかったのだけど、自分はいまいち参照先とかファイルの移動や保存場所など、ファイル管理ができていない。
もう少し普段からフォルダの階層構造とか意識した方がいいのかな。
今回参考にしたものは、サーブレットにhtmlも全て書いちゃうやつ。
htmlの記述はJSPに任せるといいとのこと。
なので次は自分が使いたいデータでもちゃんとできるか試してから
役割ごとにソースを分けていきたいと思う。
最近はコードをみてもわけわからんっていうことだけじゃなくなってきたし、これは何をしていて次はここみたいなのが少しわかるようになってきた。今は、Javaの全く理解できなかったところを勉強し直しているけど、前より全然わかるので不思議。
ちょっとしたことだけど、何が問題でどこまではOKなのかをいじって確かめたり、必要な情報を集めたり、どこで躓いていて何までは確認できているのかを伝えたり。
そういう力がちょっとだけついた気がする。
普段マイナスなことしか感じないので、昨日は少し嬉しかったし、わかるのって楽しいなあと思ったのでした。
GitHubにcommitするときのコメントの注意点
コメント内容について
「~を変更した」ではなく、「何を追加したか」「どういうことができるようになったか」などをかく(どこを変更したかは見ればわかるため)
commit頻度について
複数行に渡るコメントを書く必要があるというのは、commitの単位がでかすぎるということ
だいたい一行くらいでコメントが書けるよう、頻繁に分けてcommitすること
20170801(Tue)
今日したこと
ShoppingSite
cssページをpush
最近のまとめ
最近したこと
HTML/CSS入門教室(CSSの基礎知識)
・簡単にまとめられているけど今までなんでそうなのかわからなかったことなどについて詳しく書かれていてよかった
・半日くらいで終わる量なのでありがたい
・細かいことは自分で調べて補う形になるが最初に自分で色々作るのにはためになる
・イラストが多いので疲れない
・楽しくて良い本だった
cssでページのレイアウトをいじる
詰まっていたところ(Sessionオブジェクトに複数値を格納する)を相談して解決
<button type="submit" name="productName" value="りんご">購入</button>
<button type="submit" name="productName" value="バナナ">購入</button>
request.setCharacterEncoding("UTF-8");
String productName = request.getParameter("productName");
HttpSession session = request.getSession();
Product product = new Product();
product.setName(productName);
session.setAttribute("Product", product);
nameを共通化して、選択された方のvalueをセットするようにした
現状ではどちらか一つしか選択できないので、今後複数選択を可能にしたい
今後変更する箇所
cssを使いページをもっと見やすくする
複数商品の購入を可能にする
アカウントの登録などを可能にする
データベースと商品やアカウントの情報をやり取りできるようにする