Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

XMLDBとJavaAPI、JAXB2.0を活用したWebアプリケーション開発(実装編)

Cyber Luxeonで学ぶXMLDB入門 第6回

  • LINEで送る
  • このエントリーをはてなブックマークに追加

XMLデータベース「Cyber Luxeon」を使ったJavaアプリケーションについて、Cyber Luxeon上のデータを操作するサンプルアプリケーションを例に解説します。今回は実際にアプリケーションを実装します。

目次

はじめに

 前回は、APIチュートリアル編として、サンプルアプリケーションで主に使用するJAXB API(クラス・アノテーション)とCyber Luxeon Java APIについて説明しました。実装編となる本稿では前回説明したAPIを用いて、XMLDBのCRUD(生成・抽出・更新・削除)処理を中心としたサンプルアプリケーションを実装していきます。

過去の記事

対象読者

 XMLに触れたことがある方、RDBなどデータベースを操作したことがある方、Javaでプログラミングしたことがある方を対象とします。

必要な環境

サンプルアプリケーションの仕様

 サンプルアプリケーションは、ある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アプリケーション定義ファイル)

クラスの構成

クラスの全体像

 まずは、サンプルアプリケーションを構成する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の関連
オブジェクト、XMLの関連

 XMLのitem要素には、Itemクラスが対応します。そしてitem要素の子要素であるitem_codeitem_namepricedescriptionoptionsreg_dateはItemクラスのインスタンス変数とマッピングし、それぞれにアクセッサメソッド(publicのインスタンス変数も可)を用意しています。またitem要素の子要素であるdescriptionにはDescriptionクラスが対応し、別クラスとして定義しています。以下に、JAXBのアノテーションを記述したItemクラスのソースの抜粋を示します。

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インターフェイスのソースを示します。

ItemDao.java
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クラスのソースを示します。

ItemDaoFactory.java
public class ItemDaoFactory {
    
    /**
* @return
*/
public static ItemDao createDao() { return new ItemDaoImpl(); } }

LuxeonDaoクラス

 Cyber Luxeonのデータを操作するための汎用的な処理が実装されています。例えば、XML新規作成処理(createXMLメソッド)、XQuery実行処理(executeXQueryメソッド)、XUG実行処理(updateXMLメソッド)、XML削除処理(deleteXMLメソッド)などです。これらの処理はアプリケーションの仕様に関係なく使用することができる汎用メソッドです。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XMLD...

  • WINGSプロジェクト 佐藤 治夫 (株式会社ビープラウド)(サトウ ハルオ)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂...

バックナンバー

連載:Cyber Luxeonで学ぶXMLDB入門
All contents copyright © 2005-2018 Shoeisha Co., Ltd. All rights reserved. ver.1.5