Adobe
製品
Acrobat
Creative Cloud
Creative Suite
Digital Marketing Suite
Digital Publishing Suite
Elements
Photoshop
Touch Apps
その他の製品一覧
ソリューション
デジタルマーケティング
デジタルメディア
教育
金融機関
Web Experience Management
その他のソリューション
ラーニング サポート ダウンロード 会社情報
ご購入
アドビストア 安心のサポート& サービス
アカデミックストア 学生、教職員、個人向け
アドビライセンスストア 中小企業向け
ボリュームライセンスについて 企業、教育機関、官公庁向け
販売パートナー
キャンペーン情報
検索
 
情報 サインイン
ようこそ、 さん カート 注文状況 マイアカウント
マイアカウント
注文状況
アカウント情報の変更
コミュニケーションの設定を変更
サインアウト
サインインの目的 お客様のアカウントや体験版ダウンロード、製品の拡張機能、コミュニティエリアへのアクセスなどを管理するため
Adobe
製品 セクション ご購入   検索  
ソリューション 会社情報
サポート ラーニング
サインイン サインアウト 注文状況 マイアカウント
先行予約の提供開始予定日Date. 商品が発送されるまで、クレジットカードには課金されません。提供開始の予定日は変更される場合があります。 先行予約の提供開始予定日Date. ダウンロードの準備が整うまで、クレジットカードには課金されません。提供開始の予定日は変更される場合があります。
個数:
ご購入には学生・教職員個人版の購入資格の確認が必要です。
小計
カートの中身を見る
Adobe Developer Connection / Flexデベロッパーセンター /

FlexBuilder3新機能 「データベースからアプリケーション作成」とサーバサイド3つのAssembler実装について

著者 河合 信敏氏

河合 信敏氏
  • NECソフト株式会社 勤務。現在、Flex User Groupで、n-kawaiのハンドル名で精力的に活動中。

Content

  • 実習内容について
  • 新規にプロジェクトを作成
  • データベースからアプリケーションを作成
  • HibernateAssembler版アプリケーションの作成
  • SQLAssembler版のアプリケーション作成
  • 応答時間について

作成日

21 April 2008

ページ ツール

Facebookでシェア
Twitterでツイート
LinkedInでシェア
ブックマーク
印刷

タグ

必要条件

この記事に必要な予備知識

この文書では、次の経験があることを前提として記述していますが、基礎的な知識があれば十分です。

  • FlexBuilder2か3でFlexアプリケーションを作成したことがある
  • Javaでプログラムを作成したことがある
  • J2EEサーバ(Tomcat等)を触ったことがある
  • MySQLを使用したことがある

ユーザーレベル

中級

サンプルファイル

  • materials.zip (4 KB)

その他の要件

必要なソフトウェア

必要となるソフトウェアは下記の通りです。

  • FlexBuilder3 トライアル版でも良い
    • 体験版
    • 購入

プラグイン版を使う場合は、Eclipse3.3 J2EE かPleiades WTPセット *1
Pleiadesプラグインを入れておくと英語メニューが日本語表示されます

  • LiveCycle Data Service ES 2.5.1 無償のExpress Editionで良い *2
    • 体験版
    • 資料請求およびお問い合わせ
  • Java SDK 5.0 1.5.0_15 もしくは6.0 *3
  • JBoss 4.2.2GA
  • MySQL5.0.51a
  • Hibernate LCDSにも付属
  • HibernateSychronizer3.1.9

*1 WTP:Web Tools Platformの略。以後WTPと記述します
*2 以後LCDSと記述します
*3 MacOS Xの場合はシステムに付属

配布マテリアル

materials.zip

 source
CreateTable.sql:実習用テーブルの作成
MakeTestData.sql:実習用テストデータ
additional_code.txt:入力するソースコードのコピー&ペースト用

はじめに

FlexBuilder3には「データベースからアプリケーション作成...」という機能が追加されました。この機能は、J2EEアプリケーションサーバー/データベースと連携するFlexアプリケーションの基本的な実装ソースコードを自動生成します。

ここでは操作手順 例 を説明するとともに、生成されるサーバー側のソースコード Java Assembler を若干の手順で差し替えることで、2つの実装 Hibernate Assembler, SQL Assembler でも流用できる例を紹介いたします。
データベーステーブルの参照・編集するようなアプリケーション開発においては、サーバ側のコードは、Javaコード/Hibernate/SQLという3つの選択肢があり、ちょっとした作業で実装が完了します。
ブラウザ側も、基本的なFlexコードは自動生成されるので、後はユーザインタフェースもしくはユーザエクスペリエンスの設計に工数を割く事ができるようになるかと思います。

実習内容について

1.実習内容について

この実習では、例として「購入したDVDソフトの情報の入力/一覧表示するシンプルなアプリケーションを作成する」という設定の題材とします。
テーブル設計は、正規化等難しいことは考えず、単一のテーブルとします。

2.実習用データベース・テーブルの準備

2-1.MySQL Query Browser等を利用して、配布マテリアル中のCreateTable.sqlでテーブルを作成してください

2-2.同様に、配布マテリアル中のMakeTestData.sqlでダミーのデータをテーブルに作成してください
 

3.JavaEEアプリケーションサーバのインストール

この実習内容はTomcatでも十分機能すると思いますが、WTPの操作も兼ねてJBossを試すことにします。
(WTPについては私自身習ったことはないので、説明する手順は私の自己流です)

3-1.JBossサイトからjboss-4.2.2.GA.zipをダウンロードし任意のフォルダに解凍します

3-2.環境変数"JBOSS_DIST"にJBossの解凍フォルダを設定します
 

4.WTPのインストール

この実習ではWTPプラグインを必要とします。
Eclipseプラグイン版をご使用で、すでにWTPがインストールされている場合はこのステップは必要ないので次の章に進んでください。

4-1.FlexBuilder3もしくはEclipseのメニューで、[ヘルプ]->[ソフトウェア更新]->[検索およびインストール...]からWTPをインストールします

インストール/更新
インストール

次の3つのフィーチャーを選択し、[必須項目を選択]し、[次へ]進みます

  • Eclipse Java開発ツール (FlexBuilder3の場合は選択)
  • Web標準ツール(WST)
  • J2EE標準ツール(JST)
更新

ライセンスに同意して[次へ]進みます

インストール

[終了]をクリックしてインストールを開始します

インストール/更新

最後にFlexBuilderもしくはEclipseを-cleanオプション付きで起動してください。

4-2.JREランタイムの設定

FlexBuilderまたはEclipseの設定でJREの設定が使用したいJavaのバージョンになっているかを確認してください。異なる場合は、設定を追加しデフォルトになるよう変更してください。
Mac版では、JVMはOSに付属しているので、特に指定する必要はありません。
Windows版では、以下の2つを確認してください。説明ではJRE1.5.0_15を使うものとします。

  • JREの指定を「1.5.0_15」
  • Javaコンパイラ コンパイラー準拠レベルを「5.0」

新規にプロジェクトを作成

5.新規にプロジェクトを作成

5-1.新規にFlexプロジェクトを作成します

サーバにJ2EEを選択します。WTPプラグインがインストールされている場合は、ダイアログ下部にWTPについての入力項目が表示されます。
次のように入力し、[次へ]進みます

  • プロジェクト名:DVDLib
  • プロジェクトの場所:デフォルトの場所
  • アプリケーションの種類:Webアプリケーション
  • アプリケーションサーバの種類:J2EE
  • リモートオブジェクトアクセスサービスを使用をチェックし、LiveCycleデータサービスを選択
  • WTPを使用して結合したJava/Flexプロジェクトを作成をチェック
  • Javaソースフォルダ:src (デフォルト)
新規Flexプロジェクト

5-2.J2EE設定のターゲットランタイムで[新規]をクリックします。


新規Flexプロジェクト

5-3.新規サーバの定義でJBoss v4.2を指定してください


新規サーバ
新規サーバ
新規サーバ

5-4.「J2EEサーバを設定」ダイアログで、次のように指定します

ターゲットランタイム:JBoss v4.2
コンテキストルート:DVDLib (すでに入力済み)
コンテンツフォルダ:WebContents (すでに入力済み)
Flex WARファイル:LCDSインストールフォルダのflex.warを指定

以降はデフォルトのままで良いので[終了]をクリックします。

新規サーバ
新規サーバ

5-5.Flexナビゲータの「DVDLib]プロジェクトを右クリックしてプロパティを表示し、Flexコンパイラを選択し、「サーバのSDKを使用する」を選択して、[OK]をクリックします。
 

6.アプリケーションサーバの動作確認

6-1.Flexナビゲータ上のWebContentsフォルダにindex.htmがあるのでそれを右クリックして、[実行]-[サーバで実行]を選択します。

6-2.新規サーバの定義ダイアログが表示されるので、JBossを選択し、[次へ]進みます。


サーバで実行

6-3.構成プロジェクトにDVDLibがあることを確認して[終了]します。


サーバで実行

するとサーバパネルとコンソールパネルにAPサーバの起動とデプロイ状況が表示されます。環境に問題がなければ、しばらくするとLCDSのWelcomeページが表示されます。

LCDSのWelcomeページ

6-4.続いて、Flex_srcフォルダのDVDLib.mxmlを実行します。

DVDLib.mxmlを右クリックし、[実行]-[Flexアプリケーション]を選択します。
ブラウザが起動し、何もないグレー背景だけのFlexアプリケーションが実行されます。さらに確認したい場合は、DVDLib.mxmlにラベルやボタン等を配置して、実行してみてください。

ここまでで、ビルド・デプロイ・実行できることを確認できました。

補足1:コンパイルとデプロイ動作

FlexBuilder/Eclipseではファイルを保存したタイミングで自動的にビルドが実行されます。
プロジェクトにWTP属性がある場合は、ビルドが完了した数秒後に自動的にデプロイが動作します。
これは、デプロイ作業を意識しなくてもよいので便利でもありますが、複数のファイルを編集する場合などでは操作の足枷ともなります。
すぐにアプリケーションを実行しない場合にはAPサーバーを停止しておいたほうが、FlexBuilder/Eclipseを軽快に使用できると思います。

ビルドやデプロイ処理中の場合、右下のキャタピラっぽい(?)アイコン付近で進行状況のプログレスが表示されます。
バックグラウンドで何か動作しているかを確認するには、右下をチェックするようにしてください。

データベースからアプリケーションを作成

7.データベースからアプリケーションを作成

7-1.メニューから[データ]-[データベースからアプリケーションを作成...]を選択します。

7-2.対象となるプロジェクトを選択し、MySQLへの接続を作成し、アプリケーションを作成したいデータベース・テーブルを指定して[次へ]進みます。

データベースからアプリケーションを作成
新規接続プロファイル
新規接続プロファイル

以下を入力し、接続をテスト

  • ホストURL:localhost
  • データベース名:test?useUnicode=true&characterEncoding=utf8
  • ユーザ名:(任意)
  • パスワード:(任意)

接続が問題なければ終了します。

新規接続プロファイル
データベースからアプリケーションを作成

7-3.サーバサイドコードを生成ダイアログで、次のように指定します。

  • Javaパッケージ:test.dvd
  • クラス名のプレフィックス:Dvdlibrary
  • サーバーとクライアントの通信方法:LiveCycleデータサービスを選択し、[次へ]進みます。
データベースからアプリケーションを作成

7-4.使用する項目を確認します。ここでは何も変更せずに[終了]します。


データベースからアプリケーションを作成

7-5.これで、アプリケーションは完成です。

サーバを起動している場合は、自動的にデプロイされるので、右下のプログレスが完了するのを待ってからdvdlibrary.mxmlを実行してください。
サーバを停止していた場合は、サーバを起動してデプロイ成功のメッセージを確認してから、実行してください。

※自動生成されたJavaソースは警告が多数表示されます。
基本動作の実行には問題ないようですが、気持ちが良いものではありません。
あくまでも雛形ソースと割り切るか、自前のDAOソースコードに差し替えるか、後述する他のAssemblerを検討するか、考えどころです。

以降の7-6~7-11はオプショナルな作業です

(同期的に)各レコードに更新を行い応答時間を計測するロジックを追加します。
(注意:ベンチマークではありません、目安として連続してデータ更新操作の時間を計るだけです)

7-6.アプリケーション下部に計測実行用のコンポーネントを追加します。

dvdlibrary.mxmlを開き、次の箇所を探して処理を変更してください(だいたい146行目あたり)。
以降の説明にでてくるソースコードは、マテリアルのadditional_code.txtに用意しています。

元のコード

<mx:Button id="btnAddNew" click="goToUpdate()" icon="@Embed('icons/AddRecord.png')" toolTip="Add Record" x="10" bottom="10"/> <mx:Button id="btnDelete" click="deleteItem()" icon="@Embed('icons/DeleteRecord.png')" toolTip="Delete Record" x="58" bottom="10"/> <mx:Label text="Search by title" right="300" bottom="11"/> <mx:TextInput id="filterTxt" width="238" toolTip="Search by title" enter="filterResults()" right="58" bottom="11"/> <mx:Button click="filterResults()" id="filterButton" icon="@Embed('icons/SearchRecord.png')" toolTip="Search by title" right="10" bottom="10"/>

次のように変更します

<!-- 応答時間計測用コード(差し替え) --> <mx:Button id="btnAddNew" click="goToUpdate()" icon="@Embed('icons/AddRecord.png')" toolTip="Add Record" x="10" bottom="40"/> <mx:Button id="btnDelete" click="deleteItem()" icon="@Embed('icons/DeleteRecord.png')" toolTip="Delete Record" x="58" bottom="40"/> <mx:Label text="Search by title" right="300" bottom="41"/> <mx:TextInput id="filterTxt" width="238" toolTip="Search by title" enter="filterResults()" right="58" bottom="41"/> <mx:Button click="filterResults()" id="filterButton" icon="@Embed('icons/SearchRecord.png')" toolTip="Search by title" right="10" bottom="40"/> <!-- 応答時間計測用コード(追加) --> <mx:HBox width="100%" bottom="15"> <mx:Label text="各レコードの視聴回数を1回加算"/> <mx:Button id="add_view_btn" label="実行"/> <mx:Label id="add_view_result_lbl"/> </mx:HBox>

7-7.ボタン処理と、データ更新処理を修正します。

dvdlibraryScript.asを開き、次の変数を追加します

//応答時間計測用///////////////////////////////////////////////////////////// private var benchToken:AsyncToken; private var startDate:int; private var endDate:int; private var max_num:int; private var currentIndex:int; //////////////////////////////////////////////////////////////////////////

7-8.dvdlibraryScript.asの任意の位置 終わりの部分 に次のコードを追加してください


//応答時間計測用///////////////////////////////////////////////////////////// public function addViewBtnClickHandler(event:MouseEvent):void { max_num = dataArr.length; if (max_num > 0) { add_view_result_lbl.text = "data updating ..."; ds.autoCommit = false; startDate = getTimer(); currentIndex = 0; inc_views(currentIndex++); } } private function inc_views(index:int):void { dataArr[index].number_of_views++; benchToken = ds.commit(); benchToken.type = "bench"; } //////////////////////////////////////////////////////////////////////////

7-9.データサービスのresult処理を次のように処理を追加してください

場所はinitApp()中のds.addEventListener(ResultEvent.RESULT, function (event:ResultEvent):void{}の中です。

if (event.token == countToken) { totalRows = Number(event.result); } else if (event.token == fillToken) { CursorManager.removeAllCursors(); this.enabled = true; } //応答時間計測用///////////////////////////////////////////////////////////// else if (event.token.type == "bench") { try { if (event.result != null && event.result.body != null && event.result.body is Array && event.result.body[0].identity != null) { if (currentIndex == max_num) { endDate = getTimer(); var diffTime:int = endDate - startDate; add_view_result_lbl.text = "結果受信(" + diffTime + "ms)"; ds.autoCommit = true; fill(); goToView(); } else if (currentIndex < max_num) { add_view_result_lbl.text = "処理中(" + currentIndex + ")"; inc_views(currentIndex++); } else { add_view_result_lbl.text = "invalid index detect"; } } } catch (e:Error) { trace(e.message); } } ////////////////////////////////////////////////////////////////////////// else //COMMIT Token { fill(); goToView(); }

7-10.計測実行ボタンのクリックイベントのリスナを追加します

initApp()の終わりの部分にある次の行を探し、dataGrid.addEventListener(DataGridEvent.ITEM_EDIT_BEGINNING, editCellHandler);の後ろに下記のコードを追加してください。

//応答時間計測用///////////////////////////////////////////////////////////// /** * */ add_view_btn.addEventListener(MouseEvent.CLICK, addViewBtnClickHandler); //////////////////////////////////////////////////////////////////////////

7-11.バックグラウンドのデプロイが終了したら

dvdlibrary.mxmlを実行し、追加したアプリケーション下部のデータ更新ボタンを実行してみてください。

HibernateAssembler版アプリケーションの作成

8.HibernateAssembler版アプリケーションの作成

Hibernateの定義は、HibernateSynchronizerプラグインを使用するので、まだプラグインをインストールしていない人はインストールしてください。
作業の主なポイントは下記の通りです。

  • Hibernate構成ファイルの作成
  • Hibernateマッピング作成と、変数名の対処
  • data-management-config.xmlの設定
  • Flexコードのコピーと手直し
  • フィルタ検索の追加

8-1.Hibernate構成ファイルを作成します。

Java側のsrcフォルダを右クリックし、[新規]-[その他]を選択し、Hibernate構成ファイルを選択して[次へ]進みます。

新規

8-2.構成ファイルの指定に次の内容を指定し、[終了]します。

Hibernate構成ファイル(hibernate.cfg.xml)は任意の場所にコピーしておいてください。

  • データベースタイプ:MySQL
  • ドライバクラス:com.mysql.jdbc.Driver
  • データベースのURL:(jdbc:mysql://localhost/test?useUnicode=true&amp;characterEncoding=utf8)
  • ユーザ名:(ユーザ名)
  • パスワード:(パスワード)
Hibernate構成ファイル

8-3.Javaのパッケージを作成します。

srcフォルダを右クリックし、[新規]-[その他]を選択し、Javaパッケージtest.hibernateを作成してください。

ウィザードを選択
新規Javaのパッケージ

8-4.Hibernateマッピングファイルを作成します。

test.hibernateパッケージを右クリックし、[新規]-[その他]を選択し、Hibernateマッピング・ファイルを選択し[次へ]進みます

新規

8-5.パスワードを入力し、[更新]をクリックします。


パスワードを入力

8-6.dvdlibraryテーブルを選択し、パッケージにtest.hibernateを選択して[終了]します。

 

8-7.Dvdlibrary.hbm.xmlをテキストエディタで開きます

まずgeneratorタグはコメントアウトしてください

<!--<generator class="sequence"/>-->

HibernateSynchronizerでは変数名がキャメルケースとなるようにマッピングが生成されますが、前章で作成したアプリケーションはテーブル項目名と変数名が同じなので、idタグと各propertyタグ中の「name」を修正し、columnと同じ文字列になるようにします。
そして次のHQLクエリを最下行hibernate-mappingの前に追加し、保存します。

<query name="all_dvd">From Dvdlibrary</query> 

8-8.Dvdlibrary.hbm.xmlを右クリックし、[HibernateSynchronizer]-[ファイルの同期化]を選択し、Javaコードを生成します。

 

8-9.Dvdlibrary.hbm.xmlを右クリックし、[HibernateSynchronizer]-[マッピング参照の追加]を選択します。

 

8-10.hibernate.cfg.xmlをテキストエディタで開き、先頭のXMLタグとDOCTYPEタグを8-2でコピーしたファイルから復元します。

また、hibernate.connection.url指定の"&amp;"が'&'に戻っていたら、"&amp;"に戻してください。

8-11.次にWebContents/WEB-INF/flex/data-management-config.xmlをテキストエディタで開き、次のdestinationタグを追加してください。


<destination id="hibernate-dvd"> <channels> <channel ref="my-rtmp"/> </channels> <adapter ref="java-dao" /> <properties> <use-transactions>true</use-transactions> <source>flex.data.assemblers.HibernateAssembler</source> <scope>application</scope> <metadata> <identity property="id"/> </metadata> <network> <session-timeout>20</session-timeout> <paging enabled="false" pageSize="10" /> <throttle-inbound policy="ERROR" max-frequency="500"/> <throttle-outbound policy="REPLACE" max-frequency="500"/> </network> <server> <hibernate-entity>test.hibernate.Dvdlibrary</hibernate-entity> <fill-method> <name>fill</name> <params>java.util.List</params> </fill-method> <fill-configuration> <use-query-cache>false</use-query-cache> <allow-hql-queries>true</allow-hql-queries> </fill-configuration> </server> </properties> </destination>

8-12.hibernate用のライブラリをコピーします。

LCDSのインストールフォルダにあるresources/hibernateのjarファイルを、FlexプロジェクトのWebContents/WEB-INF/libにコピーしてください。

8-13.次にflex_srcにあるFlexソースを流用します。

dvdlibrary.mxmlをコピーし、同じフォルダにdvdlibrary_hibernate.mxmlとしてペーストします。
同様に、dvdlibraryScript.asをdvdlibraryScript_hibernate.asとして、DvdlibraryVO.asをDvdlibraryVO_hibernate.asとしてペーストします。

8-14.dvdlibrary_hibernate.mxmlを開いて修正します。

ActionScriptソースの指定をhibernate用のソース指定に修正します

<mx:Script source="dvdlibraryScript_hibernate.as" />

保存し、閉じてください。

8-15.DvdlibraryVO_hibernate.asを開いて修正します。

リモートクラスをhibernate用クラスに修正します

[RemoteClass(alias="test.dvd.dao.DvdlibraryVO")]

を次のようにしてください。

[RemoteClass(alias="test.hibernate.Dvdlibrary")]

続いてクラス名とコンストラクタ名をDvdlibraryVO_hibernateに直します。保存して閉じてください。

8-16.dvdlibraryScript_hibernate.asを開いて修正します。

データサービスの指定を8-11で追加したhibernate用のdestinationに修正します

ds = new DataService("dvdlibraryJava");

を次のようにしてください。

ds = new DataService("hibernate-dvd");

続いてDTO(DataTransferObject、Flexが自動生成したソースではVO:ValueObjectと表記)をhibernate用に変更します。
function insetItem()を探すかDvdlibraryVOを検索して

var vo:DvdlibraryVO = new DvdlibraryVO();

を次のようにしてください。

var vo:DvdlibraryVO_hibernate = new DvdlibraryVO_hibernate();

クラスの変数名は、8-7で同じ名前になるよう指定しているので修正する必要はありません。

8-17.続いて、クエリ処理を修正します。

function fill()を探して、HQLクエリの名前を指定します。

if(count) { countToken = ds.count(params); } fillToken = ds.fill(dataArr, params);

を次のようにしてください。

if(count) { countToken = ds.count(); } fillToken = ds.fill(dataArr, "all_dvd", []);

8-18.ここまでできたらdvdlibrary_hibernate.mxmlを右クリックして、デフォルトのアプリケーションに設定します。

ビルドとAPサーバへのデプロイがバックグラウンドで実行されるので、右下のプログレスが終了するのを待ってから、再度、右クリックし、[実行]-[Flexアプリケーション]を選択します。
データの取得と更新・作成・削除はできますが、右下の検索機能が有効になっていません。
アプリケーションを終了し、検索機能を実装します。

8-19.Dvdlibrary.hbm.xmlを開き次のHQLクエリを追加します


<query name="filter_dvd">From Dvdlibrary d where d.title like CONCAT('%', CONCAT(:filter,'%'))</query>

8-20.dvdlibraryScript_hibernate.asを開き8-17.で修正した処理を検索に対応した処理に変更します。


if(count) { countToken = ds.count(); } if (filterTxt.text.length != 0) { var args:* = {"filter": filterTxt.text}; fillToken = ds.fill(dataArr, "filter_dvd", args); } else { fillToken = ds.fill(dataArr, "all_dvd", []); }

8-21.アプリケーションを実行して、検索機能を動作確認してください。

以上で、ほぼ同等に基本動作するHibernateAssembler版アプリケーションができました。

SQLAssembler版のアプリケーション作成

9.SQLAssembler版のアプリケーション作成

作業の主なポイントは下記の通りです

  • data-management-config.xmlの設定
  • Flexコードのコピーと手直し
  • フィルタ検索の追加

9-1.data-management-config.xmlを開き、次のdestination定義を追加します。

この定義は、LCDS付属samples.warのサンプルをそのまま流用し、実習で使うテーブル用に変更しただけです。ユーザ名とパスワードは使用している環境のアカウントに変更してください。

<destination id="sql-dvd"> <channels> <channel ref="my-rtmp"/> </channels> <adapter ref="java-dao" /> <properties> <use-transactions>true</use-transactions> <source>flex.data.assemblers.SQLAssembler</source> <scope>application</scope> <metadata> <identity property="id"/> </metadata> <network> <session-timeout>20</session-timeout> <paging enabled="false" pageSize="10" /> <throttle-inbound policy="ERROR" max-frequency="500"/> <throttle-outbound policy="REPLACE" max-frequency="500"/> </network> <server> <database> <driver-class>com.mysql.jdbc.Driver</driver-class> <url>jdbc:mysql://localhost/test?useUnicode=true&amp;characterEncoding=utf8</url> <username>user</username> <password>password</password> <login-timeout>15</login-timeout> </database> <!-- Use this syntax when using a JNDI datasource--> <!--<database> <datasource>java:comp/env/jdbc/mysql_ref</datasource> </database>--> <actionscript-class>DvdlibraryVO_sql</actionscript-class> <fill> <name>all</name> <sql>SELECT * FROM DVDLIBRARY ORDER BY id</sql> </fill> <fill> <name>by-title</name> <sql>SELECT * FROM DVDLIBRARY WHERE title LIKE CONCAT('%', CONCAT(#filter#,'%'))</sql> </fill> <get-item> <sql>SELECT * FROM DVDLIBRARY WHERE id = #id#</sql> </get-item> <create-item> <sql>INSERT INTO DVDLIBRARY (id, title, genre, time_length_min, manufacturing_years, date_of_purchase, evaluation, number_of_views) VALUES (#id#, #title#, #genre#, #time_length_min#, #manufacturing_years#, #date_of_purchase#, #evaluation#, #number_of_views#) </sql> <!--<id-query>CALL IDENTITY()</id-query>--> <!-- HSQLDB syntax to retrieve value of autoincremented column --> </create-item> <update-item> <sql>UPDATE DVDLIBRARY SET id=#id#, title=#title#, genre=#genre#, time_length_min=#time_length_min#, manufacturing_years=#manufacturing_years#, date_of_purchase=#date_of_purchase#, evaluation=#evaluation#, number_of_views=#number_of_views# WHERE id=#_PREV.id#</sql> </update-item> <delete-item> <sql>DELETE FROM DVDLIBRARY WHERE id=#id#</sql> </delete-item> <count> <name>all</name> <sql>SELECT count(*) FROM DVDLIBRARY</sql> </count> </server> </properties> </destination>

9-2.次にflex_srcにあるFlexソースを流用します。

dvdlibrary.mxmlをコピーし、同じフォルダにdvdlibrary_sql.mxmlとしてペーストします
同様に、dvdlibraryScript.asをdvdlibraryScript_sql.asとして、DvdlibraryVO.asをDvdlibraryVO_sql.asとしてペーストします。

9-3.dvdlibrary_sql.mxmlを開いて修正します。

ActionScriptソースの指定をSQLAssembler用のソース指定に修正します

<mx:Script source="dvdlibraryScript_sql.as" />

保存し、閉じてください。

9-4.DvdlibraryVO_sql.asを開いて修正します。

リモートクラスをSQLAssembler用クラスに修正します

[RemoteClass(alias="test.dvd.dao.DvdlibraryVO")]

を次のように変更します。

[RemoteClass]

続いてクラス名とコンストラクタ名をDvdlibraryVO_sqlに直します。
保存して閉じてください。

9-5.dvdlibraryScript_sql.asを開いて修正します。

データサービスの指定を9-1で追加したSQL用のdestinationに修正します

ds = new DataService("dvdlibraryJava");

を次のように変更します。

ds = new DataService("sql-dvd");

続いてDTO(DataTransferObject、Flexが自動生成したソースではVO:ValueObjectと表記)をSQLAssembler用のクラスに変更します。
function insetItem()を探すかDvdlibraryVOを検索して

var vo:DvdlibraryVO = new DvdlibraryVO();

を次のように変更します。

var vo:DvdlibraryVO_sql = new DvdlibraryVO_sql();

9-6.続いて、クエリ処理を修正します。

function fill()を探して、クエリ名を指定します。

if(count) { countToken = ds.count(params); } fillToken = ds.fill(dataArr, params);

を次のように変更します。

if(count) { countToken = ds.count("all"); } fillToken = ds.fill(dataArr, "all");

9-7.ここまでできたらdvdlibrary_sql.mxmlを右クリックして、デフォルトのアプリケーションに設定します。

ビルドとAPサーバへのデプロイがバックグラウンドで実行するので、右下のプログレスが終了するのを待ち、再度、右クリックし、[実行]-[Flexアプリケーション]を選択し実行します。
データの取得と更新・作成・削除はできますが、右下の検索機能が有効になっていません。
アプリケーションを終了し、検索機能を実装します。

9-8.data-management-config.xmlを開きます。

実はすでにフィルタ用のクエリは9-1の定義で記述済みですので、クエリを確認してください

<name>by-title</name> <sql>SELECT * FROM DVDLIBRARY WHERE title LIKE CONCAT('%', CONCAT(#filter#,'%'))</sql>

9-9.dvdlibraryScript_sql.asを開き9-6で修正した処理を検索に対応した処理に手直します。


if(count) { countToken = ds.count("all"); } if (filterTxt.text.length != 0) { var args:* = {"filter":filterTxt.text}; fillToken = ds.fill(dataArr, "by-title", args); } else { fillToken = ds.fill(dataArr, "all"); }

9-10.アプリケーションを実行して、検索機能も動作確認してください。

以上で、ほぼ同等に基本動作するのSQLAssembler版アプリケーションができました。

応答時間について

10.応答時間について

7-6から7-10の手順を行った方は、アプリケーションの下部に応答時間測定用の実行ボタンがあります。
この処理は各レコードに参照回数項目を1加算する処理を同期的に実行し、経過時間を表示します。
私の試した環境では各Assemblerの実装で、大きな差は発生しませんでした。
これはDBアクセスがシンプルな処理で、どの実装でも差がでにくいからかもしれません。

※各レコードの更新がすべて正常に実行できることを前提にしたコードなので途中でエラーが発生した場合などは考慮していません。
目安としての応答時間を測定するだけのコードです。

※各Assemblerの実装手順例を説明するために3つのアプリケーションを作成しましたがそれぞれを同時に動作させると、テーブルの内容に不整合が生じることは容易に想像がつくと思います。
実際には開発・保守として作業のしやすい、いづれか1つの実装を選択することになります。

11.コネクションプールの利用について

3つのAssemblerの実装については、いづれもアプリケーション自身がデータベースへの接続を行っており、APサーバのリソース共有を活用していません。
この章では各実装で、データベース接続をAPサーバのリソースを使うように修正する手順を紹介します。
修正は主に次のポイントになります。

  • アプリケーションサーバにデータソースを定義する
  • JavaAssember版の修正箇所
  • HibernateAssembler版の修正箇所
  • SQLAssembler版の修正箇所

11-1.APサーバにデータソースを定義する

JBossのデプロイディレクトリ(%JBossインストール先%/server/default/deploy)に、下記内容のmysql-ds.xmlを作成してください。ユーザ名とパスワードは使用している環境のアカウントに変更してください。

<?xml version="1.0" encoding="UTF-8"?> <datasources> <local-tx-datasource> <jndi-name>MySQLDS</jndi-name> <connection-url>jdbc:mysql://localhost/test?useUnicode=true&amp;characterEncoding=utf8</connection-url> <driver-class>com.mysql.jdbc.Driver</driver-class> <user-name>user</user-name> <password>password</password> </local-tx-datasource> </datasources>

11-2.データソースとリソースリファレンスの定義

次に、Flexプロジェクトで、WebContents/WEB-INF配下のweb.xmlにリソースリファレンスを追加します。

<resource-ref> <description>JDBC DataSource</description> <res-ref-name>jdbc/mysql_ref</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref>

さらに、WebContents/WEB-INF配下に下記内容のjboss-web.xmlを作成してください。データソースとリソースリファレンスの対応を定義します。

<jboss-web> <resource-ref> <res-ref-name>jdbc/mysql_ref</res-ref-name> <jndi-name>java:/MySQLDS</jndi-name> </resource-ref> </jboss-web>

11-3.JDBCドライバの配置

MySQL用のJDBCドライバをJBossにコピーします
データベースからアプリケーション生成時にWebContents/WEB-INF/libに自動的にコピーされたMySQL用JDBCドライバ(mysql-connector-java-3.1.12-bin.jar)はバージョンが古いのでFlexプロジェクトから削除します。

変わりに使用しているMySQLのバージョンに対応したJDBCドライバ(Connector/J)を次のディレクトリにコピーしてください。

%JBossインストール先%/server/default/lib

11-4.JavaAssember版の修正箇所

Javaソースフォルダのtest.dvd.daoにある%データベース接続名%AFlexDAO.javaを探し、エディタを開きます。
37行目ぐらいにあるgetDataSource()というメソッドを探し、データソースを参照している箇所に11-2で設定したJNDI名を指定します。

 nativeDS = (DataSource) ic.lookup("jdbc/myDB");

を次のように変更します。

 nativeDS = (DataSource) ic.lookup("java:comp/env/jdbc/mysql_ref");

これを正しく設定することで、getConnection()メソッドではAPサーバの接続プールを使用するようになります。

11-5.HibernateAssembler版の修正箇所

hibernate.cfg.xmlをテキストエディタで開きます。
プロパティ設定の

hibernate.connection.url hibernate.connection.driver_class hibernate.connection.username hibernate.connection.password

タグをコメントアウトし、次のプロパティを追加します

<property name="hibernate.connection.datasource"> java:comp/env/jdbc/mysql_ref </property>

さらに、トランザクション・ファクトリの記述をJDBCTransactionFactoryからJTATransactionFactoryに変更してください。

これでHibernateでの接続プールを使用する設定は完了です。

11-6.SQLAssembler版の修正箇所

data-management-config.xmlをテキストエディタで開きます。
destinationが"sql-dvd"の箇所を探し、propertiesタグ内のserverタグにあるdatabaseタグをコメントにします。
実はその下に、接続プールを使用する記述例があるので、JNDI名を正しく設定してdatabaseタグのコメントを解除します
これで、SQLAssemblerでの接続プールを使用する設定は完了です

12.ライブラリの配置について

データベースからアプリケーションを作成する機能で自動的にコピーされるJDBCドライバは古いです。
適宜、使用しているデータベースに適したバージョンのJDBCドライバに差し替えるようにしてください。

また、ローカルでの開発作業を前提としているので、実行に必要なライブラリはWebContents/WEB-INF/lib配下に配置していますが、運用時では、jarファイルをAPサーバのクラスローダ階層のどこ(システム/共有/アプリケーション)に配置するかについて検討しておく必要があります。

13.参考1:日本語のテーブル名と項目名の対処(案)

実習では英数字のテーブル名・項目名を使用しましたが、MicrosoftのSQLサーバーなどでは日本語のテーブル名・項目名を使用しているケースが多々あるかもしれません。

すでにお気づきの方もいるかもしれませんが、データベースからアプリケーションを生成する際、テーブル名や項目名がクラス名や変数名としてコード生成されているので、日本語文字列が使用されていると、そのままではアプリケーションを生成することはできません。

※ActionScriptの仕様ではクラス名や変数名に日本語文字を使用することはできません。

そこで、対処の一案を紹介します。
まず、日本語のテーブルに1対1対応する英数字なビュー名・項目名のViewを作成します。
そして、ダミーとして同様に英数字のテーブル名・項目名のテーブルを作成します。
項目名はビューと同じ名前です。
アプリケーション生成の際はダミーのテーブルを指定し、コード生成後ダミーのテーブル名をビュー名に変更します。
こうすることで、日本語のテーブル名・項目名であっても、アプリケーション作成の機能を利用することができるようになると思います。

14.参考2:BlazeDSについて

ここまではLCDSを前提に説明してきましたが、Flexプロジェクトの作成時にflex.warではなくblazeds.warを指定することでも、データベースからアプリケーションを作成する機能を利用することはできます。
違いは、BlazeDSの場合は、「サーバーサイドコードを生成」ダイアログで、サーバーとクライアントの通信方法の選択が「XML over HTTP(REST)」のみになることです。

この文書のライセンス

製品

  • Acrobat
  • Creative Cloud
  • Creative Suite
  • Digital Marketing Suite
  • Digital Publishing Suite
  • Elements
  • モバイルアプリ
  • Photoshop
  • Touch Apps

ソリューション

  • デジタルマーケティング
  • コンテンツオーサリング
  • Web Experience Management

業種別ソリューション

  • 教育
  • 金融機関

サポート

  • ヘルプ&サポート
  • 注文と返品
  • ダウンロードに関するヘルプ
  • ユーザー登録に関するヘルプ

ラーニング

  • ADC: Adobe Developer Center
  • Adobe TV
  • Design Magazine
  • Photoshop Magazine
  • Focus In

ご購入方法

  • アドビストア
  • アカデミックストア
  • アドビライセンスストア
  • ボリュームライセンスについて
  • 販売パートナー
  • キャンペーン情報

ダウンロード

  • Adobe Reader
  • Adobe Flash Player
  • Adobe AIR
  • Adobe Shockwave Player

会社情報

  • プレスルーム
  • パートナープログラム
  • 企業の社会的責任(英語)
  • 採用情報
  • 投資家の皆様へ(英語)
  • イベント&セミナー
  • Legal(英語)
  • セキュリティ
  • お問い合わせ
国・地域および言語の選択 日本(変更)
国・地域および言語の選択 閉じる

North America

Europe, Middle East and Africa

Asia Pacific

  • Canada - English
  • Canada - Français
  • Latinoamérica
  • México
  • United States

South America

  • Brasil
  • Africa - English
  • Österreich - Deutsch
  • Belgium - English
  • Belgique - Français
  • België - Nederlands
  • България
  • Hrvatska
  • Česká republika
  • Danmark
  • Eastern Europe - English
  • Eesti
  • Suomi
  • France
  • Deutschland
  • Magyarország
  • Ireland
  • Israel - English
  • ישראל - עברית
  • Italia
  • Latvija
  • Lietuva
  • Luxembourg - Deutsch
  • Luxembourg - English
  • Luxembourg - Français
  • الشرق الأوسط وشمال أفريقيا - اللغة العربية
  • Middle East and North Africa - English
  • Moyen-Orient et Afrique du Nord - Français
  • Nederland
  • Norge
  • Polska
  • Portugal
  • România
  • Россия
  • Srbija
  • Slovensko
  • Slovenija
  • España
  • Sverige
  • Schweiz - Deutsch
  • Suisse - Français
  • Svizzera - Italiano
  • Türkiye
  • Україна
  • United Kingdom
  • Australia
  • 中国
  • 中國香港特別行政區
  • Hong Kong S.A.R. of China
  • India - English
  • 日本
  • 한국
  • New Zealand
  • 台灣

Southeast Asia

  • Includes Indonesia, Malaysia, Philippines, Singapore, Thailand, and Vietnam - English

Copyright © 2012 Adobe Systems Incorporated. All rights reserved.

利用条件 | プライバシーポリシーとCookie (更新)

Reviewed by TRUSTe: site privacy statement