広告 |
---|
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 2010年01月31日 Java総合講座 - 初心者から達人へのパスポート vol.189 セルゲイ・ランダウ バックナンバー: http://www.flsi.co.jp/Java_text/ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ ------------------------------------------------------- ・現在、このメールマガジンは以下の2部構成になっています。 [1] 当初からのコース:毎週日曜の夜に発行 これは現在、中級レベルになっています。 [2] 2009年11月開講コース:毎週水曜の夜に発行 これは現在、初心者向けのレベルになっています。 ・このメールマガジンは、画面を最大化して見てください。 小さな画面で見ていると、不適切な位置で行が切れてしまう など、問題を起すことがあります。 ・このメールマガジンに掲載されているソース・コード及び 文章は特に断らない限り、すべて筆者が著作権を所有してい ます。また、これらのソース・コードは学習用のためだけに 提供しているものです。 ------------------------------------------------------- ======================================================== ◆ 01.Strutsのアプリケーション開発 ======================================================== さて、itemSelect.jspを作成しましたが、このitemSelect.jspのWebページに キーワードなどを入力して「商品検索」ボタンを押せば、データベースを検索 して商品のリストをitemList.jspのWebページで返してくるわけです。 早めにアプリケーションを動かしてみたいと思う人も多いようなので、この部分 だけを先に作成して、動かしてみることにしましょう。 ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ では、まず、データベースへのアクセスのために、予めテスト用のデータを ロードしておくことにしましょう。 (1) EclipseでDBViewerパースペクティブを開きます。 (2) 「DBツリー・ビュー」の中のSTRUSHOPを右クリックし、「接続」を 選択します。 (3) 「SQL実行・ビュー」に以下のSQLを入力してください。 -------------------------------------------------------- insert into CATEGORY values ('00001', '食品'); / insert into CATEGORY values ('00002', '雑貨'); / insert into CATEGORY values ('00003', '文具'); / -------------------------------------------------------- (DBViewerでは、複数のSQL文を入力するときには、上記のように スラッシュ(/)の行で分けることになっています。なお、スラッ シュは、SQL文にくっつけるのではなく、上記のように独立した行に します。) 入力が終わったら、「全てのSQLを実行」ボタン(緑色の右向き矢印 というより三角形のボタン)をクリックしましょう。 なお、DBViewerのデフォルトでは自動コミットになっていないため、 このあと自分で「コミット」ボタン(円筒形のアイコンのボタンが 2つあるが、左側のが「コミット」ボタン)をクリックしてコミット しておく必要があります。(コミットしておいてください。) 面倒だと思う人は、「M」ボタン(Mという文字のアイコンのボタン) の右側の三角形ボタンをクリックして「Auto Commit」を選択するか、 または、「M」ボタン自体をクリックすると、自動コミットになります ので、この操作を行っておきましょう。 以後、当メールマガジンでは、DBViewerを自動コミットにしていること を前提としてお話していきます。 すでにCATEGORYテーブルの中身を表示していた人は、ここで 「DBツリー・ビュー」の中のSTRUSHOP配下のstrushop配下のTABLE配下 のcategoryを右クリックし、「更新」を選択すると、最新のデータの 内容が表示されます。 DBViewerにおける他の細かいデータの操作方法については、vol.084等 を復習して下さい。 (4) 今度は、「SQL実行・ビュー」に以下のSQLを入力してください。 -------------------------------------------------------- insert into ITEM values ('F0001', '製品001', 100, '/images/product001.jpg', '00001', 10); / insert into ITEM values ('F0002', '製品002', 110, '/images/product002.jpg', '00001', 10); / insert into ITEM values ('G0003', '製品003', 120, '/images/product003.jpg', '00002', 10); / insert into ITEM values ('G0004', '製品004', 130, '/images/product004.jpg', '00002', 10); / insert into ITEM values ('S0005', '製品005', 140, '/images/product005.jpg', '00003', 10); / insert into ITEM values ('S0006', '製品006', 150, '/images/product006.jpg', '00003', 10); / -------------------------------------------------------- 入力が終わったら、「全てのSQLを実行」ボタン(緑色の右向き矢印 というより三角形のボタン)をクリックしましょう。(自動コミット にしていることを前提としてお話しています。) では、STRUSHOPデータベースを切断(「DBツリー・ビュー」の中のSTRUSHOP を右クリックし、「切断」を選択)し、「Java EE」パースペクティブに 戻しておきましょう。 ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ さて、今回のアプリケーションでもLog4jを使ってログを取っていくことに します。 ところが、Axisのアプリケーションのときと違い、TomcatやStrutsには Log4jのAPIは含まれていませんので、別途、自分でクラスパスに登録して おく必要があります。 というわけで、ここでその作業を行っておきましょう。 まず、Log4jをダウンロードしておきましょう。 (1) Webブラウザーで http://logging.apache.org/log4j/1.2/download.html を開き、(表の中で「Apache log4j 1.2.15 (zip)」の行と「Mirrors」の列 の交差するところにある) apache-log4j-1.2.15.zip をクリックします。 (2) そのWebページの上のほうにある http://ftp.riken.jp/net/apache/logging/log4j/1.2.15/apache-log4j-1.2.15.zip というリンクをクリックしましょう(このリンクが使用不可能なときは他のリンク でもよい)。 (3) 画面の指示に従って、ファイルをわかりやすい場所に保存しましょう。 (このメールマガジンの発刊の現時点では) apache-log4j-1.2.15.zip というファイル名になっているはずです。 (4) Webブラウザーはもう用はないので閉じ、先ほど保存したapache-log4j-1.2.15.zip を解凍して下さい。 解凍してできたフォルダーの中にlog4j-1.2.15.jarというファイルがある はずですが、これがLog4jの本体です。 このファイルをフォルダー C:\JavaWorkSpace の中にコピーしましょう。つまり、 C:\JavaWorkSpace\log4j-1.2.15.jar というファイルにします。 これをEclipseのクラスパスに登録しましょう。 今回も簡易的なやり方で登録することにします。 (1) プロジェクト・エクスプローラー内のStrutsShop(プロジェクト)を 右クリックし、「ビルド・パス」→「ビルド・パスの構成」を選択します。 (2) 「StrutsShopのプロパティー」ウインドウの右側の「ライブラリー」タブをクリック し、「外部JARの追加」ボタンをクリックします。 (3) 「JARの選択」ウインドウにおいて、先ほどのJARファイル、すなわち C:\JavaWorkSpace配下のlog4j-1.2.15.jarを選択し、「開く」ボタンを クリックします。 (4) 「StrutsShopのプロパティー」ウインドウの「OK」ボタンをクリックします。 ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ では、このデータベースへアクセスするためのJavaのプログラムを作成 しておきましょう。 まずはAxisのアプリケーションのときと同様にExceptionのクラスを作成 しておきます。 (1) プロジェクト・エクスプローラー内のStrutsShop(もしくは、さらに その配下の「Javaリソース: src」)を右クリックし、「新規」→「パッケージ」 を選択します。 (2) 「名前」欄に jp.co.flsi.lecture.struts.db と入力し、「完了」ボタンをクリックします。 (3) 続いて、プロジェクト・エクスプローラー内でjp.co.flsi.lecture.struts.dbを 右クリックし、「新規」→「クラス」を選択します。 (4) 「名前」欄に StruShopDbException と入力し、「スーパークラス」欄にはjava.lang.Exceptionを指定して、 「完了」ボタンをクリックします。 (5) StruShopDbException.javaのエディターが開いたら、下記のように 編集しましょう。 -------------------------------------------------------- package jp.co.flsi.lecture.struts.db; public class StruShopDbException extends Exception { public StruShopDbException() { } public StruShopDbException(String message) { super(message); } public StruShopDbException(Throwable cause) { super(cause); } public StruShopDbException(String message, Throwable cause) { super(message, cause); } } -------------------------------------------------------- 続いて、データベースへのアクセスのための基本的な処理(データベースへの 接続と切断)を行うクラスを作成しましょう。 (1) プロジェクト・エクスプローラー内でjp.co.flsi.lecture.struts.dbを右クリック し、「新規」→「クラス」を選択します。 (2) 「名前」欄に DbManager と入力し、「完了」ボタンをクリックします。 (3) DbManager.javaのエディターが開いたら、下記のように編集しましょう。 -------------------------------------------------------- package jp.co.flsi.lecture.struts.db; import java.sql.SQLException; import java.sql.Connection; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.sql.DataSource; import org.apache.log4j.Logger; public class DbManager { protected Connection conn = null; private static Logger logger = Logger.getLogger(DbManager.class); public void connect() throws StruShopDbException { logger.info("Start ..............."); try{ if (conn == null || conn.isClosed()) { Context initCtx = new InitialContext(); if(initCtx == null) throw new StruShopDbException("Error: InitialContext could not be generated!"); DataSource ds = (DataSource) initCtx.lookup("java:comp/env/jdbc/STRUSHOP"); if (ds != null) { conn = ds.getConnection(); if(conn == null) throw new StruShopDbException("Error: Connection does not exist!"); else logger.info("Connection has been gotten."); } else { throw new StruShopDbException("Error: DataSource does not exist!"); } } } catch (NamingException e) { logger.error(e, e); throw new StruShopDbException("Error: Connect() failed!", e); } catch (SQLException e) { logger.error(e, e); throw new StruShopDbException("Error: Connect() failed!", e); } catch (StruShopDbException e) { logger.error(e, e); throw new StruShopDbException("Error: Connect() failed!", e); } catch (Throwable e) { logger.error(e, e); } finally { logger.info("End ..............."); } } public void disconnect() { logger.info("Start ..............."); try { conn.close(); } catch(SQLException e) { logger.error(e, e); } catch (Throwable e) { logger.error(e, e); } finally { logger.info("End ..............."); } } } -------------------------------------------------------- 続いて、商品カテゴリーのテーブル(CATEGORY)にマッピングするエンティティー のクラスとして(マッピングやエンティティーの意味を忘れた人はvol.038 を復習のこと)、Categoryというクラスを作成しましょう。 (1) プロジェクト・エクスプローラー内でjp.co.flsi.lecture.struts.dbを右クリック し、「新規」→「クラス」を選択します。 (2) 「名前」欄に Category と入力し、「完了」ボタンをクリックします。 (3) Category.javaのエディターが開いたら、下記のように編集しましょう。 -------------------------------------------------------- package jp.co.flsi.lecture.struts.db; public class Category { private String num; private String name; public void setNum(String num) { this.num = num; } public String getNum() { return num; } public void setName(String name) { this.name = name; } public String getName() { return name; } } -------------------------------------------------------- 続いて、商品カテゴリーのテーブル(CATEGORY)へ検索を行うためのクラス を作成しましょう。 (1) プロジェクト・エクスプローラー内でjp.co.flsi.lecture.struts.dbを右クリック し、「新規」→「クラス」を選択します。 (2) 「名前」欄に CategoryDbManager と入力し、「完了」ボタンをクリックします。 (3) CategoryDbManager.javaのエディターが開いたら、下記のように編集しましょう。 ┌補足─────────────────────────┐ このクラスでは(以後、他のクラスでも同様ですが)、 ReflectionToStringMakerを使用していることに注意して下さい。 ReflectionToStringMakerはリフレクションの機能を使用して いますから、パフォーマンス(処理性能)が要求される現実の インターネット・ショッピングのアプリケーションでは使用す べきではありません。 └───────────────────────────┘ -------------------------------------------------------- package jp.co.flsi.lecture.struts.db; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Vector; import jp.co.flsi.lecture.reflect.ReflectionToStringMaker; import org.apache.log4j.Logger; public class CategoryDbManager extends DbManager { private static final String selectNameSql = "SELECT * FROM CATEGORY WHERE NAME LIKE ?"; private static Logger logger = Logger.getLogger(CategoryDbManager.class); public Vector<Category> getDataByName(String name) throws StruShopDbException { logger.info("Start ..............."); ReflectionToStringMaker stringMaker = new ReflectionToStringMaker(); logger.info("Method parameter: <<<<<" + stringMaker.getFields(name)); logger.info(">>>>>"); Vector<Category> categoryList = new Vector<Category>(); try { PreparedStatement selectPs = null; ResultSet rs; if (name == null) { name = ""; } selectPs = conn.prepareStatement(selectNameSql); selectPs.setString(1, "%"+ name + "%"); rs = selectPs.executeQuery(); while (rs.next()) { Category category = new Category(); category.setNum(rs.getString("NUM")); category.setName(rs.getString("NAME")); categoryList.add(category); } selectPs.close(); } catch (SQLException e) { logger.error(e, e); throw new StruShopDbException("Error: getDataByName() failed!", e); } catch (Throwable e) { logger.error(e, e); } finally { logger.info("End ..............."); } logger.info("Method return: <<<<<" + stringMaker.getFields(categoryList)); logger.info(">>>>>"); return categoryList; } } -------------------------------------------------------- (次回に続く) では、今日はここまでにします。 ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ★ホームページ: http://www.flsi.co.jp/Java_text/ ★このメールマガジンは 「まぐまぐ(http://www.mag2.com)」 を利用して発行しています。 ★バックナンバーは http://www.flsi.co.jp/Java_text/ にあります。 ★このメールマガジンの登録/解除は下記Webページでできます。 http://www.mag2.com/m/0000193915.html ★このメールマガジンへの質問は下記Webページにて受け付けて います。わからない所がありましたら、どしどしと質問をお寄 せください。 http://www.flsi.co.jp/Java_text/ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ Copyright (C) 2010 Future Lifestyle Inc. 不許無断複製 |