- PR -

JSPカスタムタグについて

1
投稿者投稿内容
Tol
常連さん
会議室デビュー日: 2004/07/16
投稿数: 27
投稿日時: 2004-07-16 00:38
カスタムタグの再帰的な評価方法について、質問があります。

例えば、
<mytag:test name="abc" />
という、タグをつくり、
この動作は、
<bean:write name="abc" />(例えば、strutsのタグ)
を出力させるようにしたいと思っています。

そのため、TagSuportを継承したクラスの、doStartTagで、
pageContext.out.print("<bean:write name="abc" />")としたのですが、
<bean:write name="abc" />が、そのままhtmlに出力されてしまいます。

やりたいことは、<bean:write name="abc"/>自体を出力するのではなく、
それを評価した結果を出力するようにしたいと思っています。
つまり、<mytag:test name="abc" />は、<bean:write name="abc" />を出力
するのですが、それ自身をそのまま表示するのではなく、
すぐに、それを再評価して、再評価した文字列を、
htmlに出力させたいと思っています。

しかし、doStartTagで、別のカスタムタグを含む文字列を出力すると、
その文字列をそのまま出力して、そのカスタムタグを評価した文字列を
出力することができません。

現在、どのようにすればよいかわからず、完全に行き詰っています。
ぜひ、アドバイスよろしくお願いします。
はしもと
大ベテラン
会議室デビュー日: 2003/02/05
投稿数: 182
投稿日時: 2004-07-16 12:08
引用:
satさんの書き込み (2004-07-16 00:38) より:

やりたいことは、<bean:write name="abc"/>自体を出力するのではなく、
それを評価した結果を出力するようにしたいと思っています。



試みている方法では出来ないと思います。

Struts の <bean:write /> と同じ働きにしたいなら、
org.apache.struts.taglib.bean.WriteTag クラスを
継承すると良いのではないでしょうか。未検証ですけど。

あるいは、tld ファイルを作るだけで良いのかな ?
Tol
常連さん
会議室デビュー日: 2004/07/16
投稿数: 27
投稿日時: 2004-07-16 13:26
引用:

はしもとさんの書き込み (2004-07-16 12:08) より:

Struts の <bean:write /> と同じ働きにしたいなら、
org.apache.struts.taglib.bean.WriteTag クラスを
継承すると良いのではないでしょうか。未検証ですけど。




返信ありがとうございます。
確かに、<bean:write />タグを出力すると限定するなら、それで問題ない感じですね。

ですが、今回は、出力されるタグが、<bean:write>のみとは限らず、
いろいろなタグを出力を出力できるように考えています。
#前回の質問の仕方が悪くて申し訳ありません。

そうなると、単に継承や、tldを作るだけでは、難しく、
doStartTagメソッドで出力した文字の中のタグを、再評価する必
要があると考えていますが、そのやり方が、不明で困っています。

なんとしても、これを実現したいのですが、どのようにすればよいのでしょうか?
それとも、カスタムタグメソッドの中から、別のタグを出力すること自体、
邪道、もしくは不可能なのでしょうか?
おがわ
大ベテラン
会議室デビュー日: 2001/08/01
投稿数: 199
お住まい・勤務地: 千葉県
投稿日時: 2004-07-16 14:20
ServletやJSPには別の同類に処理を委譲するDispatcher機能が仕様化されていますが,JSPのカスタムタグには盛り込まれていません。

ただし,カスタムタグから実際にアクセスしたい別のカスタムタグのインスタンスが取得できれば,完全に不可能ではないでしょうね。

例えば,カスタムタグのメソッド内で

コード:
XXXTag tag = new XXXTag(...);
tag.doStartTag(...);


が正常に実行できると,問題の件が多分解決されるかもしれません。
あるいは,コンテナ依存のAPIを使ってインスタンスを取得する方法もあると思います。
(昔,Tomcat 4を使って1回トライし,うまく実行できた記憶があります。)

もちろん,この件を現実化してしまうと,結果的に明らかな仕様違反となります。
商用サーバでアプリを運用する場合,Web関連の技術サポート等に影響を与える可能性もありますので,注意してくださいね。

_________________
Kan Ogawa
k-ogawa@users.sourceforge.jp
Tol
常連さん
会議室デビュー日: 2004/07/16
投稿数: 27
投稿日時: 2004-07-16 18:46
なるほど。
自分で、該当するインスタンスを取得して、そのdoStartTagを呼ぶわけですか。。

でも、それだと、該当するインスタンスの取得は自前でやる必要がありますよね。
例えば、<mytag:write name="hoge" />を作りたいとして、この動作は、
オブジェクトスコープ(requestとかsessionとか)から hogeという名前のオブジェクトを取得し、表示するとします。これだけだと、strutsの<bean:write>と同じですが、
違いは、hogeオブジェクトの中に、別のタグがあれば、それを再評価したものを、
表示するとします。

そうなると、doStartTagの中で、hogeオブジェクトの文字列を取得して、
その中に、再評価すべきタグがあるかを、自前のクラスで解析して、あれば、
その箇所で、適切なインスタンスをとってきて、doStartTagを呼び出すって
ことをしなければ、無理ですよね?
自前のクラスで解析+自分でインスタンスを取得などを、自動でやってくれる、
クラスが、なにか用意されていることを期待していたんですが、
そういったものはないんでしょうか?

それと、私は、仕様は、読んだことないのですが、
>もちろん,この件を現実化してしまうと,結果的に明らかな仕様違反となります。

とありますが、カスタムタグの中で、別のカスタムタグを評価することは、
仕様違反だと、どこかに明確に書かれているのでしょうか?
おがわ
大ベテラン
会議室デビュー日: 2001/08/01
投稿数: 199
お住まい・勤務地: 千葉県
投稿日時: 2004-07-16 19:10
引用:

satさんの書き込み (2004-07-16 18:46) より:
それと、私は、仕様は、読んだことないのですが、
>もちろん,この件を現実化してしまうと,結果的に明らかな仕様違反となります。

とありますが、カスタムタグの中で、別のカスタムタグを評価することは、
仕様違反だと、どこかに明確に書かれているのでしょうか?



任意のカスタムタグを内部的にアクセスするという説明は,特に明記されていなかったと思います。
違反というより,範囲外というのが適切ですね。

引用:

satさんの書き込み (2004-07-16 18:46) より:
なるほど。
自分で、該当するインスタンスを取得して、そのdoStartTagを呼ぶわけですか。。

でも、それだと、該当するインスタンスの取得は自前でやる必要がありますよね。
例えば、<mytag:write name="hoge" />を作りたいとして、この動作は、
オブジェクトスコープ(requestとかsessionとか)から hogeという名前のオブジェクトを取得し、表示するとします。これだけだと、strutsの<bean:write>と同じですが、
違いは、hogeオブジェクトの中に、別のタグがあれば、それを再評価したものを、
表示するとします。

そうなると、doStartTagの中で、hogeオブジェクトの文字列を取得して、
その中に、再評価すべきタグがあるかを、自前のクラスで解析して、あれば、
その箇所で、適切なインスタンスをとってきて、doStartTagを呼び出すって
ことをしなければ、無理ですよね?
自前のクラスで解析+自分でインスタンスを取得などを、自動でやってくれる、
クラスが、なにか用意されていることを期待していたんですが、
そういったものはないんでしょうか?


そういったAPIは提供されていません。
仮にJ2EEベンダーが独自仕様として提供するにしても,上記のような使い方までは想定していないと思いますよ。


_________________
Kan Ogawa
k-ogawa@users.sourceforge.jp
1

スキルアップ/キャリアアップ(JOB@IT)