OracleでXMLを活用する
XSQLプログラミング入門
最終回 アクションハンドラーを作成する
XSQLでは、あらかじめ決められたタグを利用してプログラミングを行うだけでなく、独自のカスタムなタグを作ることができる。カスタムタグが利用されると、それに関連されたアクションハンドラーが呼び出される。ここでは、そのカスタムタグとアクションハンドラーの作成について説明しよう。
小山尚彦、Chienowa.comチーム
日本オラクル株式会社
2000/7/20
XSQLアクションハンドラー作成の基本 |
XSQLの連載は今回で最終回です。前回ではXSQLの標準タグについて説明しました。今回は、標準では用意されないXSQLタグを処理するため、Javaによるカスタムアクションハンドラーの作成方法について説明します。アクションハンドラーを定義することで、既存の処理にはなかった新しい処理をXSQLに追加することが可能になるわけです。
まずはJavaによるアクションハンドラーを作成する際の基本について説明しましょう。下のファイルは、サンプルとしてsrc/oracle/xml/xsql/actionの中にはいっている、ExampleCurrentDBDateHandlerというアクションハンドラーの例です。
ExampleCurrentDBDateHandlerの例
|
注目点すべきは4つあります。アクションハンドラーの作成では、この4点がポイントです。
インポートするクラス群
1行目と2行目で、以下のクラスをインポートしています。
oracle.xml.xsql.*
org.w3c.dom.*
XSQLActionHandlerImplの継承
クラスの宣言のところでXSQLActionHandlerImplをextend(継承)しています。
initによる初期化
initメソッドが特に必要になる場合というのはありません。というのも、次のhandleActionメソッドですべてできてしまうからです。しかし、initでactionエレメントからの入力などを処理して、handleActionをすっきりさせるのもよいかもしれません。
handleActionによる実際の処理
handleAction(Node rootNode)の中で、実際の処理を記述します。
アクションハンドラーを呼び出すには? |
まずは、手っ取り早く実際にこのアクションハンドラーをコンパイル、インストールして、呼び出す方法を説明しましょう。
- ActionHandlerファイルを作る(例えばcom.test.ExampleCurrentDBDateHandler)
- javacでコンパイルしてclassを生成します。
- jar -cvf <jarfilename>.jar com/でjarファイルを生成します。
- jarファイルをservletエンジンのクラスパスに入れます。Servletエンジンのマニュアルを参照してください。
- xsqlファイルから<xsql:action handler="com.test.ExampleCurrentDBDateHandler">タグで呼び出します
- (この操作はオプションです)上記5の代わりにハンドラーをlib/XSQLConfig.xmlで新たなXSQLタグとしてマクロ定義しても構いません。するといちいちハンドラー名を記述する手間が省けます。 ただし登録できるタグ数は10までです。 具体的には次のように記述します。
XSQLタグとアクションハンドラーの定義<?xml version="1.0" ?> |
このように記述することで、先ほどの長い表記<xsql:action handler="com.test.ExampleCurrentDBDateHandler">を<xsql:current-date>タグで呼び出すことができます。
万が一作成したアクションハンドラーが設計したように動かないときはデバッグが必要になります。 その際は、handleAction(Node rootNode)メソッド内で
addResultElement(rootNode, "CHECK", “メッセージの内容"); |
を「メッセージの内容」と書かれた部分に適材適所な情報を各所に埋め込んであげることでデバッグがやりやすくなるはずです。
アクションハンドラーに値を渡す方法 |
通常は、アクションハンドラーになんらかのデータやXML文書を渡し、処理された結果を受け取ることになります。その方法について説明します。
理屈は最小限にして、実際にサンプルを見ながら説明していきましょう。アクションハンドラーに値を渡すにはさまざまな方法がありますここでは下記の6つの方法を紹介します。
- action elementのattributeを読み込む
- action elementの内容を読み込む
- action elementの子エレメントの内容を読み込む
- HTTPで渡された引数を受け取る
- HTTPで渡された引数をHttpRequestを通じて受け取る
- 外部XMLファイルから読み取る。
まず、アクションハンドラーは以下のXML文書から呼び出すとしましょう。
アクションハンドラーを呼び出すXML文書例<xsql:action handler="com.chienowa.TestAction"
|
■action elementのattributeを読み込む方法
action elementとは、実際にアクションハンドラーを呼び出しているところ。<xsql:acrion…>のタグを指します。
このaction elementのattributeを読み込むには、以下のようなアクションハンドラーを定義します。
action elementのattributeを読み込む方法public void handleAction(Node rootNode) { |
このアクションハンドラーを、次のようなXML文書で呼び出すとしましょう。
<xsql:action handler="com.test.TestAction" |
アクションハンドラーで、上記の変数の値を取得できます。 例えば、上記の場合dept_idという引数で0115と渡されていたとしますとString deptidには0115が入ります。
■action elementの内容を読み込む
こんどはaction elementの内容を読み込むアクションハンドラーの定義です。
action elementの内容を読み込む方法public void handleAction(Node rootNode) |
これで、最初に例にあげたアクションハンドラーを呼び出すXML文書の中の、action elementの内容である
ドットコム事業開発部 |
を取得できます。
■action elementの子エレメントの内容を読み込む
例えば、以下のXML文書の“ニューオータニガーデンコート”を取得したいと思います。
<location> |
このときのアクションハンドラーは以下になります。
上記の「ニューオータニガーデンコート」を読み込むpublic void handleAction(Node rootNode) { |
ここでgetTextNode(Element)というメソッドが出てまいりましたが、これは標準のActionHandlerImplのメソッドではありませんので別途下記のように用意してください。
Private String getTextNode( Element source ) { |
多少の制限はありますが、もう少し簡単にElementの値をとってくることがXSQLUtilのAPIとして用意されています。 例えば次のようなXSQLファイルがあったとします。
<?xml version='1.0' encoding="Shift_JIS"?> |
ここで呼ばれているcom.test.ReadTreeActionのhandleActionメソッドは次のようになっています。
public void handleAction(Node node) { |
このときの出力は
<?xml version="1.0" encoding="Shift_JIS"
?> |
という形式なります。これでお分かりのように、この方法で取り出すと子孫エレメントの内容も連結してしまいます。そのため、エレメントがすべてアクションエレメントの子エレメントであった場合のみ有功な方法となります。
■HTTPで渡された引数を受け取る
HTTPで渡された引数を受け取って処理する場合には、以下のアクションハンドラーを定義すれば可能になります。
HTTPで渡された引数を受け取るアクションハンドラーpublic void handleAction(Node rootNode) { |
これでp_mailaddressパラメターをv_mailaddressに収めることができます。
■HTTPで渡された引数を、HttpRequestを通じて受け取る
同様に、今度はHttpRequestを通じて引数を受け取るアクションハンドラーです。
HTTPで渡された引数を、HttpRequestを通じて受け取るpublic void handleAction(Node rootNode) { |
先ほどの方法ではできなかった、Arrayになっているparameterも、HttpRequestを通じてv_mailaddress[ ]に渡すことができます。
■外部XMLファイルから読み取る。
ここでは以下のChienowa.xmlというxmlファイルの中にある<SMTP-SERVER>の内容を取得したいと思います。 このファイルの置き場所は、xsql/libディレクトリかまたはアクションハンドラーとおなじjarファイル内のトップディレクトリに置くかどちらでもかまいません。
Chienowa.xmlの内容
|
XMLファイルを読み込むアクションハンドラー
|
これで“s1”というString変数に“sendmail1.jp.oracle.com”という文字列が入ります。この方法を使って汎用性の高いアクションハンドラーを作ることが可能です。
目次 |
1ページ XSQLアクションハンドラー作成の基本 アクションハンドラーを呼び出すには? アクションハンドラーに値を渡す方法 action elementのattributeを読み込む action elementの内容を読み込む action elementの子エレメントの内容を読み込む HTTPで渡された引数を受け取る HTTPで渡された引数をHttpRequestを通じて受け取る 外部XMLファイルから読み取る 2ページ アクションハンドラからの出力を得る方法 アクションハンドラー内でのデータベースとの接続 エラーリポート(例外処理) HreportErrorを利用する reportErrorIncludingStatementを利用する reportFatalErrorを利用する |
「連載 XSQLプログラミング入門」 |
- QAフレームワーク:仕様ガイドラインが勧告に昇格 (2005/10/21)
データベースの急速なXML対応に後押しされてか、9月に入って「XQuery」や「XPath」に関係したドラフトが一気に11本も更新された - XML勧告を記述するXMLspecとは何か (2005/10/12)
「XML 1.0勧告」はXMLspec DTDで記述され、XSLTによって生成されている。これはXMLが本当に役立っている具体的な証である - 文字符号化方式にまつわるジレンマ (2005/9/13)
文字符号化方式(UTF-8、シフトJISなど)を自動検出するには、ニワトリと卵の関係にあるジレンマを解消する仕組みが必要となる - XMLキー管理仕様(XKMS 2.0)が勧告に昇格 (2005/8/16)
セキュリティ関連のXML仕様に進展あり。また、日本発の新しいXMLソフトウェアアーキテクチャ「xfy technology」の詳細も紹介する
|
|