OracleでXMLを活用する
XSQLプログラミング入門

最終回 アクションハンドラーを作成する
(2/2ページ)

     アクションハンドラーからの出力を得る方法

 出力にはおもに3つの方法があります。

  1. タグを直にDocument rootに貼り付ける
  2. DOMツリーをdocument rootに貼り付ける
  3. HttpResponceを通じて出力する

このほかにもサーブレットエンジンのログに書き出すなどが考えられます。

■タグを直にDocument rootに貼り付ける

 この方法はすでにこの記事に何度か出てきましたので、もうご存知かもしれません。

public void handleAction(Node rootNode) {
  addResultElement(rootNode, "price", "\4500");
}

このアクションハンドラーを“page”をドキュメントエレメントとして呼び出した場合、次のような出力が得られます。

<?xml version="1.0" encoding="Shift_JIS"?>
  <page>
  <price>\4500</price>
</page>

■DOMツリーをdocument rootに貼り付ける

 さて、出力にもう少し構造を持たせたい場合には、DOMを使う方法があります。 例えば、

<?xml version="1.0" encoding="Shift_JIS"?>
<page>
   <site>知恵の輪
    <URL>http://www.chienowa.com</URL>
    <description>知恵のマーケットプレース</description>
  </site>
</page>

のように出力したいとします。 HandleActionメソッドでは次のように書きます。

public void handleAction(Node rootNode) {
  Element actionElement = getActionElement();
  Document document = actionElement.getOwnerDocument();
  Element element1 = document.createElement("site");
  Text text1 = document.createTextNode("知恵の輪");
  element1.appendChild(text1);
  Element element2 = document.createElement("URL");
  Text text2 =     
       document.createTextNode("http://www.chienowa.com");
  Element element3 = document.createElement("description");
  Text text3 =
      document.createTextNode("知恵のマーケットプレース");
  element3.appendChild(text3);
  element2.appendChild(text2);
  element1.appendChild(element2);
  element1.appendChild(element3);
  node.appendChild(element1);
}

 上記の中で、DOMのAPIが出てきましたので、実際にそこでどのような操作をしているのか、説明しておきましょう。

 最初に、エレメント“site”を作り、そして“知恵の輪”テキストノードを作り、それを“site”の子ノードとしています。

  次に“URL”エレメントとテキストノード “http://www.chienowa.com”、“description”エレメント、そして“知恵のマーケットプレース” テキストノードを順に作成します。続いて、 “description”エレメントに“知恵のマーケットプレース”ノード、“URL”エレメントにhttp://www.chienwoa.comノードを貼り付けていきます。

 それらの“URL”ノード、“description”ノードの順に“site”エレメントに張り付けます。 このとき、“URL”エレメントが“description”の兄エレメントになることが決定します。最後に“site”エレメントをドキュメントエレメントに貼り付けます。

■HttpResponceを通じて出力する

 特殊なケースに限ってこの方法でクライアントに出力します。特に普通にアクションを書く場合には必要ありませんが、テクニックとして知っておいても損はないでしょう。

Public void handleAction(Node rootNode) {
  XSQLPageRequest xsqlpagerequest = getPageRequest();
  XSQLServletPageRequest request = (XSQLServletPageRequest)
       xsqlpagerequest;
  HttpServletResponce res = request.getHttpServletResponce();
  //これでHttpServletResponceのAPIが使えるようになる
  String domain = "chienowa.com";
  String name = "tkoyama”;
  String value = "mypassword";
  Cookie cookie = new Cookie(name, value);
  cookie.setDomain(domain);
  res.addCookie(cookie);
}

 

     アクションハンドラー内でのデータベースとの接続

 この章では簡単にアクションハンドラー内でデータベースと接続する方法を述べます。XSQLサーブレットではコネクションプールを確保していますから、アクションハンドラー内ではこのコネクションプールからJDBCのコネクションをもらってくることをおすすめします。

 次のように、XSQLPageRequestクラスのgetJDBCConnection()メソッドを呼ぶことでConnectionオブジェクトが所得できます。

JDBCのコネクションを確立する

XSQLPageRequest xsqlpagerequest = getPageRequest();
Connection conn=xsqlpagerequest.getJDBCConnection();
try{
  Statement statement = conn.createStatement();
  string sqlstatement = "Select * from EMP";
  Resultset resultset = statement.executeQuery(sqlstatement);
} catch (SQLException ex) {
  reportErrorIncludingStatement(node, sqlstetement,
      ex.getMessage());
} finally {
  try {
    if(resultset != null)
    retultset.close();
  } catch (SQLException ex) {
  reportErrorIncludingStatement(node, sqlstetement,
      ex.getMessage()}
  try {
    if(statement != null)
    statement.close();
  } catch(SQLException ex) {
    reportErrorIncludingStatement(node, sqlstetement,
        ex.getMessage()}
}

  なお、SQLJをアクションハンドラー内で使いたい場合は、コネクションプールのコネクションを使いまわすよりも、独自のコネクションを開設することをおすすめします。

     エラーリポート(例外処理)

 エラーメッセージをクライアントに出力するのにXSQLサーブレットでは3つのAPIが用意されています。

  1. reportError(rootNode, "メッセージ");
  2. reportErrorIncludingStatement(rootNode, "メッセージ1", "メッセージ2");
  3. reportFatalError("メッセージ");

■reportErrorを利用する

 これは非常に単純な方法です。例えば、以下のアクションハンドラー

public void handleAction(Node rootNode) {
  reportError(rootNode, "メッセージ");
}

を呼び出すと

<?xml version="1.0" encoding="Shift_JIS" ?>
<page xsql-timing="27">
  <xsql-error action="xsql:action">
    <message>メッセージ</message>
  </xsql-error>
</page>

 というエラー出力がなされます。あとはXSLTで処理できます。

■reportErrorIncludingStatementを利用する

 もう少し詳細なエラーメッセージを出力したい場合は、次の方法があります。

public void handleAction(Node rootNode) {
  reportErrorIncludingStatement(rootNode,
      "メッセージ1", "メッセージ2");
}

このように記述すると、

<?xml version="1.0" encoding="Shift_JIS" ?>
<page xsql-timing="29">
  <xsql-error action="xsql:action">
    <statement>メッセージ1</statement>
    <message>メッセージ2</message>
  </xsql-error>
</page>

上記のように、statementタグとmessageタグとに別れて出力されます。

■reportFatalErrorを利用する

 先ほどの2つのエラー出力の場合は、XSLTで処理することを前提にしていました。しかし、その場でどうしても処理を強制終了させたい場合もあるでしょう。その場合はこのメソッドを呼び出してください。 このメソッドではoracle.xml.xsql.XSQLErrorWriterクラスのprintメソッドが呼ばれます。

 最後に、一般に共通していえることですがアクションハンドラーから外部ライブラリを使う場合はライブラリ側だけで処理せずthrowしてhandleActionメソッド側でも処理することをお勧めいたします。

 以上でXSQLの連載は終了です。ここで紹介しきれなかったAPIも多数存在していますので、さらに腕を磨きたいかたはXSQLサーブレットパッケージに添付されている「JAVADOC」をぜひご参照ください。

 最後に、おつきあいいただきました読者の皆様に感謝します。


 目次 

 1ページ

 XSQLアクションハンドラー作成の基本
 アクションハンドラーを呼び出すには?
 アクションハンドラーに値を渡す方法
   action elementのattributeを読み込む
   action elementの内容を読み込む
   action elementの子エレメントの内容を読み込む
   HTTPで渡された引数を受け取る
   HTTPで渡された引数をHttpRequestを通じて受け取る
   外部XMLファイルから読み取る

 2ページ
 アクションハンドラからの出力を得る方法
 アクションハンドラー内でのデータベースとの接続
 エラーリポート(例外処理)
   HreportErrorを利用する
   reportErrorIncludingStatementを利用する
   reportFatalErrorを利用する
 

「連載 XSQLプログラミング入門」


XML & SOA フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

HTML5+UX 記事ランキング

本日月間