2011-10-31 10 views
2

私はいくつかのテストを行っていましたが、ライターが自動的にフラッシュされない、つまりすべてのコンポーネントがレンダリングされるまでクライアント側で応答が表示されないことに気付きましたか?JSF 2 - ResponseWriter.flushの意義

私は手動でレスポンスライターをフラッシュしてみましたが、何の違いもありませんでした。応答がクライアントに以前利用可能になるように手動フラッシュを許可する方法はありますか?

おかげ

答えて

3

はおそらく、あなたは間違った瞬間に、間違った作家またはと呼ばれるフラッシュを使用したり(すなわち、動作がブラウザ/ CSS/JS固有のものです)の結果を誤解します。次のテストケースはMojarra 2.1.3で動作します。

public String getText() throws Exception { 
    FacesContext.getCurrentInstance().getExternalContext().responseFlushBuffer(); 
    Thread.sleep(250); 
    return "<br />a line of text"; 
} 

<h:outputText value="#{bean.text}" escape="false" /> 
<h:outputText value="#{bean.text}" escape="false" /> 
<h:outputText value="#{bean.text}" escape="false" /> 
<h:outputText value="#{bean.text}" escape="false" /> 
<h:outputText value="#{bean.text}" escape="false" /> 
<h:outputText value="#{bean.text}" escape="false" /> 
<h:outputText value="#{bean.text}" escape="false" /> 
<h:outputText value="#{bean.text}" escape="false" /> 
<h:outputText value="#{bean.text}" escape="false" /> 
<h:outputText value="#{bean.text}" escape="false" /> 

あなたは明らかに一度の代わりに、すべての行ずつ表示されるブラウザでそれらを参照してください。

上記の方法は実際にはお勧めできませんのでご注意ください。コンテキスト・パラメータjavax.faces.FACELETS_BUFFER_SIZEを使用してレスポンス・バッファ・サイズを微調整できます。

<context-param> 
    <!-- Flush every 128 bytes (default is 1024) --> 
    <param-name>javax.faces.FACELETS_BUFFER_SIZE</param-name> 
    <param-value>128</param-value> 
</context-param> 
+0

あなたは正しいです。私は単純なcontext.getResponseWriter().flush()を使っていました。あなたが引用した方法が正しい方法でした。 – Nerrve

+0

まだ別の関連する質問があります。どのようにバッファサイズに関係なく、responseFlushBuffer()メソッドは応答をクリアしようとしているので、BUFFER_SIZEはどのように関係しますか? – Nerrve

+0

バッファがいっぱいになると、自動的にフラッシュされます。したがって、サイズがデフォルトよりも(それほど)小さい場合、自動的にフラッシュされる頻度が高くなります。参照してください。 – BalusC