1

カスタムタグハンドラー内でHTMLを生成しないようにする方法について、この質問に対する答えを見つけようとして壁にぶつかりました。この質問者のように、タグハンドラーで大量のステートメントを回避しようとしてprintln()います。実際には、別の.jspファイルからデータを取得したいと思います。

したがって、私は提案された方法を試しました:

public int doStartTag() throws JspException {
    try {
        pageContext.getResponse().flushBuffer();
        pageContext.getRequest()
                .getRequestDispatcher("/views/tags/loginBlock.jsp")
                .include(pageContext.getRequest(), pageContext.getResponse());
    } catch (Exception e) { throw new RuntimeException(e); }

    return EVAL_BODY_INCLUDE;
}

ただし、取得しているのは、タグが配置されているjspの出力の上にあるloginBlock.jspのコンテンツであり、を呼び出しても、予想どおりにタグの代わりに挿入されていませんflushBuffer()

答えを得ようとしている質問がありますが、Googleの神々は今夜私に親切ではありません:

  1. タグハンドラーからHTMLのブロックを挿入する必要がある場合、これが最善の方法ですか?
  2. 元の回答では、ポスターは従来のタグハンドラーを使用しています。代わりに、単純なタグハンドラー(つまり、SimpleTagSupportを拡張するクラス)を使用してそれを行う方法はありますか?
  3. 上記の質問の質問者が回答を受け入れましたが、成功した結果を複製することはできません。質問者が私が省略しているものを拾い上げたものが欠けていますか?
  4. 私はここで私が気づいてさえいない何らかの方法で基地から離れているだけですか?私はjsp/サーブレット全体に少し慣れていないので、このデザインパターンが私が使用すべきものであるかどうかは100%確信していません。println()基本的に、ビジネスロジックを実行して結果のHTMLを生成するバックエンドJavaを呼び出すjspファイルを設計しようとしていますが、上記のように、Javaタグハンドラーに大量の呼び出しを貼り付けたくありません。

ヘルプや洞察をありがとう!

4

2 に答える 2

0

答えを見つけましたが、それが最良の答えかどうかわかりません。マスターjspページのページディレクティブにbuffer="none"を挿入しましたが、セカンダリjspページが想定どおりの位置に表示されます。繰り返しになりますが、それが最良の答えであるかどうかはわかりません。ページをバッファリングできるはずだからです。誰かがより良い提案をする場合に備えて、質問は数日間開いたままにしておきます。

于 2012-07-16T14:12:30.083 に答える
0

うわー、私はついにもっと良い答えを見つけました、そして私はおそらく比較的単純でかなり明白な何かを見落とさなければならないことを知っていました。include()2番目のパラメーターとしてブール値をとる 別のバージョンがあります。ドキュメントによると

フラッシュがtrueの場合、このJSPの現在のJspWriter "out"は、インクルードを処理する前に、この呼び出しの副作用としてフラッシュされます。それ以外の場合、JspWriterの「出力」はフラッシュされません。

したがって、上記の元のコードはSimpleTagHandlerを拡張するクラスにある必要があり、代わりに次のようになります。

public void doTag() {
    PageContext context = (PageContext)getJspContext();
    try {
        // The second parameter below (true) causes the JspWriter to be flushed
        context.include("/views/tags/loginBlock.jsp", true);
    } catch (Exception e) { throw new RuntimeException(e); }
}

これははるかに短くて単純なだけでなく、すべてのJSPページディレクティブにbuffer="none"を入れる必要がないことを意味します。他の誰かがこの質問と答えに出くわした場合、それが私にたくさんの悲しみを引き起こしたので、あなたがそれが役に立つと思うことを願っています。:)

于 2012-07-17T03:15:06.503 に答える