mb_language("uni"); mb_internal_encoding("utf-8"); mb_http_input("auto"); mb_http_output("utf-8"); ?>
WINGSプロジェクト 佐藤 治夫 (株式会社ビープラウド) [著], 山田 祥寛 [監修]
出典:開発者のための実装Webマガジン「Codezine」(株式会社翔泳社)
はじめに
前回は、APIチュートリアル編として、サンプルアプリケーションで主に使用するJAXB API(クラス・アノテーション)とCyber Luxeon Java APIについて説明しました。実装編となる本稿では前回説明したAPIを用いて、XML DBのCRUD(生成・抽出・更新・削除)処理を中心としたサンプルアプリケーションを実装していきます。
対象読者
XMLに触れたことがある方、RDBなどデータベースを操作したことがある方、Javaでプログラミングしたことがある方を対象とします。
必要な環境
サンプルアプリケーションの仕様
サンプルアプリケーションは、あるECサイトの商品データを管理するためのアプリケーションで、商品データの新規登録・検索・更新・削除処理を行います。仕様の全体像については、Cyber Luxeonで学ぶXML DB入門 第4回を参照してください。
サンプルアプリケーションのディレクトリ・ファイル構成
本稿のサンプルアプリケーションは、JavaのWebアプリケーションです。以下にサンプルアプリケーションのファイル構成を示します。
* $TOMCAT_HOME/lib/ o dxeclient.jar(Luxeon API JARファイル) o dxebind.jar o dxeconnector.jar o dxeserver.jar * ecitem/ (WebアプリケーションHome) o 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アプリケーション定義ファイル)
クラスの構成
クラスの全体像
まずは、サンプルアプリケーションを構成するJavaクラスの全体像を以下のクラス図に示します。
上記のうち、XML DBレイヤーはCyber Luxeonで用意されているJava APIですので、実際にサンプルアプリケーションで実装するのは「オブジェクトレイヤー」と「オブジェクト/XML変換レイヤー」になります。
各レイヤーの関係を示した図を以下に示します。
コントローラクラス
処理全体のフローを制御するコントローラは、サーブレット(ItemCRUDServlet)で実装します。「action="処理名"」という形式でHTMLのhiddenに埋め込まれた処理名をもとに、if文で分岐し、該当する処理を実行します。実業務のアプリケーションでは、StrutsなどのWebアプリケーションフレームワークを用いて制御するところですが、サンプルアプリケーションを極力シンプルな構造にするために、本稿ではコントローラとして、サーブレットを用いています。
エンティティクラス
次に、各処理で共通で使用する商品エンティティクラス(Itemクラス)について説明します。サンプルではJAXB2.0のアノテーションを使用して、JavaクラスとXMLを関連付けして、オブジェクトとXMLデータの相互変換を行います。JavaクラスとXMLのマッピングの関係を以下の図に示します。
■オブジェクト、XMLの関連
XMLのitem要素には、Itemクラスが対応します。そしてitem要素の子要素であるitem_code、item_name、price、description、options、reg_dateはItemクラスのインスタンス変数とマッピングし、それぞれにアクセッサメソッド(publicのインスタンス変数も可)を用意しています。またitem要素の子要素であるdescriptionにはDescriptionクラスが対応し、別クラスとして定義しています。以下に、JAXBのアノテーションを記述したItemクラスのソースの抜粋を示します。
Daoクラス
Daoクラスは、ItemDaoImplクラスとLuxeonDaoクラスに実際の処理が実装されています。
ItemDaoインターフェイスとItemDaoImplクラス
ItemDaoImplクラスはItemDaoインターフェイスを実装しており、Daoクラスを呼び出す側がバックエンドのデータソースに依存しないようになっています。
以下にItemDaoインターフェイスのソースを示します。
ItemDaoImplクラスには、アプリケーションに依存した商品データの操作処理が実装されています。またItemDaoImplクラスでは、LuxeonDaoクラスを呼び出すことによって、Cyber Luxeonに依存した実装になっています。バックエンドに異なるデータソースを採用するような場合には、別の実装(Impl)クラスを作成します。 ItemDaoImplクラスの実装詳細は後述のアプリケーションの各処理の説明で説明します。
ItemDaoFactoryクラス
ItemDaoFactoryには、ItemDaoのファクトリメソッドが実装されており(createDaoメソッド)、インスタンスを返す処理が記述されています。以下にItemDaoFactoryクラスのソースを示します。
LuxeonDaoクラス
Cyber Luxeonのデータを操作するための汎用的な処理が実装されています。例えば、XML新規作成処理(createXMLメソッド)、XQuery実行処理(executeXQueryメソッド)、XUG実行処理(updateXMLメソッド)、XML削除処理(deleteXMLメソッド)などです。これらの処理はアプリケーションの仕様に関係なく使用することができる汎用メソッドです。
アプリケーション各処理の説明
クラスの全体的な構成の説明が終わったところで、アプリケーションの仕様に従って、商品データ(商品XML)のデータ処理について説明していきます。
商品データ(商品XML)新規作成処理
まずはXMLの新規作成処理について説明します。
画面遷移
商品情報 新規登録の画面遷移を以下の図に示します。
■商品情報 新規登録の画面遷移
「商品情報 新規登録」画面は、商品一覧の新規登録ボタンを押下すると表示されます。「商品情報 新規登録」画面で商品情報を入力し「新規登録」ボタンを押下すると、XML DBに商品データが新規XMLとして作成されます。
「商品情報 新規登録」画面の表示処理は、ただ単にJSPを表示するだけですので、説明は割愛し「新規登録」ボタンが押下された場合のXMLデータ保存処理について説明します。
コントローラ(ItemCRUDServlet)
コントローラとなるサーブレットでは、HTMLから「action="create"」というパラメータを受け取り、以下の順で、XMLデータ新規作成処理を実行します。
以下にItemCRUDServletのソースを示します。
注
以下のItemCRUDServletのソースでは、サーブレットのクラス定義、インスタンス変数、initメソッド、doServiceの記述は省略します。 |
注 以下のItemCRUDServletのソースでは、サーブレットのクラス定義、インスタンス変数、initメソッド、doServiceの記述は省略します。
Daoクラス
ItemDaoImplクラス
ItemDaoImplクラスのcreateメソッドでは、以下の2つの処理を行っています。
以下にItemDaoImplクラスのcreateメソッドのソースを示します。
LuxeonDaoクラスのcreateXMLメソッドの第1引数には、サーブレットで画面入力値を元に生成したItemクラスのインスタンス、第2引数には、Cyber Luxeon上のXMLのファイル名を渡しています。XMLを保存するパス名のルールは「XMLStoreのルートディレクトリからのパス(/items)/商品コード(Cen001).xml」です。また、XML作成後、バインダドキュメントにXMLへのリンクを設定しています。こうすることにより、複数のXMLを束ねて1つのXMLとして検索する処理を実現しています。
以下の図は、新規登録処理後に作成したXMLをDXE Managerで参照した画面です。
■XML新規登録後をDXE Managerで参照
新規に作成したXML(items/Cen001.xml)とバインダドキュメント(item_container.bnd)とバインダドキュメント上に作成されたリンクが確認できます。
LuxeonDaoクラス
次にItemDaoImplクラスのcreateメソッドから呼ばれるLuxeonDaoクラスのcreateXMLメソッドの説明をします。LuxeonDaoクラスはCyber LuxeonのJava APIとJAXB2.0を使用して実際にXMLをDBに保存する処理を以下の順で実行しています。
以下にLuxeonDaoクラスのcreateXMLメソッドのソースを示します。
■著者紹介■ |
WINGSプロジェクト 佐藤 治夫 (株式会社ビープラウド) (サトウ ハルオ) <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカルライティング・プロジェクト。海外記事の翻訳から、主にサーバサイド分野の書籍・雑誌/Web記事の執筆、講演、アプリケーション開発等を幅広く手がける。2005年9月時点での登録メンバは20名で、現在も一緒に執筆をできる有志を募集中。執筆に興味のある方は、どしどし応募頂きたい。CodeZine記事は、WINGSプロジェクト執筆/山田祥寛監修で今後も続々公開予定。 山田 祥寛 (ヤマダ ヨシヒロ) 静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「入門シリーズ(サーバサイドAjax/XML DB/PEAR/Smarty)」「独習シリーズ(ASP.NET/PHP)」「10日でおぼえる入門教室シリーズ(ASP.NET/PHP/Jakarta/JSP&サーブレット/XML)」「Pocket詳解辞典シリーズ(ASP.NET/PHP/Perl&CGI)」「今日からつかえるシリーズ(PHP/JSP&サーブレット/XML/ASP)」「書き込み式 SQLのドリル」他、著書多数。 |
▲このページのTOPへ