2

JSP を使用して、ネストされたカスタム タグをいくつか作成しています。これを行うには 2 つの方法があることを理解しています。1) BodyTagSupport を拡張するタグ ハンドラを作成する方法、2) タグ ファイルを作成する方法です。

最初の方法では、コードが醜いです。また、現在の struts タグを組み込む方法が見つかりませんでした。JspWriter を使用して次のように記述した場合、コンパイルされた JSP によって生成される意味のある出力ではなく、最終的な HTML 出力でこの文字列を取得します。

 <bean:write name="label">

というわけで、2つめの方法で、タグファイルを書きました。その後、上記の問題は解決されます。ただし、親タグのクラスがわからないため、タグの親タグを取得するのに問題があります。独自のタグ ハンドラーを記述した場合、次のことができます。

    ParentTag parent = 
        (ParentTag)findAncestorWithClass(this, ParentTag.class);
      if (parent == null) {
        throw new JspTagException("this tag is outside of its parent tag");
      }

しかし、代わりにタグファイルを使用したため、その親がどのクラスであるかはよくわかりません。

どうすればこの問題を解決できますか?

4

3 に答える 3

1

タグ ファイルは、タグ ハンドラのようにそれ自体が「クラス」ではありません (つまり、すべての JSP ファイルと同様に、当然のことながら、意味はわかります)。

タグファイルで「ネストされた」タグを作成する必要がある場合、私が行うことは、状態データを「よく知られている名前」でリクエストに入れることです。事実上、2 つのタグ間で「秘密」が共有されます。

たとえば、1 つのタグ ファイルで次のようにします。

<%
jspContext.setAttribute("_myWellKnownName", new java.util.LinkedHashMap(), PageContext.REQUEST_SCOPE);
%>

次に、後のタグファイルで:

<%
    java.util.LinkedHashMap map = (java.util.LinkedHashMap) jspContext.findAttribute("_myWellKnownName");
%>

次に、その変数を必要なだけ操作します。

親タグでは、子タグのコードが実行されるため、マップ (この場合) が作成された後、その時点で必要なことは何でも実行できます。

私が見つけた基本的なパターンは、子タグの結果をリストのようなものに収集し、子がすべての作業を完了した後に親が実際のデータをページにレンダリングすることです。

親が他の親の中にネストされているタグ (つまり、あるタグが別のタグの状態と競合する場所) をタグで必要としていませんでしたが、一般的な意味でこの方法では明らかに問題になる可能性があります。それでも私の目的には効果的です。

于 2009-04-15T16:52:55.443 に答える
0

多分これは役に立つでしょう。

Michael Breed 2010年11月9日午前1時23分

これはもう1年近く経っていますが、たまたま自分でタグファイルの使用を検討しているので、ここに記載されている制限を修正すると思いました。実際、JSPで「フラグメント」と呼ばれるものを使用し、jsp:invokeタグを使用して、複数のセクションを挿入することができます。方法は次のとおりです。

于 2011-03-31T19:39:46.523 に答える
0

上記のJavaコードをJSPに挿入し、ページにパラメータを設定して「親」をJSPページに渡すことができることを忘れるほど愚かでした...

この質問を閉じるべきかどうかわかりません。答えはややばかげているからです。StackOverflow の上級ユーザーの方は、アドバイスをお願いします。

于 2009-04-15T16:37:12.703 に答える