Apcoordinator ユーザーズガイド |
目次 |
第4部 EJBアプリケーションの開発 | > 第24章 セションBeanの開発 | > 24.3 セションBeanとクライアントとの連携 |
データBean変換機能は、セションBeanを呼び出す際に、データBeanをjava.util.HashMapクラスに変換して送信する機能です。データBeanが持つ項目クラスはString, Integerなどの基本的なデータのクラスやその配列に変換されます。セションBeanがHashMapを返却した場合は、クライアントで自動的にデータBeanに変換されます。
データBeanからHashMapへの変換を正変換、HashMapからデータBeanへの変換を逆変換と呼びます。
この機能を使用すると、以下のように不要なデータを削除して通信量を減らすことができます。
データBean変換機能を使うには、EJBを呼び出すアプリケーションにデータBean変換マップを作成してください。データBean変換マップは、データBeanの変換規則をカスタマイズするファイルです。EJBを呼び出すアプリケーションにデータBean変換マップが存在しない場合は、データBean変換は行われません。
以下にデータBeanの変換例を示します。
変換前のデータBeanこの例で示されているように、データBeanが変換されると、各プロパティがそれぞれ変換されてHashMapに格納されます。 各プロパティの変換規則は基本的に次のようになります。 この変換規則はデータBean変換マップによってカスタマイズができます。
変換後のHashMap
プロパティ名 プロパティのクラス プロパティの値 message String "Hello!" info InfoBean
(データBean)
プロパティ名 プロパティのクラス プロパティの値 count int 21 date Date 2002/4/1 choice ComboBox
(コンボボックスの項目クラス)選択されている選択肢は1
選択肢番号 値 表示文字列 色 1 tokyo 東京 赤 2 aomori 青森 緑 3 kobe 神戸 橙
HashMapのキー HashMapの値のクラス HashMapの値 message String "Hello!" info HashMap
HashMapのキー HashMapの値のクラス HashMapの値 count Integer 21 date Date 2002/4/1 choice Integer 1 choice.value String[] {"tokyo","aomori","kobe"} choice.text String[] {"東京","青森","神戸"}
変換後のHashMapには、データタイプが与えられます。データタイプはHashMapに格納されたデータの種類を表す文字列です。これは、以下の目的で使用されます。
データタイプはキー"uji.type"に対応するStringの値としてHashMapに格納されます。
データBean変換マップはデータBeanや項目クラスの変換方法を設定するファイルです。以下の設定が可能です。
データBean変換マップはXMLで次のように記述します。
<?xml version="1.0" encoding="iso-2022-jp"?>
<convMap xmlns="http://interstage.fujitsu.com/schemas/uji/convMap" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://interstage.fujitsu.com/schemas/uji/convMap http://interstage.fujitsu.com/schemas/uji/convmap.xsd"> <config> <version>5.0</version> </config> <!-- mypackage.MyBeanの変換方法を指定 -->
<class name="mypackage.MyBean">
<beanConv target="my-bean">
<property name="description" pass="false"/>
</beanConv>
</class>
<!-- ComboBox(サブクラス含む)の選択肢はインデックス番号で送る --> <model name="ComboBox">
<comboBoxConv useIndex="true"/>
</model>
</convMap>
上記記述を例にしてデータBean変換マップの記述方法を説明します。
データBean変換マップのルートはconvMapです。 convMapの内側には、最初にconfigタグを記述し、その内側にversionタグを記述します。これはデータBean変換マップの文法のバージョンを表し、5.0を指定します。
<config> <version>5.0</version> </config>
configタグの後に、データBeanや項目クラスの変換方法の指定が続きます。
classタグはname属性で指定したクラスの変換方法を定義します。
<class name="mypackage.MyBean">
<beanConv target="my-bean">
<property name="syokugyo" pass="false"/>
</beanConv>
</class>
この記述で以下を指定しています。
classタグの内側には、変換方法をあらわすタグを記述します。ここでは、beanConvタグを使用しています。このタグは、classタグで指定されたデータBeanのクラスをHashMapに変換することを意味します。HashMapのデータタイプはtarget属性で指定します。target属性が省略された場合はclassタグで指定したクラス名がデータタイプとして使用されます。
beanConvタグの内側には必要に応じてpropertyタグを記述します。このタグはname属性で指定されたプロパティを送信するかどうかをpass属性で指定します。pass="false"を指定すると送信されません。 beanConvタグとpropertyタグを使って、データBeanの特定のプロパティだけを送信するように指定するには次のように記述します。
<class name="mypackage.MyBean">
<beanConv target="my-bean" passByDefault="false">
<property name="userId" pass="true"/>
</beanConv>
</class>
セションBeanの呼び出し時に使用したコマンド名に応じて変換方法を変更したい場合は、classタグのverb属性にコマンド名を指定して、classタグによる指定が適用されるコマンド名を限定します。
<class name="mypackage.MyBean" verb="update">
<beanConv target="my-bean"/>
</class> <class name="mypackage.MyBean">
<beanConv target="my-bean">
<property name="userId" pass="false"/>
</beanConv>
</class>
この例では、コマンド名がupdateの場合は、すべてのプロパティが送られ、それ意外の場合はuserIdプロパティが送信されません。
以下の記述は項目クラスcom.fujitsu.uji.compo.ComboBoxの変換方法を指定します。
<model name="ComboBox">
<comboBoxConv useIndex="true"/>
</model>
modelタグはname属性で指定した種類の項目クラスの変換方法を指定します。name="ComboBox"は、com.fujitsu.uji.compo.ComboBoxクラスとそのサブクラスを指定します。modelタグの内側には、変換方法をあらわすタグを記述します。ここでは、comboBoxConvタグを使用して、ComboBoxを選択肢や表示文字列の配列に変換することを指定しています。useIndex="index"は、コンボボックスの選択肢をインデックス番号で送信することを意味します。選択肢の値で送信するにはuseIndex="value"を指定します。
次のように指定すると、ComboBoxとそのサブクラスは変換されずに送信されます。
<model name="ComboBox">
<noConv/>
</model>
以下の情報についてはデータBean変換リファレンスを参照してください。
デフォルトでは、データBean変換マップのファイル名はconv.xmlです。 Webアプリケーション、携帯端末対応アプリケーション、電子フォームアプリケーションでは/WEB-INFに、セションBean、SOAPサーバアプリケーションでは設定ファイルフォルダに配置します。ファイル名と配置場所は初期化パラメタuji.convMapで変更できます。リモート共通インタフェースを使用した場合は、呼び出し対象となるセションBeanごとにデータBean変換マップを指定できます。この場合、リモートマップのejbタグまたはlocalタグのconvMap属性にファイル名を指定します。
初期化パラメタuji.convMapを指定されておらず、conv.xmlが既定の配置場所に存在しない場合、データBean変換は行われません。
データBean変換はクライアントで実行されるため、データBean変換マップはクライアントに作成します。セションBeanから別のセションBeanを呼び出す場合は、呼び出し側のセションBeanにデータBean変換マップを作成します。
データBean変換機能を使用している場合、データBeanの上書き機能が利用できます。この機能は、セションBeanが返したデータをそのまま受け取るのではなく、セションBeanを呼び出したときに引数として与えたデータBeanに上書きする機能です。
以下の条件を満たす場合に上書きが可能です。
デフォルトでは上書き機能は有効に設定されています。無効に設定するには以下のようにします。
UjiSessionCall call=...; call.invoke(dataBean,verb,false);
UjiSessionCall call=...; call.setOverwriteMode(false); call.invoke(dataBean,verb); call.invoke(dataBean2,verb2);
Call call=...; UjiSessionCall uCall=(UjiSessionCall)call; uCall.invoke(dataBean,verb,false);
public class MyDataBean extends DataBean { // プロパティlistの型にはListModelではなくMyListModelを使用します。 protected MyListModel list; public void setList(MyListModel list) {this.list=list;} public MyListModel getList() {return list;} ... }
インタフェース | コンストラクタの例 | 説明 |
---|---|---|
ListModel | public MyList(MyBean[] param) | リストの要素を格納した1次元配列を引数とするコンストラクタを作成してください。 リストの要素が特定のクラスとサブクラスに限定される場合は、配列の要素のクラスとしてリスト要素のクラスを使用できます。左記記述はリスト要素がMyBeanとそのサブクラスの場合の例です。クラスが限定できない場合は引数にObject[]を指定してください。 |
TableModel | public MyTable(MyBean[][] param) | テーブルの要素を格納した2次元配列を引数とするコンストラクタを作成してください。 テーブルの要素が特定のクラスとサブクラスに限定される場合は、配列の要素のクラスとしてテーブル要素のクラスを使用できます。左記記述はテーブル要素がMyBeanとそのサブクラスの場合の例です。クラスが限定できない場合は引数にObject[][]を指定してください。 |
TreeModel | public MyTree(Object param) | ルートノードを引数としたコンストラクタを作成してください。ルートノードとは、TreeModelのgetRoot()メソッドで取得できるオブジェクトです。コンストラクタの引数の型はObjectにしてください。 |
目次 |