広告

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
                      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. 不許無断複製