Apcoordinatorの「コマンドスクリプティング」を利用すると、ビジネスクラス全体をJavaで記述する代わりに、処理のフローをXML形式で記述しJavaの記述を必要な部分のみに限定することができます。
コマンドスクリプティングの記述例
<?xml version="1.0" encoding="UTF-8"?> <commandMap xmlns=http://interstage.fujitsu.com/schemas/uji/commandMap xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xsi:schemaLocation="http://interstage.fujitsu.com/schemas/uji/commandMap http://interstage.fujitsu.com/schemas/uji/commandmap.xsd"> <config> <version>5.0</version> </config> <!-- ユーザーが初めてアプリケーションにアクセスしたときの処理を定義 --> <entry> <newBean cls="sample1.BodyBean"/> <copyValue bean="#ようこそ" targetProperty="message"/> <setResponseBean pane="body" verb="reqmode" /> </entry> <!-- 入力のデータBeanが sample1.BodyBeanで、コマンドがokの時の処理を定義 --> <entry bean="sample1.BodyBean" verb="ok"> <!-- 入力値のチェック --> <validate property="value" type="int" minValue="0" maxValue="10" statusText="valueError" /> <!-- Javaクラスの呼び出し --> <invoke name="sample1.MyHandler.update" /> <setResponseBean pane="body" verb="resmode"/> <catch status="valueError"> <copyValue bean="#値は0以上10以下で入力してください" targetProperty="message" /> <setResponseBean pane="body" verb="retry"/> </catch> </entry> </commandMap>
コマンドスクリプティングには、以下の機能があります。
入力値の検証
EJBの呼び出し
一般のクラスの呼び出し
XMLデータ仕様記述の呼び出し
データBeanの領域への対応付け
ログの出力
サブルーチンの定義
例外のキャッチ
コマンドスクリプティングを利用すると、以下のメリットがあります。
処理のフローが明確になる
Javaの処理を細分化し、再利用を容易にする
修正時の再構築が不要で、変更が容易にできる
以下のような場合は、Javaで記述する必要があります。
分岐や条件を伴い、一連のフローで表現できない場合
実行性能を追求する場合
コマンドスクリプティングの記述の構成
コマンドスクリプティングの記述は以下の構成になっています。
<?xml version="1.0" encoding="UTF-8"?> <commandMap> <!-- コマンドスクリプティングの動作を設定 --> <config> .... </config> <!-- bean, verbで指定したデータBean,コマンドを受けて実行する処理を記述 --> <entry bean="入力のデータBeanのクラス名" verb="コマンド"> .... </entry> <!-- 同様に entryタグを必要なだけ記述 --> .... <!-- サブルーチンを定義 --> <procedure name="サブルーチン名"> .... </procedure> <!-- 同様に必要なだけサブルーチンを定義 --> .... </commandMap>
Webアプリケーションの場合、ユーザーが初めてアプリケーションにアクセスしたときの処理は、bean, verbアトリビュートを省略したentryタグに記述します。
上記の記述では文字エンコーディングが"UTF-8"となっていますが、"Shift_JIS"等、Javaでサポートされている各種のエンコーディングが利用できます。
処理の記述
entry, procedureタグのコンテントには処理を実行するためのタグを記述します。簡単な例で基本的なタグの使い方を説明します。
データBeanのインスタンスを新しく作成して領域に対応付ける
<entry> <newBean cls="sample1.BodyBean" bean="uji.current"/> <copyValue bean="#ようこそ" targetBean="uji.current" targetProperty="message"/> <setResponseBean pane="body" bean="uji.current" verb="reqmode" /> </entry>
この記述例で使用しているタグを解説します。
インスタンスを新しく作成します。Java のnew 演算子に相当します。クラス名をclsアトリビュートで指定します。作成されたインスタンスは、beanアトリビュートで指定したスクリプトデータ名で保存されます。スクリプトデータとは、コマンドスクリプティングで使用する変数です。
データBeanのプロパティの値を別のプロパティにコピーします。bean, propertyアトリビュートで指定したプロパティの値をtargetBean, targetPropertyアトリビュートで指定したプロパティにコピーします。この記述例ではプロパティの値ではなく文字列定数をプロパティに代入するためにcopyValueタグを使用しています。beanアトリビュートに"#"に続けて文字列を指定すると、その文字列がtargetBean, targetPropertyで指定したプロパティに代入されます。従って、記述例では「ようこそ」がBodyBeanのmessageプロパティに代入されます。
paneアトリビュートで指定された領域にデータBeanを対応付けます。データBeanのスクリプトデータ名をbeanアトリビュートで指定します。表示モードを設定したい場合は、verbアトリビュートで指定します。設定不要の場合はverbを省略できます。
スクリプトデータ名"uji.current"はApcoordinatorで予約されている特別な名前で、現在処理中のオブジェクトを保存するために使用されています。newBean, setResponseBean タグのbeanアトリビュートやcopyValueタグのtargetBeanアトリビュートを省略した場合は、"uji.current"が指定されたものとみなされます。従って、上記の記述例は以下のように短く書くことができます。
<entry> <newBean cls="sample1.BodyBean"/> <copyValue bean="#ようこそ" targetProperty="message"/> <setResponseBean pane="body" verb="reqmode" /> </entry>
この3つ以外のタグでも多くの場合同様のルールが適用されます。
もう少し複雑な例を説明します。
入力値のチェックと、Javaクラスの呼び出しを行なう例
<entry bean="sample1.BodyBean" verb="ok"> <!-- 入力値のチェック --> <validate property="value" type="int" minValue="0" maxValue="10" statusText="valueError" /> <!-- Javaクラスの呼び出し --> <invoke name="sample1.MyHandler.update" /> <setResponseBean pane="body" verb="resmode"/> <catch status="valueError"> <copyValue bean="#値は0以上10以下で入力してください" targetProperty="message" /> <setResponseBean pane="body" verb="retry"/> </catch> </entry>
この記述例で使用しているタグを解説します。
入力値のチェックを行ないます。チェックの対象となるデータBeanとプロパティ名をbean, propertyアトリビュートで指定します。記述例ではbeanが省略されているため"uji.current"が指定されたと見なされます。entryタグの直後では、"uji.current"にはリクエストBean (記述例ではsampl1.BodyBeanクラス) が保存されているため、BodyBeanのvalueプロパティがチェックの対象となります。 検証の内容はtype, minValue, maxValueアトリビュートなどで指定します。type="int" はプロパティの値をint型とみなすことを指定します。minValue, maxValueは許容する最小値、最大値を指定します。プロパティの値がこの範囲外の場合はエラーとなり、例外が発生します。この例外は、後述するcatchタグで処理できます。statusTextには、エラーが発生した時に、例外に付加する付加情報を文字列で指定します。catchタグでは、特定の付加情報を持つ例外のみを選んで処理することができます。
例外処理を記述します。catchタグのコンテントに例外処理を記述します。 statusアトリビュートに文字列を指定すると、その文字列を付加情報として持つ例外のみを処理します。記述例では、catchタグのstatusにvalidateタグのstatusTextと同じ文字列を指定しているため、validateタグで値をチェックしてエラーとなった場合にcatchタグの処理が実行されます。
サブルーチン、Javaクラスのメソッド、EJBセションBeanを呼び出します。記述例ではJavaクラスのメソッドの呼び出しに使用しています。この場合、呼び出すJavaクラスのメソッドをnameアトリビュートで"クラス名.メソッド名"の形式で指定します。メソッドに引数として与えるデータBeanはbeanアトリビュートで指定しますが、ここでは省略されているため、"uji.current"に保存したデータBeanが与えられます。呼び出されるメソッドのシグネチャはビジネスクラスのメソッドと同様に以下の形式で作成してください。
public void someMethod(com.fujitsu.uji.DispatchContext context, [データBeabのクラス名] data);
メソッドの返却値は、resultアトリビュートで指定したスクリプトデータ名で保存されます。記述例ではresultを省略しているため、スクリプトデータ名"uji.current"で保存されます。
作成したコマンドスクリプティング記述を使用する
作成したコマンドスクリプティング記述を使用するには、コマンドマップにコマンドスクリプティング記述のファイル名を記述します。コマンドマップと同じディレクトリーにコマンドスクリプティング記述"comscript.xml"を置いた場合、コマンドマップに次の1行を追加します。
+comscript.xml
以上で説明した以外の機能については、“定義ファイルリファレンス”、“第8章 コマンドスクリプティング”を参照してください。
関連項目
定義ファイルリファレンス