“プログレッシブ”ではなく、完全なページをレンダリングします(ストラット2 /タイルを使用)
質問
Struts 2(タイルを使用)を取得して、ブラウザに送信する前にページ全体を構築する方法はありますか?ページを「プログレッシブに」ビルドしたくないブラウザーで一度に1つの部分。
私が解決しようとしている主な問題は、Internet Explorer 7が一部のコンテンツのみが変更されてもページをフラッシュ/点滅させることです(firefoxはこれをよりスムーズに行います)。
次のようなページがある場合:
ヘッダー
一部のコンテンツ
FOOTTER
および「一部のコンテンツ」領域はページの読み込み間でのみ変化します。フッターの背景色で塗りつぶす前に、FOOTERパーツはまだ白い背景を点滅させます。ストラットにページ全体を送信させることで、「点滅」を排除するのに十分な速度でロードできると考えました。 これでFOOTERはその前の部分よりも少し遅れてサーバーから送信されるため、点滅します(Internet Explorerでは、Firefoxはページをスムーズに表示します)。
NB:これはサイトにとって重要な要件であり、ajaxを使用して中間コンテンツを読み込むことはできません(フレームまたは他の「ハック」と同様)。このサイトは、テーブルレイアウトではなくCSSを使用して構築されています。おそらく、テーブルレイアウトを使用して機能させる必要があります...
タイルフラッシュパラメーターの使用について: 私はそれを試してみましたが、私が必要とするようには動作しません。ページ全体にフラッシュパラメータが必要です。通常のjspページディレクティブ" autoFlush = false"を試しました。しかし、それはうまくいきませんでした。メインのテンプレートページで(タイルではなく)このディレクティブを設定します。
ヘッダー、ボディ、およびフッターのテンプレートを使用するメインテンプレートの例を次に示します。 Thread.sleep()を使用すると、問題を簡単に発見できます。フッターは、ページの他の部分より2秒遅れてレンダリングされます。
<body>
<div id="container">
<t:insertAttribute name="header" flush="false" />
<div id="content"><t:insertAttribute name="body" flush="false"/></div>
<div class="clear"></div>
<% Thread.sleep(2000); %>
<t:insertAttribute name="footer" flush="false" />
</div>
</body>
更新
コメントをありがとう。これは通常のWebページではないため、要件は実際にはほぼ合理的です。
ただし、IEを構成して、しばらくしてからレンダリングを開始する方法はないようです(Firefoxには、100ミリ秒の構成可能な遅延があります)
TilesResultをインターセプトしようとしましたが、コンテンツ全体が明らかに評価される前にメソッドdoExecuteが実行されるため、jspが評価される前にメソッドが既に終了しています(my Thread.sleep()テスト)。文字列に対する応答全体をレンダリングし、それを一度にすべてブラウザに出力する方法を考えていました。
これは絶対確実ではなく、ネットワーク遅延などがこれを考慮に入れる可能性があることは知っていますが、出力への応答を一度に取得でき、テーブルベースのレイアウトを使用できる場合(IEはおそらくテーブルを閉じた後にのみテーブルをレンダリングします)これは合理的に機能します。
または、これをFirefoxに切り替えようとするか、この小さな不具合をすべて忘れてください...
更新2
これが気になり始めたので、調査を行いました。 プレーンなjspページ(タイルなし)がある場合、バッファリングは機能します(バッファ属性を使用)。したがって、Thread.sleep()がある場合、ページサイズがバッファサイズを下回ると2秒後にページ全体がレンダリングされます。 しかし、ページでタイルを使用した場合(上記の例のように)、ページを同時にレンダリングすることができませんでした(すべてのタイルテンプレート/&quot;コンポーネント&quot;にページディレクティブを含めても、助けはありません) 。タイルはおそらく応答をどこかにフラッシュしますか?
さらに、「問題のあるタイル」 struts:formタグを含む私の身体部分でした。私はそれを通常のフォームタグに置き換えました、そして、それは私が望むように働きました...
更新3
さて、誰もタイルや支柱タグの内部の仕組みを知らないようです... これは非常に特殊なケースおよび要件であるため、大きな問題はありません。 アプリケーションの前でプロキシとしてapacheを使用し、apacheのプロキシ設定オプションを使用して大きなバッファを指定することで、この問題を回避しました。 これを回答済みとしてマークします。
解決
&quot; flush&quot;を使用できますか?タイルコンポーネントの属性?
<tiles:insertAttribute name="body" flush="false"/>
さらに、出力バッファが大きくなりすぎると、とにかくフラッシュします。バッファサイズを増やしてみてください。
<%@ page language="java" buffer="500kb" autoFlush="false" %>
他のヒント
必要に応じて、サーバーエンドでページデータを一度にすべて送信できます(多くのフレームワークでは利便性のためにとにかくそれを行います)が、ネットワーキングの現実は、すべてが一度に到着せず、パケットが到着します。また、ページを一度にすべて表示したい場合でも、これはレスポンシブネスにとって良いことです。
マークアップを簡素化し、deflate圧縮を使用してペイロードサイズを小さくすることで、ラグを可能な限り減らすことができます。これは一般に行う価値のあることです。さらに、スタイル設定されていないコンテンツのFlashにヒットしていないことを確認できます。ただし、ブラウザがレンダリングを選択するタイミングを制御することはできません。すべての欠点を伴うJavaScriptですべてを行うことはできません(それでも、ブラウザの再描画が遅くなる可能性があります)。
(*-またはクライアント/ボス、もしそれがこの「重要な要件」を思いついたなら、あなたのサイトはウェブ上の他のすべてのページとは異なる動作をするということです。)