JSP 9章 親子タグ
- 9.1. TLDの設定
- 9.2. TransactionTagの実装
- 9.3. UpdateTagの実装
- 9.4. JSPページで実行
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」タグの設定を変更しなければならない箇所がある。