まず注文システムのレイヤ構成を図2に示す。Nexawebを利用したからといって、一般的なJSP/Servletを利用したWebアプリケーションの構成と大きく変わるところはない。
図2:注文システムのレイヤ構成 (画像をクリックすると別ウィンドウに拡大図を表示します)
この注文システムの動作概要としては、画面からのリクエストをサーブレットが受け取り、プレゼンテーション層に配置されたコントローラ「ProductController」を呼び出している。コントローラは画面からのリクエスト、例えばすべての商品の一覧を取得する処理をビジネス層に配置されるビジネスロジック「ProductServcie」に委譲している。そしてProductServiceはProductDaoを利用してデータアクセス層からデータ(今回はデータベースから)を取得する。
ProductDaoがデータベースから取得した商品に関するデータは、最初にProductエンティティに格納されている。その後、プレゼンテーション層で扱いやすいように属性やメソッドの追加などを行い、拡張したトランスファーオブジェクトProductToクラスに格納し直してプレゼンテーション層に渡している。
コントローラやビジネスロジック、DAOはNexawebに依存せず、一般的なJavaによるWebアプリケーションと同じようにプログラミングを行う。一般的にWebアプリケーションを作成する際は、プレゼンテーション層ならば「Struts」、データアクセス層では「Hibernate」など、何かしらのフレームワークを利用する。今回はSpring Framework(以下、Spring)を利用しよう。
SpringはDIコンテナとして有名だが、実はDIコンテナ以外にもデータアクセス層ならSpringJDBC、プレゼンテーション層にSpringMVCというように、すべての層をカバーするフレームワークでもある。今回はSpringについては詳しくは説明しない。すでに多くの書籍や記事が公開されていますので、そちらを参照してほしい。
ProductServiceにはすべての商品の一覧を取得する「findAllProduct」などのビジネスロジックを定義する(リスト2)。データベースへのデータアクセスを行う「ProductDao」はリスト3のように定義する。なお今回はSpringやWebアプリケーションの作成方法については詳しく解説しないので、両クラスとも商品の一覧を取得するメソッドしか定義しておらず、その実装も最低限の実装しか行っていない。
リスト2:ProductService
public interface ProductService {
List<ProductTo> findAllProduct();
boolean isStock(int id, int purchase);
ProductTo findProduct(int id);
}
リスト3:ProductDao
public interface ProductDao {
List<Product> findAllProduct();
boolean isStock(int id, int purchase);
}
ProductServiceやProductDaoはSpringのDIコンテナが管理するBeanとして定義し、トランザクション管理もSpringを利用する。それらのBeanを定義したファイル(Bean定義ファイル)を「WEB-INF/applicationContext.xml」として配置している。
リスト4:Bean定義ファイル
(画像をクリックすると別ウィンドウに拡大図を表示します)
少しBean定義ファイルについて説明しておこう。リスト4-(1)はインターフェース「ProductService」を実装したクラス「ProductServiceImpl」を定義している部分だ。リスト4-(2)のpropertyタグを用いて、リスト4-(3)で定義されている「ProductServiceImpl」が依存するデータアクセスを行うインターフェース「ProductDao」を実装したクラスのインスタンスをインジェクション(注入)している。
そのほかにもBean定義ファイルには、トランザクション管理の定義やリスト4-(3)で定義したProductDaoを実装するクラス「ProductDaoImpl」が利用する、データベースへの接続情報などといったデータソースの定義などが記述されている。
|