データBean変換機能は、セションBeanを呼び出す際に、データBeanをjava.util.HashMapクラスに変換して送信する機能です。データBeanが持つ項目クラスはString, Integerなどの基本的なデータのクラスやその配列に変換されます。セションBeanがHashMapを返却した場合は、クライアントで自動的にデータBeanに変換されます。
データBeanからHashMapへの変換を正変換、HashMapからデータBeanへの変換を逆変換と呼びます。
この機能を使用すると、以下のように不要なデータを削除して通信量を減らすことができます。
データBeanから表示のみに必要な情報を取り除いてセションBeanに送信: 項目クラスはWebページの表示に必要な色やフォントなどの情報を含んでいます。表示のみに必要な情報をデータBeanの送信前に取り除くことができます。
データBeanが持つプロパティのうち、セションBeanで必要なものだけを選択して送信: 変換後のHashMapに含めるプロパティを選択することができます。
データBean変換機能を使うには、EJBを呼び出すアプリケーションに“データBean変換マップ”を作成してください。データBean変換マップは、データBeanの変換規則をカスタマイズするファイルです。EJBを呼び出すアプリケーションにデータBean変換マップが存在しない場合は、データBean変換は行われません。
データBeanの変換規則
以下にデータBeanの変換例を示します。
変換前のデータBean
プロパティ名 | プロパティのクラス | プロパティの値 | |||
---|---|---|---|---|---|
message | String | "Hello!" | |||
info | InfoBean | プロパティ名 | プロパティのクラス | プロパティの値 | |
count | int | 21 | |||
date | Date | 2002/4/1 | |||
choice | ComboBox | 選択肢番号 | 値 | 表示文字列 | 色 |
1 | tokyo | 東京 | 赤 | ||
2 | aomori | 青森 | 緑 | ||
3 | kobe | 神戸 | 橙 | ||
選択されている選択肢は1 |
変換後のHashMap
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[] | {"東京","青森","神戸"} |
この例で示されているように、データBeanが変換されると、各プロパティがそれぞれ変換されてHashMapに格納されます。各プロパティの変換規則は基本的に次のようになります。この変換規則はデータBean変換マップによってカスタマイズができます。
プリミティブ型: プリミティブ型に対応するラッパクラスに変換されます。例えばintはjava.lang.Integerに変換されます。使用されるHashMapのキーはプロパティ名と同じです。
データBean: com.fujitsu.uji.DataBeanクラスとそのサブクラスは再帰的にHashMapクラスに変換されます。使用されるHashMapのキーはプロパティ名と同じです。
項目クラス: 項目クラスごとに規定された形式に変換されます。形式の概略は次のとおりです。
FieldStringなどのフィールドタグの項目クラス(CheckBoxは除きます)は、そのデータがHashMapに格納されます。このとき、HashMapのキーはプロパティ名と同じです。
ComboBoxやTableViewなどコレクションタグの項目クラスとCheckBoxクラスは、項目クラスが持つ複数の情報がそれぞれHashMapのエントリに格納されます。このとき、HashMapのキーは"[プロパティ名].[情報の種類]"という形式の文字列になります。
いずれの場合も、項目クラスが持つ色やフォントなどの表示に関する情報は、変換後のHashMapには含まれません。
画面部品のインタフェース: ListModel, TableModel はそれぞれObject[]、Object[][]に、TreeNode は配列で構成したツリー構造に変換されます。このとき、リストの要素、テーブルの要素、ツリーのノードの値は再帰的に変換されます。TreeModelは、ツリーを表すオブジェクトが内部から取り出されてHashMapに格納されます。いずれの場合もHashMapのキーはプロパティ名と同じです。
配列: 配列の各要素を再帰的に変換し、それらを要素とする配列に変換されます。各要素を変換した結果、全てHashMapクラスかそのサブクラスの場合は、変換後の配列はHashMap[]です。それ以外の場合は、Object[]です。HashMapのキーはプロパティ名と同じです。
それ以外のクラス: 変換されずにそのままHashMapに格納されます。HashMapのキーはプロパティ名と同じです。
項目クラス、画面部品のインタフェースが変換される形式の詳細は“定義ファイルリファレンス”を参照してください。
データタイプ
変換後のHashMapには、データタイプが与えられます。データタイプはHashMapに格納されたデータの種類を表す文字列です。これは、以下の目的で使用されます。
セションBeanが返したHashMapをデータBeanに逆変換するときに、どのクラスに変換するかを決定する
セションBeanがHashMapを受け取った時に、呼び出すビジネスクラスを決定する
データタイプはキー"uji.type"に対応するStringの値としてHashMapに格納されます。
データBean変換マップ
データBean変換マップはデータBeanや項目クラスの変換方法を設定するファイルです。以下の設定が可能です。
データBeanの各クラスについて、HashMapに変換されたときのデータタイプを指定します。
データBeanのプロパティから、セションBeanに送信するものを選択する。
項目クラスが持つ情報から、セションBeanに送信するものを選択できる。例えば、TableViewのヘッダやComboBoxの選択肢表示文字列について送信するかどうかを指定できます。
データBean変換マップはXMLで次のように記述します。
<?xml version="1.0" encoding="Shift_JIS"?> <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>
この記述で以下を指定しています。
データBean送信時にmypackage.MyBeanクラスはHashMapに変換し、そのデータタイプをmy-beanとする。HashMapからデータBeanに逆変換する際は、HashMapのデータタイプがmy-beanなら、mypackage.MyBeanに変換する。
mypackage.MyBeanのプロパティdescriptionは、送信しない。つまり、変換後のHashMapには格納しない。
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変換マップで使用されるタグと属性
データBean変換マップのファイル名
デフォルトでは、データBean変換マップのファイル名はconv.xmlです。 Webアプリケーションでは/WEB-INFに、セションBeanでは設定ファイルフォルダに配置します。ファイル名と配置場所は初期化パラメタuji.convMapで変更できます。リモート共通インタフェースを使用した場合は、呼び出し対象となるセションBeanごとにデータBean変換マップを指定できます。この場合、リモートマップのejbタグまたはlocalタグのconvMap属性にファイル名を指定します。
初期化パラメタuji.convMapを指定されておらず、conv.xmlが既定の配置場所に存在しない場合、データBean変換は行われません。
注意
データBean変換はクライアントで実行されるため、データBean変換マップはクライアントに作成します。セションBeanから別のセションBeanを呼び出す場合は、呼び出し側のセションBeanにデータBean変換マップを作成します。
データBeanの上書き
データBean変換機能を使用している場合、データBeanの上書き機能が利用できます。この機能は、セションBeanが返したデータをそのまま受け取るのではなく、セションBeanを呼び出したときに引数として与えたデータBeanに上書きする機能です。
以下の条件を満たす場合に上書きが可能です。
データBean変換機能を有効にしている。
上書き機能を有効にしている。
セションBeanから返されたデータを逆変換して得られるデータBeanと、セションBean呼び出し時のデータBeanのクラスが同じである。
デフォルトでは上書き機能は有効に設定されています。無効に設定するには以下のようにします。
セションBeanの呼び出しにUjiSessionCallクラスを使用する場合: 次のいずれかの方法で指定します。
invokeメソッドの第3引数にfalseを指定する。 一時的に上書きを無効にしたい場合はこの方法を使用します。
UjiSessionCall call=...; call.invoke(dataBean,verb,false);
UjiSessionCallのsetOverwriteModeメソッドでfalseを指定する。同一のUjiSessionCallインスタンスを使う時に常に上書きを無効にしたい場合はこの方法を使用します。
UjiSessionCall call=...; call.setOverwriteMode(false); call.invoke(dataBean,verb); call.invoke(dataBean2,verb2);
セションBeanの呼び出しにCallインタフェースを使用する場合: CallインスタンスをUjiSessionCallにキャストして、UjiSessionCallと同じ方法を使用します。
Call call=...; UjiSessionCall uCall=(UjiSessionCall)call; uCall.invoke(dataBean,verb,false);
データBean変換使用時の注意事項
データBeanのプロパティの値として、ListModel, TableModel, TreeModel, TreeNodeインタフェースを実装したクラスを使用するときは、プロパティの型としてインタフェースそのものではなく、インタフェースを実装したクラスを使用してください。例えば、ListModelインタフェースを実装したMyListModelをプロパティの値として使用する場合は、データBeanを次のように作成してください。
public class MyDataBean extends DataBean { // プロパティlistの型にはListModelではなくMyListModelを使用します。 protected MyListModel list; public void setList(MyListModel list) {this.list=list;} public MyListModel getList() {return list;} ... }
データBeanのプロパティの型として、ListModel, TableModel, TreeModelを実装したクラスを指定する場合、そのクラスに以下の形式のコンストラクタを作成してください。
インタフェース | コンストラクタの例 | 説明 |
---|---|---|
ListModel | public MyList(MyBean[] param) | リストの要素を格納した1次元配列を引数とするコンストラクタを作成してください。リストの要素が特定のクラスとサブクラスに限定される場合は、配列の要素のクラスとしてリスト要素のクラスを使用できます。左記記述はリスト要素がMyBeanとそのサブクラスの場合の例です。クラスが限定できない場合は引数にObject[]を指定してください。 |
TableModel | public MyTable(MyBean[][] param) | テーブルの要素を格納した2次元配列を引数とするコンストラクタを作成してください。テーブルの要素が特定のクラスとサブクラスに限定される場合は、配列の要素のクラスとしてテーブル要素のクラスを使用できます。左記記述はテーブル要素がMyBeanとそのサブクラスの場合の例です。クラスが限定できない場合は引数にObject[][]を指定してください。 |
TreeModel | public MyTree(Object param) | ルートノードを引数としたコンストラクタを作成してください。ルートノードとは、TreeModelのgetRoot()メソッドで取得できるオブジェクトです。コンストラクタの引数の型はObjectにしてください。 |
以上の形式のコンストラクタがない場合、逆変換実行時にエラーになります。