付録A

Composer JSPタグライブラリ

Novell exteNd Composerにはタグライブラリファイルcomposer-taglib.tldが付属しています。これを使うと、Java Server Pageの中からComposerサービスを呼び出したり、関連するDOMデータを操作したりすることが容易になります。 このファイルで定義されているタグは、JSPから起動されるアプリケーションを想定したものです。XMLデータは、整理して適当な書式に変換するか、または後処理を施してから、クライアント側ブラウザに送信します。

自分でコードを記述しなくても、多くの場合、実はComposerのカスタムタグライブラリを使っています。DirectorやComposerのウィザードで自動生成したJSPの多くに、カスタムタグコールが入っているからです (ウィザードでJSPを生成する手順については、「Director JSPウィザード」または「JSPベースのサービストリガの作成」、あるいはその両方を参照)。 さらに、自らコードを記述すれば、タグライブラリの強力な機能をもっと活用できるでしょう。 以下、カスタムタグライブラリの機能およびタグの構文について概説します。

 
Top of section

タグライブラリを使うための準備

Composerに組み込みのウィザードを使ってカスタムタグを含むJSPを生成し、Composerの展開UIでプロジェクトを展開するのであれば、パッケージ化に伴う処理はComposerに任せておいて構いません。 ただし、独自のJSPを作成し、WAR/EARを手で展開する場合は、正しい手順で進めないと、Webアプリケーションがカスタムタグに完全に対応できないことがあります。

注記:   以下に説明する手順は、JSPを独自に記述する場合にのみ必要です。 ComposerやDirectorのJSPウィザードを使う場合は必要ありません。

Procedure JSPベースのWebアプリケーションをタグに対応させる

  1. JSPの先頭付近に、次のような行を挿入します。

      <%@ taglib uri=\xd3 /composer\xd3  prefix=\xd3 Composer\xd3  %>
    
  2. WARファイルでcomposer-taglib.tldファイルがあるか確認します。次の図は、最小のWARファイル作成です。

    warfileForTaglib

  3. 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>
    

 
Top of section

composer-taglib.tldで定義されたカスタムタグ

ファイルcomposer-taglib.tldには、次のようなカスタムタグが定義されています。

タグ名

目的

execute

Composerサービスの実行

障害

Composer障害ドキュメントの操作

forEach

出力ドキュメントに含まれるノードセット中の、各DOMノードに関する繰り返し処理

hasnopart

ある出力メッセージパートが存在しない場合の処理

hasnovalue

あるノードが空である場合の処理

haspart

ある出力メッセージパートが存在する場合の処理

hasvalue

あるノードが空でない場合の処理

if

XPathで指定された条件が真であるかどうかを評価

value

あるノードのデータ値を取得

タグの動作は属性値にも依存します。実際、タグの処理を実装するJavaメソッドにも、属性値が引数として渡されます。 以下、タグごとに、指定できる属性およびその使い方を解説します。

 
Top of page

タグAPI

 
Top of section

execute

属性

目的

converter

入力データのマーシャリングに使うコンバータクラス(本文参照)。

faultHandled

Composerの障害を、<composer:fault>タグを使ってページ内で処理するかどうか、を指定するフラグ。 デフォルト値は「false」。

name

JSP内の他の箇所でサービスを参照するための識別名。

root

入力メッセージパートのルート要素名。

service

起動するComposerサービスの名前。

xmldoc

コンバータクラスとしてGXSInputFromJavaObjectを使う場合は必須。サービスに渡す入力ドキュメントを指す、JavaのString(またはStringアレイ)型変数の名前を指定します。

注意: 指定が必須の属性は太字で表示します。

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の資料も参照)。

com.sssw.b2b.xs.service.conversion.GXSInputFromHttpParams

これは、HttpServletRequestパラメータ(URIパラメータまたは送信されたフォームフィールドとして指定されたパラメータ)をXMLドキュメントに変換します。 ドキュメントに使うルート名は、サービスで定義されているものとします。ただしexecuteタグのroot属性で別に指定した場合を除きます。

com.sssw.b2b.xs.service.conversion.GXSInputFromHttpContent

これは、指定されたHttpServletRequestからInputStreamを開き、要求バッファ(XML形式であると想定)のコンテンツを取得します。

com.sssw.b2b.xs.service.conversion.GXSInputFromHttpMultiPartRequest

コンテンツタイプがmultipart/form-dataのHTML形式であると想定します。 ファイルパラメータ「xmlfile」を検索し、入力XMLドキュメントとして使用します。 ファイルのMIMEタイプがtext/xmlでない場合は、XMLドキュメントを作成し、CDATAセクションにファイルの中身を転記します。

com.sssw.b2b.xs.service.conversion.GXSInputFromHttpSpecificParam

HttpServletRequestパラメータからコンテンツを取得し、入力XMLドキュメントとして使用します。

com.sssw.b2b.xs.service.conversion.GXSInputFromJavaObject

JavaのString型変数に、入力XMLドキュメントそのものが入っていると想定します。サービスが複数の入力ドキュメントを処理する場合に備え、Stringアレイ型変数でも各メッセージパートを受け取れるよう、メソッドがオーバーロードされています。

 
Top of section

障害

属性

目的

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が一致するタグで囲まれた部分です。

 
Top of section

forEach

属性

目的

name

(JSP内の他の箇所にあるexecuteタグの、) name属性で指定されたエイリアスと一致するサービスを実行し、その結果にもとづいて処理します。

part

name属性(上記)で指定されたサービスを実行した結果得られるメッセージパートのうち、この属性で指定されたものにもとづいて処理します。

xpath

partおよびname属性で示されたドキュメント(part属性の指定がない場合は出力メッセージパート)を対象として評価するXPath式を表します。 この式は、(ドキュメントのオブジェクトモデルで定義された)ノードリストを返すものでなければなりません。

注意: 指定が必須の属性は太字で表示します。

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タグで取得します。

 
Top of section

hasnopart

属性

目的

name

(JSP内の他の箇所にあるexecuteタグの、) name属性で指定されたエイリアスと一致するサービスを実行し、その結果にもとづいて処理します。

注意: 指定が必須の属性は太字で表示します。

hasnopartタグは、(nameで指定される)サービスに出力パートがない場合のExecuteブロックを囲みます。

詳細およびコード例についてはhaspart (後述)を参照してください。

 
Top of section

hasnovalue

属性

目的

name

(JSP内の他の箇所にあるexecuteタグの、) name属性で指定されたエイリアスと一致するサービスを実行し、その結果にもとづいて処理します。

part

name属性(上記)で指定されたサービスを実行した結果得られるメッセージパートのうち、この属性で指定されたものにもとづいて処理します。

xpath

partおよびname属性で示されたドキュメント(part属性の指定がない場合は出力メッセージパート)を対象として評価するXPath式を表します。 この式は、(中身があるとは限らない) DOMノードを返すものでなければなりません。

注意: 指定が必須の属性は太字で表示します。

このタグは、ある出力メッセージパートのあるノードに中身がない場合のExecuteブロックを囲みます。 すなわち、空ノードの処理が必要な場合に使うタグです。 後述のhasvalueタグと対照的な役割です。

 
Top of section

haspart

属性

目的

name

(JSP内の他の箇所にあるexecuteタグの、)name属性で指定されたエイリアスと一致するサービスを実行し、その結果にもとづいて処理します。

part

name属性(上記)で指定されたサービスを実行した結果得られるメッセージパートのうち、この属性で指定されたものにもとづいて処理します。

注意: 指定が必須の属性は太字で表示します。

このタグは、あるサービスのある出力メッセージパートが存在する場合の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>

 
Top of section

hasvalue

属性

目的

name

(JSP内の他の箇所にあるexecuteタグの、) name属性で指定されたエイリアスと一致するサービスを実行し、その結果にもとづいて処理します。

part

name属性(上記)で指定されたサービスに関連付けられたメッセージパートのうち、この属性で指定されたものにもとづいて処理します。

xpath

partおよびname属性で示されたドキュメント(part属性の指定がない場合は出力メッセージパート)を対象として評価するXPath式を表します。 この式は、(中身があるとは限らない)DOMノードを返すものでなければなりません。

注意: 指定が必須の属性は太字で表示します。

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の出力を表示します。 空ならば何もしません。

 
Top of section

if

属性

目的

name

(JSP内の他の箇所にあるexecuteタグの、) name属性で指定されたエイリアスと一致するサービスを実行し、その結果にもとづいて処理します。

part

name属性(上記)で指定されたサービスを実行した結果得られるメッセージパートのうち、この属性で指定されたものにもとづいて処理します。

xpath

partおよびname属性で示されたドキュメント(part属性の指定がない場合は出力メッセージパート)を対象として評価するXPath式を表します。 この式は、ブール値を返すものでなければなりません。

注意: 指定が必須の属性は太字で表示します。

<composer:if>タグを使えば、XPath式で表されるブール値により、評価するブロックを切り替えることができます。次の例について考えます。

  <composer:if xpath="string(./CUSTOMER/STATE)=&quot;CA&quot;">
  	 <b>
  <composer:value xpath="./CUSTOMER/STATE" />
  </b>
  </composer:if>

この例では、/STATEの値が「CA」である場合に限り、この値が太字で出力されます。

このifブロックに対応する形で、XPathを(等号の代わりに)不等号で評価するブロックを用意すれば、/STATEの値が「CA」ではない場合は太字にせずに表示するというような、「else」ブランチに相当する記述ができます。

 
Top of section

value

属性

目的

name

(JSP内の他の箇所にあるexecuteタグの、)name属性で指定されたエイリアスと一致するサービスを実行し、その結果にもとづいて処理します。

part

name属性(上記)で指定されたサービスを実行した結果得られるメッセージパートのうち、この属性で指定されたものにもとづいて処理します。

xpath

partおよびname属性で示されたドキュメント(part属性の指定がない場合は出力メッセージパート)を対象として評価するXPath式を表します。 この式は、データを持つDOMノードを返すものでなければなりません。

注意: 指定が必須の属性は太字で表示します。

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を操作できます。

 
Top of section

より詳しい情報

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 ...