付録A
Novell exteNd Composerにはタグライブラリファイルcomposer-taglib.tld
が付属しています。これを使うと、Java Server Pageの中からComposerサービスを呼び出したり、関連するDOMデータを操作したりすることが容易になります。 このファイルで定義されているタグは、JSPから起動されるアプリケーションを想定したものです。XMLデータは、整理して適当な書式に変換するか、または後処理を施してから、クライアント側ブラウザに送信します。
自分でコードを記述しなくても、多くの場合、実はComposerのカスタムタグライブラリを使っています。DirectorやComposerのウィザードで自動生成したJSPの多くに、カスタムタグコールが入っているからです (ウィザードでJSPを生成する手順については、「Director JSPウィザード」または「JSPベースのサービストリガの作成」、あるいはその両方を参照)。 さらに、自らコードを記述すれば、タグライブラリの強力な機能をもっと活用できるでしょう。 以下、カスタムタグライブラリの機能およびタグの構文について概説します。
Composerに組み込みのウィザードを使ってカスタムタグを含むJSPを生成し、Composerの展開UIでプロジェクトを展開するのであれば、パッケージ化に伴う処理はComposerに任せておいて構いません。 ただし、独自のJSPを作成し、WAR/EARを手で展開する場合は、正しい手順で進めないと、Webアプリケーションがカスタムタグに完全に対応できないことがあります。
注記: 以下に説明する手順は、JSPを独自に記述する場合にのみ必要です。 ComposerやDirectorのJSPウィザードを使う場合は必要ありません。
<%@ taglib uri=\xd3 /composer\xd3 prefix=\xd3 Composer\xd3 %>
WARファイルでcomposer-taglib.tld
ファイルがあるか確認します。次の図は、最小のWARファイル作成です。
web.xmlファイルで、上記の手順1およびタグライブラリの位置からuri
を参照しているtaglib
要素があるか確認します。 たとえば次のようになっているはずです。
<web-app> . . . <taglib> <taglib-uri>/composer</taglib-uri> <taglib-location>/WEB-INF/composer-taglib.tld</taglib-location> </taglib> . . . </web-app>
ファイルcomposer-taglib.tld
には、次のようなカスタムタグが定義されています。
タグの動作は属性値にも依存します。実際、タグの処理を実装するJavaメソッドにも、属性値が引数として渡されます。 以下、タグごとに、指定できる属性およびその使い方を解説します。
注意: 指定が必須の属性は太字で表示します。
JSP内からComposerサービスを呼び出すには、execute
タグを使います。 常に指定しなければならない属性はservice
だけです。完全修飾サービス名を表します。 呼び出すサービスをComposerが識別するための属性ですが、JSPの他のタグで、この名前を使ってサービスにアクセスすることはできません。 他のタグでサービスを参照したい場合は、name
属性を使ってエイリアスを定義してください。
たとえば、ListInventoryというComposerサービス(展開コンテキストはcom.inventory
)を、JSPの他のタグからinventory
という名前で参照したいとします。このとき、ListInventoryサービスを実行するには、次のようにします。
<composer:execute name="inventory"service="com.inventory.ListInventory
" />
これによりサービスが実行されます。コンバータクラスは指定されていないので、デフォルトである「InputFromHttpParams」コンバータを使います。 これはトリガモードとしてパラメータ(URL/フォーム)を指定したのと同等です。
サービスが入力を受け取る方法は、converter
属性で指定します。
重要: 展開に先立ち、すべてのJSPについて展開コンテキストを確認してください。これが、execute
タグのservice
属性に使われているコンテキストと一致しなければなりません (上の例を参照)。 次のようにして確認します。 Composer Enterprise Editionで展開xObjectを開き、[ファイル]メニューの[プロパティ]で、[プロパティ]ダイアログを開きます。 [展開]タブに切り替え、[プロジェクトJARの展開コンテキスト]以下の[展開コンテキスト]を確認します。 Composerサービスを実行するJSPすべてについて、execute
タグのservice
属性に使われているコンテキストが、これと一致しなければなりません。
Composer Enterprise Serverには、XMLデータをマーシャリングする手段がいくつもあります。Composerのインストール時に組み込まれた、ヘルパクラスを使って実現されています。 JSPから<composer:execute>
タグでサービスを呼び出す際、マーシャリングの方法を次の5種類から指定できます。
converter
属性の値として指定できるのは、次の5とおりです。
com.sssw.b2b.xs.service.conversion.GXSInputFromHttpParams com.sssw.b2b.xs.service.conversion.GXSInputFromHttpContent com.sssw.b2b.xs.service.conversion.GXSInputFromHttpMultiPartRequest com.sssw.b2b.xs.service.conversion.GXSInputFromHttpSpecificParam com.sssw.b2b.xs.service.conversion.GXSInputFromJavaObject
以上はComposer Enterprise Serverのインストール時に、ランタイムクラスとして組み込まれます。 個別にインストール、パッケージ化、登録などをしなくても、Composer Webアプリケーションから自由に使うことができます。
各クラスの具体的な処理について概説します(Composer Enterprise Serverの資料も参照)。
これは、HttpServletRequest
パラメータ(URIパラメータまたは送信されたフォームフィールドとして指定されたパラメータ)をXMLドキュメントに変換します。 ドキュメントに使うルート名は、サービスで定義されているものとします。ただしexecute
タグのroot
属性で別に指定した場合を除きます。
これは、指定されたHttpServletRequest
からInputStreamを開き、要求バッファ(XML形式であると想定)のコンテンツを取得します。
コンテンツタイプがmultipart/form-data
のHTML形式であると想定します。 ファイルパラメータ「xmlfile」を検索し、入力XMLドキュメントとして使用します。 ファイルのMIMEタイプがtext/xml
でない場合は、XMLドキュメントを作成し、CDATAセクションにファイルの中身を転記します。
HttpServletRequest
パラメータからコンテンツを取得し、入力XMLドキュメントとして使用します。
JavaのString型変数に、入力XMLドキュメントそのものが入っていると想定します。サービスが複数の入力ドキュメントを処理する場合に備え、Stringアレイ型変数でも各メッセージパートを受け取れるよう、メソッドがオーバーロードされています。
属性 |
目的 |
---|---|
name |
name属性の値が一致する<composer:execute>タグで発生した障害を捕捉することになります。 |
part |
ユーザ定義のカスタム障害ドキュメントを使う場合に、その名前を指定します。 デフォルト値は「_SystemFault」です。 |
注意: 指定が必須の属性は太字で表示します。
JSPに<composer:fault>
要素を置くと、サービスで発生した障害を捕捉し、実行するJSPコードを記述できます。 タグは条件式のように振る舞います。 すなわち、<composer:execute>
タグで起動されたサービスが障害パートを返した場合に限り、<composer:fault>
要素の開始タグから終了タグまでの間が評価されるのです。 障害が起こらなければ、<composer:fault>
タグで囲まれた部分は無視されます。
たとえば、あるComposerサービスでComposerの標準システム障害が発生し、かつ、JSPから起動される別のComposerサービスでカスタム障害が発生しうる場合、JSPコードは次のような形になります。
...
<composer:execute name="myServ1"service="com.context.myService" xmldoc="myInput" /> <composer:execute name="myServ2" service="com.context.myOtherService"/> <HTML> <HEAD><TITLE>My Page<</TITLE></HEAD> <BODY> ... <composer:fault name="myServ1" part="_SystemFault"> <B>A Fault has occurred!</B><P/> Component: <composer:value name="localName" xpath="FaultInfo/ComponentName" /><P/> 日付: <composer:value name="localName" xpath="FaultInfo/DateTime" /><P/> MainCode: <composer:value name="localName" xpath="FaultInfo/MainCode" /><P/> SubCode: <composer:value name="localName" xpath="FaultInfo/SubCode" /><P/> メッセージ: <composer:value name="localName" xpath="FaultInfo/Message" /><P/> </composer:fault> ... <composer:fault name="myServ2" part="myCustomFault"> <B>Doh! A fault happened in my other service!</B> </composer:fault> ... </BODY> </HTML>
このように、JSPに記述できる<composer:fault>
タグは、1組とは限らないことに注意してください。 障害時に実行されるのは、指定されたname
およびpart
が一致するタグで囲まれた部分です。
注意: 指定が必須の属性は太字で表示します。
forEach
タグはループ構造を構築するもので、タグの実行時にノードリストを取得し、その各ノードについて繰り返します。 指定が必須な属性はxpath
だけで、これはノードリストを取得するためのXPath式を表します。 name
属性で指定されるサービスを実行した結果得られる、part
属性で指定されるメッセージパート(またはDOM)を対象として、この式を評価します。 これらの属性が指定されていなければ、直近に実行されたサービスのOutput
パートを使います。
次の例では、Output1
というメッセージパートのITEM
ノードに関して繰り返しています。このメッセージパートは、(execute
タグのname
属性で定義された)エイリアスがinventory
であるサービスで生成されるものです。
<composer:forEach name="inventory" part=”Output1” xpath="/MYROOT/INVENTORY/ITEM"> <composer:value xpath="./ITEMNAME" /><br> <composer:value xpath="./SKU" /><br> <composer:value xpath="./QTY" /><br> <composer:value xpath="./PRICE" /><br> </composer:forEach>
ノードの値(/ITEM以下の要素に対応するXMLデータ)はvalue
タグで取得します。
属性 |
目的 |
---|---|
name |
(JSP内の他の箇所にある |
注意: 指定が必須の属性は太字で表示します。
hasnopart
タグは、(nameで指定される)サービスに出力パートがない場合のExecuteブロックを囲みます。
詳細およびコード例についてはhaspart
(後述)を参照してください。
注意: 指定が必須の属性は太字で表示します。
このタグは、ある出力メッセージパートのあるノードに中身がない場合のExecuteブロックを囲みます。 すなわち、空ノードの処理が必要な場合に使うタグです。 後述のhasvalue
タグと対照的な役割です。
属性 |
目的 |
---|---|
name |
(JSP内の他の箇所にある |
part |
|
注意: 指定が必須の属性は太字で表示します。
このタグは、あるサービスのある出力メッセージパートが存在する場合のExecuteブロックを囲みます。 hasvalue
タグと同様に、HTML文、JSPマークアップブロック、または<composer:>
タグ、あるいはこれらすべてを、開始タグ<composer:haspart>
および終了タグ</composer:haspart>
の間に、いくつでも埋め込むことができます。また、埋め込まれたタグは、指定されたパートが存在する場合に限って処理の対象になります。
たとえば次のJSPコード断片は、「myFirstPart」というパートが実際に生成された場合に限って、「myService」から検索されたデータをHTMLのテーブルとして表示します。
<composer:haspart name="myServiceName" part="myFirstPart"> <table> <tr> <td>some data</td> <td> <composer:value name="myServiceName" part="mySecondPart" xpath="root/element/element"/> </td> </tr> </table> </composer:haspart>
注意: 指定が必須の属性は太字で表示します。
hasvalueタグは、(サービスの出力として得られるメッセージパートに、)あるXPathノードが存在する場合のExecuteブロックを囲みます。 あるノードが空であれば何もせず、逆にデータがある場合には処理または表示する、という場合に使います。 たとえば次のようなJSPコードがあるとします。
<composer:value xpath="./CUSTOMER/NAME" /><br> <composer:hasvalue xpath="./CUSTOMER/ADDRESS"> <composer:value xpath="./CUSTOMER/ADDRESS" /><br/> </composer:hasvalue> <composer:value xpath="./CUSTOMER/CITY" /><br/> <composer:value xpath="./CUSTOMER/STATE" /><br/> <composer:value xpath="./CUSTOMER/ZIP" /><br/>
この例では、/ADDRESSノードの値が空でない場合に、JSPの出力を表示します。 空ならば何もしません。
注意: 指定が必須の属性は太字で表示します。
<composer:if>
タグを使えば、XPath式で表されるブール値により、評価するブロックを切り替えることができます。次の例について考えます。
<composer:if xpath="string(./CUSTOMER/STATE)="CA""> <b> <composer:value xpath="./CUSTOMER/STATE" /> </b> </composer:if>
この例では、/STATEの値が「CA」である場合に限り、この値が太字で出力されます。
このif
ブロックに対応する形で、XPathを(等号の代わりに)不等号で評価するブロックを用意すれば、/STATEの値が「CA」ではない場合は太字にせずに表示するというような、「else」ブランチに相当する記述ができます。
注意: 指定が必須の属性は太字で表示します。
valueタグは、あるサービスから得られるメッセージパートの、所定の場所にあるDOMノードから、データを取得するために使います。 ノードの場所はXPath式で指定します。 例を示します。
<composer:value xpath=\x94 /MYROOT/INVENTORY/DATE\x94 />
/MYROOT/INVENTORY/DATEのデータは、JSP出力に置かれます。この例では、/MYROOT/INVENTORY/DATEは、XMLデータの一部を表す単一の独立したノードであることを前提としています。 nodesetが返される場合は、forEach
タグを使って各ノードについてのRepeatブロックを作り、その中で個々のノードの値を求めます。
<composer:forEach name="inventory" xpath="/MYROOT/INVENTORY/ITEM"> <composer:value xpath="./ITEMNAME" /><br> <composer:value xpath="./SKU" /><br> <composer:value xpath="./QTY" /><br> <composer:value xpath="./PRICE" /><br> </composer:forEach>
この例では、/
MYROOT/INVENTORY/ITEM
は、それぞれにITEMNAME、SKU、QTY
、およびPRICE
子ノードを含むノードのセットを返します。 上記のJSP断片は、各ITEM
のデータを順に出力します。
forEach
タグを開くと、name
属性にinventory
の値が指定されます。これは、現在アクセスしているOutput DOMのサービスのローカル(JSP内)名です。単一のJSPページから複数のサービスを実行して、結果の各Output DOMからデータにアクセスすることもあります。name
属性を使用すると、同じJSPセッション内の異なるOutput DOMを操作できます。
ComposerタグライブラリのJavaソースコードは、Composerのインストール先フォルダ(\Common以下)の\xc_api以下にある、xcs-src.jarファイルに入っています。 ここにはほかにも、さまざまなトリガクラス、コンバータクラス、および展開に関わるインタフェースや、実行時に必要となるサポートクラスがあります。 同じフォルダに、これらのクラスのJavadoc APIドキュメントも入っています。
Copyright © 2004 Novell, Inc. All rights reserved. Copyright © 1997, 1998, 1999, 2000, 2001, 2002, 2003 SilverStream Software, LLC. All rights reserved. more ...