目次へ

9.3. UpdateTagの実装

最後に「UpdateTag」の実装をします。こちらはボディ部を利用するので、「BodyTagSupport」クラスを利用して実装します。

...
public class UpdateTag extends BodyTagSupport{
  public int doAfterBody() throws JspException{
    TransactionTag transactionTag
      =(TransactionTag)findAncestorWithClass(this,TransactionTag.class);
    Connection conn=(Connection)transactionTag.getValue("connection");
    String sql=bodyContent.getString();
    try{
      Statement statement=conn.createStatement();
      statement.executeUpdate(sql);
    }catch(SQLException e){
      throw new JspException(e.getMessage());
    }
    return (SKIP_BODY);
  }
}

「doAfterBody」の先頭で親タグである「TransactionTag」を取得しています。取得には「findAncestorWithClass」メソッドを使用しており、第1引数で指定されたタグから第2引数で指定されたクラスに合致するタグを検索するものです。ここでは第1引数に自分自身、第2引数にTransactionTagクラスを指定しています。

「UpdateTag」と「TransactionTag」は直接的な親子関係にあるので、「getParent」メソッドでも用は足ります。しかし場合によってはその他のJSPタグが間に入ってくるかもしれませんので、「findAncestorWithClass」メソッドを使用する方が無難です。

「TransactionTag」が取得できたら「getValue」メソッドで「Connection」インスタンスを取得し、「BodyContent」から得られたSQL文を実行しています。

9.4. JSPページで実行

最後にこの章の先頭で例にあげたJSPページを実行します。「TransactionTag」の開始時にDBへ接続、「UpdateTag」でボディ部に記載されているSQL文を実行、「TransactionTag」の終了時にコミットとDBへの接続断と処理が進行していきます。SQL文に間違いが無ければ、JSPページは正常終了し、DBに実行結果が反映されます。

(実習課題1)

サンプルのカスタムタグを改良し、それを利用したJSPページを作成しなさい。

  • 「Update」タグのボディ部に「java.sql.PreparedStatement」で許しているような「?」付きのSQL文を記載できるようにする。
  • 「?」の値は、「Update」タグと親子関係にある「Parameter」タグで指定する。その値は「Parameter」タグの属性「value」で指定する。
  • 「?」に指定できる値のタイプは文字列のみと限定してよい。
  • JSPページでの利用は以下のような形式となります。
    <example:Update>update product set type=? where p_num=111
      <example:Parameter value="sedan" />
    </example:Update>
  • (ヒント)TLDで「Update」タグの設定を変更しなければならない箇所がある。

解答例はこちら

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp