SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Cyber Luxeonで学ぶXMLDB入門

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

Cyber Luxeonで学ぶXMLDB入門 第6回


  • X ポスト
  • このエントリーをはてなブックマークに追加

商品データ(商品XML)更新処理

画面遷移

 商品情報更新処理の画面遷移を以下の図に示します。

商品情報更新処理の画面遷移
商品情報更新処理の画面遷移

 「商品情報更新」画面は、商品一覧上の該当商品の「編集」ボタンを押下することによって表示されます。商品情報を画面上で編集後「更新」ボタンを押下することによって、編集内容をXMLDBに反映します。

 なお、商品データ更新画面は、HTMLから渡された商品コードを元に、商品を検索し、画面に表示しますが、商品名検索機能と説明が重複しますので、ここでは割愛させていただき、「更新」ボタンが押下された場合のXMLデータ更新処理のみについて説明します。

コントローラ(ItemCRUDServlet)

 コントローラとなるサーブレットでは、HTMLから「action="update"」いうパラメータを受け取り、商品データ(商品XML)更新処理を実行します。

  1. 画面入力されたリクエストパラメータを元にItemクラスを生成し値を格納する(createItemメソッド)
  2. ItemDaoのupdateメソッドを呼び出す
  3. 商品一覧画面(list.jsp)にForwardする

 以下にItemCRUDServletのソースを示します。

ItemCRUDServlet.java
}else if (action.equals("update")) {
    // 【商品更新】更新処理→一覧表示    
    Item item = createItem( req );
    
    try {
        int cnt = itemDao.update( item );
    } catch (Exception e) {
        e.printStackTrace();
        forwardToErrorPage( req , res );
        return;
    }
    forwardToList(req, res);

Daoクラス

ItemDaoImplクラス

 次にサーブレットから呼ばれるItemDaoImplクラスの実装を説明します。ItemDaoImplクラスのupdateメソッドでは、以下の順でXML更新処理を実行します。

  1. XUGのテンプレートファイル上で変換するオブジェクトを作成し、Mapに格納
  2. LuxeonDaoクラスのupdateXMLメソッドを呼び出し、XQueryを実行
  3. 更新件数を戻す

 以下にItemDaoImplクラスのupdateメソッドのソースを示します。

ItemDaoImpl.java
public class ItemDaoImpl implements ItemDao{

    private static final String TEMPLATE_RESOURCE_PATH
       = "/jp/beproud/sample/ecitem/dao/template/";

    // ~省略~

    public int update(Item item) throws Exception{
        Map<String, Object> templeteMap
           = new HashMap<String, Object>();
        templeteMap.put( "item" , item );

        return LuxeonDao.updateXML(
            "items/" + item.getItemCode() + ".xml" ,
            TEMPLATE_RESOURCE_PATH + "Item_update.vm" , templeteMap );
    }

LuxeonDaoクラス

 ItemDaoImplのupdateメソッドから呼ばれるLuxeonDaoクラスのupdateXMLメソッドは以下の順でXML更新処理を実行します。なお、サンプルアプリケーションでは、XMLの更新に、xmlupdategram(Cyber Luxeonの独自XML更新言語。以下XUG)を用います。XUGの詳細については、Cyber Luxeonで学ぶXMLDB入門 第3回を参照してください。XUGの文字列の生成には検索処理と同様、Velocityを採用しています。

  1. セッション、XMLStore、検索対象XML(バインダドキュメント)を取得
  2. Velocityを使用してXQueryのテンプレートと実際のオブジェクト値をマージしてXUGの文字列を取得
  3. XUGの実行
  4. 更新結果件数を戻す
  5. セッションを閉じる

 以下にLuxeonDaoクラスのupdateXMLメソッドのソースを示します。

LuxeonDao.java
public class LuxeonDao {

    // ~省略~

    public static int updateXML
        (String xmlName,
         String templateName, 
         Map<String, Object> templateObjMap )
           throws Exception{

        Session clientSession = null;
        
        VelocityWrapper vw = new VelocityWrapper();
        vw.put( templateObjMap );
        String xugStr = vw.merge( templateName );
            
        try {
            clientSession = XlnClientSessionFactory.getSession();
            Update xug = clientSession.createUpdate( xugStr );
            return xug.execute(
                xmlName, clientSession.getXMLStore(XML_STORE_NAME) );
            
        }finally{
            if ( clientSession != null ) clientSession.release();
        }
    }

 以下にサンプルアプリケーションで使用するXUG(Velocityテンプレートファイル)を以下に示します。

Item_update.vm(XML更新用のXUGテンプレートファイル)
<?xml version="1.0" encoding="UTF-8"?>
<xlnupdate version="1.0">
  <update select="/item/item_name/text()">
    <text>$item.itemName</textn
  </updaten
  <update select="/item/price/text()"n
    <textn$item.price</text>
  </update>
  <update select="/item/description/caption/text()">
    <text>$item.description.caption</text>
  </update>
  <update select="/item/description/header/text()">
    <text>$item.description.header</text>
  </update>
  <update select="/item/description/footer/text()">
    <text>$item.description.footer</text>
  </update>
  <update select="/item/option_name/text()">
    <text>$item.optionName</text>
  </update>

  <remove select="/item/options"></remove>
  <update select="/item/option_name">
    <element location="after">
      <options/>
    </element>
  </update>

#foreach ( $option in $item.options)
  <update select="/item/options">
    <element location="lastchild">
      <option>$option</option>
    </element>
  </update>
#end
</xlnupdate>

次のページ
商品情報(商品XML)削除処理

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Cyber Luxeonで学ぶXMLDB入門連載記事一覧

もっと読む

この記事の著者

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

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

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

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

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/1452 2008/08/19 20:41

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング