初投稿をいたします。中小企業に勤務している新卒1年目の者です。勉強のためにポートフォリオを先輩社員からアドバイスをいただきながら作成しています。使用するコードの意味や働きを誤解していたらご指導のほどよろしくお願いします。使用している開発ソフトは「Eclipse」です。太字がコード、//が下のコードについて解説しています。
ポートフォリオ内容
・所有している本の簡易管理システム(所謂My図書館)コードでしたいこと
・所有している本の検索使うファイル
・Own.java(jspから最初に入るjavaファイル)コード
Own.java **protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {**//ownBook.jspで受けとった3つのデータの型を指定 送られてきたデータ(request.getParameterの後のデータ名とその中に格納されているデータのこと)にそれぞれString型のこのメソッドで使うデータ名に置き換える 送られてきたのは検索したい本のタイトル、著者、出版社↓
//書いていて思った。request.getParameterは親インターフェースでHttpServletRequestの定義がされてる必要があるのなら、いつ満たした?上のHttpServletRequestでいいのか?↓
String bookTitleSerch = request.getParameter(“bookTitleSearch”);
String bookWriterSerch= request.getParameter(“bookWriterSearch”);
String bookCompanySerch= request.getParameter(“bookCompanySearch”);
//book型のownBookList変数を作成 取り出したいデータ型がString型のみ、int型のみとは限らないためbookというデータ型を作成(voidと定義していることもあって型の名前は分かりやすければなんでもいい) ArryListはデータの集まりを配列のように取り扱うもの。当てはめて詳細に説明するとbook型のownBooksListというメソッドを作成。
ArrayList ownBooksList = new ArrayList();
//例外処理 エラーの起こるであろう場所を指定 なぜここだったのだろう?
try {
// リストを取得 =メソッドに格納する情報 OwnDBAccess.javaのSelectに処理を委託し、その際に上記のownBookList変数を一緒に引数として渡す。
ownBooksList = OwnDBAccess.Select(bookTitleSerch, bookWriterSerch , bookCompanySerch);
//例外処理 エラー発生時にフロント側には何も表示されない
} catch (SQLException e) {
e.printStackTrace();
}
// リクエストに設定 リクエストスコープを使ってインスタンスを保存。これにより、検索したい3つのワードを受け取るまで所持できる
request.setAttribute(“ownBookList”, ownBooksList);
//リクエストしたsetAttributeを表示したいjspファイルの指定 決まり文句の為省略
ServletContext context = getServletContext();
RequestDispatcher dis = context.getRequestDispatcher(“/OwnReslut.jsp”);
dis.forward(request, response);
}
・DBAccess.java
public static ArrayList Select(String bookTitleSerch , String bookWriterSerch , String bookCompanySerch) throws SQLException {
//Daoファイルのdao変数にはなにも入れない 明日、Daoについてアウトプットします。Dao型の変数(?)を定義。Daoは主にデータベースの操作に関するコマンドを入力する為のファイル。~~ここでnullとするのは処理したいこと、送られたものを広義に受け取るため。~~メソッド内で変数の定義をしていないと突然現れた変数に対する処理が出来ない為。
Dao dao = null;
//上記に同意味。resultという名前の変数を作成、受け取りたいがためにnull。また、検索結果によって返ってくるデータが変わるため。
ArrayList result = null;
//例外処理。
try {
//daoインスタンスを作成。ここで作る意味は検査例外が発生する可能性がある処理を含むため。データベースとの接続を行い、SQlのパスワード等の不一致により例外が発生しやすい。
dao = new Dao();
//DaoファイルのOwnメソッドに引数として()内の変数を渡す。並びに受け取ったデータを上記result変数に代入
result = dao.Own(bookTitleSerch , bookWriterSerch , bookCompanySerch);
}finally {
//リソースの開放。必要な情報のみを取り出す為。
if(dao != null) dao.close();
}
//一つ上のreslutに渡す。
return result;
}
・Dao.java
//以下のメソッドではデータベースの操作と取り出したいデータの指定を行っております。あと、例外処理がしたいのでthrowsを書いてもらいました。()内は引数としてDBAccessから送られてきた三つの変数です(受け取ったら戻り値になるんでしたっけ?)。
public ArrayList Own(String title , String writer , String company) throws SQLException{
// SQLで行う処理を記入 今回はbooksテーブルの条件に合致するすべてのデータを取り出したいので以下のコードです。
sql = “select * from books where title like ? and writer like ? and company like ?”;
//以下はSQLを実行するためのコードだったと思います(うろ覚え)。これ書かなきゃいけない理由は分かりません。調べてもこう動く、こう書くとしか出てきませんでした。ご教示よろしくお願いします。
PreparedStatement ps = null;
//これが確か、dtoにつなげるためのコードだったと思います。結果が検索内容によって変わるのでnull。
ResultSet rs = null;
// Listメソッドの作成 メソッドには上記sqlの?に入れるカラム名が入る
ArrayList list = new ArrayList();
//例外処理ですね。起こりそうな例外を書きます。
try {
// プレースホルダを設定 やはりprepareStatementがあるためSQLを動かしたい
ps = con.prepareStatement(sql);
//上記sql=の中の?に入る変数。昨日のファイルにもあるtitleという引数を入れます。
ps.setString(1, “%”+title+”%”);
//上記にほぼ同様の処理です。
ps.setString(2, “%”+writer+”%”);
//上記にほぼ同じです。
ps.setString(3, “%”+company+”%”);
// SQL実行
rs = ps.executeQuery();
//検索したデータがすべて表示されるまで繰り返し取り出す
while(rs.next()) {
//itemメソッドの作成 ここでdtoファイルのitemインスタンスを作成。dtoファイルにとびます。
book item = new book();
// 本のタイトルを取得してitemへ格納
item.setTitle(rs.getString(“title”));
//本の著者を取得、itemへ
item.setWriter(rs.getString(“writer”));
//本の出版社を取得、itemへ
item.setCompany(rs.getString(“company”));
//itemメソッドに格納
list.add(item);
}
//これもリソースの開放
rs.close();
}finally {
//これもリソース(ry
ps.close();
}
//呼び出し元の上記listメソッドに返す
return list;
}
Dto
//このファイルは今まで登場した三つの変数を一つの箱として結果に渡すダンボール箱の役割を持っています。変数を受け取ってもどこに格納するかを指定します(自信あり)。
//前言撤回です。こんな感じだろうなとかいたので細かいところは説明できません。
public class book implements Serializable{
private static final long serialVersionUID = 1L;
// タイトル
public String title;
// 著名
public String writer;
// 出版社
public String company;
// ゲッター/セッター
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getWriter() {
return writer;
}
public void setWriter(String writer) {
this.writer = writer;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company =company ;
}
}
本の検索に関してはこの辺で。 諸先輩方、ご意見や間違いの指摘、お願いします。