はじめに
前回は、APIチュートリアル編として、サンプルアプリケーションで主に使用するJAXB API(クラス・アノテーション)とCyber Luxeon Java APIについて説明しました。実装編となる本稿では前回説明したAPIを用いて、XMLDBのCRUD(生成・抽出・更新・削除)処理を中心としたサンプルアプリケーションを実装していきます。
過去の記事
- 第1回:XMLDBとCyber Luxeonの基本
- 第2回:XMLデータの操作(前編) ~ XPath、XQuery
- 第3回:XMLデータの操作(後編) ~ XML updategramの基本
- 第4回:XMLDBとJavaAPI、JAXB2.0を活用したWebアプリケーション開発(設計編)
- 第5回:XMLDBとJavaAPI、JAXB2.0を活用したWebアプリケーション開発(APIチュートリアル編)
対象読者
XMLに触れたことがある方、RDBなどデータベースを操作したことがある方、Javaでプログラミングしたことがある方を対象とします。
必要な環境
- OS:Windows XP
- DB:Cyber Luxeon ver2.0 Developer Edition
- Java SE 6
- Tomcat 6.0.10
サンプルアプリケーションの仕様
サンプルアプリケーションは、あるECサイトの商品データを管理するためのアプリケーションで、商品データの新規登録・検索・更新・削除処理を行います。仕様の全体像については、Cyber Luxeonで学ぶXMLDB入門 第4回を参照してください。
サンプルアプリケーションのディレクトリ・ファイル構成
本稿のサンプルアプリケーションは、JavaのWebアプリケーションです。以下にサンプルアプリケーションのファイル構成を示します。
- $TOMCAT_HOME/lib/
- dxeclient.jar(Luxeon API JARファイル)
- dxebind.jar
- dxeconnector.jar
- dxeserver.jar
- ecitem/ (WebアプリケーションHome)
- WEB-INF
- classes/
- jp.beproud.sample.ecitemパッケージ(オブジェクトレイヤーのクラスを格納)
- jp.beproud.sample.ecitem.luxeonパッケージ(オブジェクト/XML変換レイヤーのクラスを格納)
- jp.beproud.sample.ecitem.dao.templateパッケージ XQuery、XUGのテンプレートファイル(Velocity)
- velocity.properties Velocity用のプロパティファイル
- jsp/(JSPを格納する)
- list.jsp
- editform.jsp
- lib/(ライブラリを格納する)
- jstl.jar(JSTL API Reference Implementation)
- standard.jar(jakarta-taglibs 'standard')
- velocity-1.5.jar(Velocity)
- velocity-dep-1.5.jar(Velocity依存ライブラリ)
- web.xml(J2EE WEBアプリケーション定義ファイル)
- classes/
- WEB-INF
クラスの構成
クラスの全体像
まずは、サンプルアプリケーションを構成するJavaクラスの全体像を以下のクラス図に示します。
上記クラス図では、役割ごとにクラスを3つのレイヤーに分類しています。各レイヤーは以下の表にまとめました。
レイヤー | 説明 |
オブジェクトレイヤー | オブジェクトのデータ操作を扱う |
オブジェクト/XML変換レイヤー | オブジェクトとXMLの相互変換を扱う |
XMLDBレイヤー | 物理的にXMLを保存するためのレイヤー |
上記のうち、XMLDBレイヤーはCyber Luxeonで用意されているJava APIですので、実際にサンプルアプリケーションで実装するのは「オブジェクトレイヤー」と「オブジェクト/XML変換レイヤー」になります。
各レイヤーの関係を示した図を以下に示します。
コントローラクラス
処理全体のフローを制御するコントローラは、サーブレット(ItemCRUDServlet)で実装します。「action="処理名"」という形式でHTMLのhiddenに埋め込まれた処理名をもとに、if文で分岐し、該当する処理を実行します。実業務のアプリケーションでは、StrutsなどのWebアプリケーションフレームワークを用いて制御するところですが、サンプルアプリケーションを極力シンプルな構造にするために、本稿ではコントローラとして、サーブレットを用いています。
エンティティクラス
次に、各処理で共通で使用する商品エンティティクラス(Itemクラス)について説明します。サンプルではJAXB2.0のアノテーションを使用して、JavaクラスとXMLを関連付けして、オブジェクトとXMLデータの相互変換を行います。JavaクラスとXMLのマッピングの関係を以下の図に示します。
XMLのitem
要素には、Itemクラスが対応します。そしてitem
要素の子要素であるitem_code
、item_name
、price
、description
、options
、reg_date
はItemクラスのインスタンス変数とマッピングし、それぞれにアクセッサメソッド(publicのインスタンス変数も可)を用意しています。またitem要素の子要素であるdescription
にはDescriptionクラスが対応し、別クラスとして定義しています。以下に、JAXBのアノテーションを記述したItemクラスのソースの抜粋を示します。
import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; // ~省略~ @XmlRootElement(name="item") @XmlType(propOrder={ "itemCode","itemName", "price" , "description" , "optionName" , "options" , "regDate" }) public class Item { private String itemCode; private String itemName; private int price; private Description description; private String optionName; private List<String> options = new ArrayList<String>(); private Date regDate; @XmlAttribute(name="item_code") public String getItemCode() { return itemCode; } @XmlElement(name="price") public int getPrice() { return price; } // ~省略~ @XmlElementWrapper(name="options") @XmlElement(name="option") public List<String> getOptions() { return options; } }
Daoクラス
Daoクラスは、ItemDaoImplクラスとLuxeonDaoクラスに実際の処理が実装されています。
ItemDaoインターフェイスとItemDaoImplクラス
ItemDaoImplクラスはItemDaoインターフェイスを実装しており、Daoクラスを呼び出す側がバックエンドのデータソースに依存しないようになっています。
以下にItemDaoインターフェイスのソースを示します。
public interface ItemDao { public void create(Item item) throws JAXBException,IOException; public List<Object> findByItemName(String itemName) throws IOException,JAXBException,Exception; public List<Object> findByItemCode(String itemCode) throws IOException,JAXBException,Exception; public int update(Item item) throws Exception; public boolean delete(String itemCode);
ItemDaoImplクラスには、アプリケーションに依存した商品データの操作処理が実装されています。またItemDaoImplクラスでは、LuxeonDaoクラスを呼び出すことによって、Cyber Luxeonに依存した実装になっています。バックエンドに異なるデータソースを採用するような場合には、別の実装(Impl)クラスを作成します。ItemDaoImplクラスの実装詳細は後述のアプリケーションの各処理の説明で説明します。
ItemDaoFactoryクラス
ItemDaoFactoryには、ItemDaoのファクトリメソッドが実装されており(createDao
メソッド)、インスタンスを返す処理が記述されています。以下にItemDaoFactoryクラスのソースを示します。
public class ItemDaoFactory { /**
* @return
*/ public static ItemDao createDao() { return new ItemDaoImpl(); } }
LuxeonDaoクラス
Cyber Luxeonのデータを操作するための汎用的な処理が実装されています。例えば、XML新規作成処理(createXML
メソッド)、XQuery実行処理(executeXQuery
メソッド)、XUG実行処理(updateXML
メソッド)、XML削除処理(deleteXML
メソッド)などです。これらの処理はアプリケーションの仕様に関係なく使用することができる汎用メソッドです。