- PR -

JSPでout.close()

1
投稿者投稿内容
mikan
ベテラン
会議室デビュー日: 2002/08/19
投稿数: 58
投稿日時: 2003-11-21 09:53
JSPで、条件によってはここでHTMLの出力をやめたい、ときの方法についてなのですが(ASPだと Response.End っぽいこと)、out.close() をしているサンプルを見かけました。
試してみたら出力はとまってましたが、これってout.close()した後のout.write()でIOExceptionが発生してスキップされているだけなのですよね。
xxx_jsp.javaの最後のほうは
コード:
    } catch (Throwable t) {
      if (!(t instanceof SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          out.clearBuffer();
        if (pageContext != null) pageContext.handlePageException(t);
      }
    } finally {


となっているので、SkipPageExceptionってカスタムタグの絡みだったと思うのですが、out.close()で止めるよりはSkipPageExceptionを投げるほうがいいのかな?と思った次第です。
それともそんな変なことしないで、素直にclose()しておけばいいものなんでしょうか?
(でもclose()だと、Tomcatのログに Internal error flushing the buffer in release() って出るので、なんか気が引けるんです)

出力を途中で止めること自体に問題があるとすれば困ってしまうんですが、条件分岐とか使うと、ごちゃごちゃになって読めなくなるので、思い切って止めてしまぇ、な勢いです。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2003-11-21 10:57
close()やflush()を不用意に呼び出すと keepalive 接続を保持できなくなりパフォーマンスに影響を与える可能性があります。以下は WebLogic のドキュメントですが、Tomcat でも同様だと思います。素直に分岐するのが良さそうです。見通しが悪くなることを懸念するのであれば、追加して出力する部分は include するようにしてはいかがでしょう?

・[WebLogic HTTP サーブレット プログラマーズ ガイド]-[応答の提供]
http://edocs.beasys.co.jp/e-docs/wls/docs81/servlet/progtasks.html#159442
> 出力ストリームは close() メソッドでクローズしないでください。また、
>ストリームのコンテンツをフラッシュすることも避けてください。出力ストリーム
>をクローズしたりフラッシュしたりしないことによって、WebLogic Server は次の
>手順で説明する永続的 HTTP 接続の利点を活かすことができます。
mikan
ベテラン
会議室デビュー日: 2002/08/19
投稿数: 58
投稿日時: 2003-11-21 12:07
>close()やflush()を不用意に呼び出すと keepalive 接続を保持できなくなりパフォーマンスに影響を与える可能性があります。

そうなんですか。できることとやっていいことは同じとは限らないって事ですかね。

ひとつ思いついたことがあって、JSPに
コード:
<%
if (条件) return;
%>


って書いてみたら、見かけ上は思い通りの動きになったんです。

カスタムタグを使ったページのコードも
コード:
    if (_jspx_xxxxxxxx.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE)
      return true;


になってましたから、return抜けは妥当でしょうか?
1

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