1

ブラウザに送信する前に、Struts 2 (タイルを使用) でページ全体を構築する方法はありますか? ブラウザーで一度に 1 つずつ「プログレッシブ」にページを作成したくありません。

私が解決しようとしている主な問題は、コンテンツの一部のみが変更された場合でも、Internet Explorer 7 がページを点滅/点滅させることです (firefox はこれをはるかにスムーズに行います)。

そのため、次のページがある場合:

ヘッダ

いくつかのコンテンツ

フッター

また、「一部のコンテンツ」領域はページの読み込み間でのみ変化し、フッター部分はフッターの背景色で塗りつぶす前に白い背景を点滅させます。ストラットに完全なページを送信させることで、「点滅」をなくすのに十分な速さでロードできるのではないかと考えました。これで、FOOTER はその前の部分よりも少し遅れてサーバーから取得されるため、点滅します (Internet Explorer では、Firefox はページをスムーズに表示します)。

注意: これはサイトにとって重要な要件であり、ajax を使用して中間コンテンツをロードすることはできません (フレームやその他の「ハック」と同様)。このサイトは、テーブル レイアウトではなく CSS を使用して構築されています。機能させるには、テーブル レイアウトを使用する必要があるかもしれません...

tiles flush パラメータの使用について: 試してみましたが、必要に応じて機能しません。ページ全体にフラッシュパラメータが必要です。通常の 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 が評価される前に既に終了しています (私の Thread.sleep() テスト)。応答全体を文字列にレンダリングし、それを一度にブラウザーに出力するにはどうすればよいか考えていました。

これは絶対確実ではなく、ネットワークの遅延などが原因である可能性があることはわかっていますが、出力への応答を一度に取得でき、テーブルベースのレイアウトを使用できる場合 (IE は、テーブルが閉じた後にのみテーブルをレンダリングする可能性があります)、これは可能性があります。合理的に働く。

または、これをFirefoxに切り替えようとするか、この小さな不具合をすべて忘れてください...

更新 2

これは私を悩ませ始めたので、私はいくつかの調査をしました。プレーンな jsp ページ (タイルなし) がある場合、バッファリングは機能します (バッファー属性を使用)。そのため、Thread.sleep() がある場合、ページ サイズがバッファー サイズを下回っていれば、2 秒後にページ全体がレンダリングされます。しかし、ページでタイルを使用した場合 (上記の例のように)、ページを同時にレンダリングすることはできませんでした (すべての tiles-templates/"components" に page ディレクティブを含めても、助けにはなりませんでした)。それで、タイルはおそらくどこかに応答をフラッシュしますか?

さらに、「問題のあるタイル」は、struts:form タグを含む私の体の部分でした。それを通常のフォームタグに置き換えたところ、思い通りに機能しました...

更新 3

わかりました、誰もタイルやストラット タグの内部の仕組みを知らないようです...これは非常に特殊なケースと要件であるため、大きな問題はありません。アプリケーションの前にプロキシとして Apache を使用し、Apache のプロキシ構成オプションを使用して大きなバッファを指定することで、この問題を回避しました。これを回答済みとしてマークします。

4

2 に答える 2

1

必要に応じて、サーバー側でページ データを一度に送信することもできます (多くのフレームワークは便宜上そうしています) が、ネットワークの現実は、すべてが一度に到着するわけではなく、パケットが到着するとブラウザーがそれをレンダリングすることです。これは、ページを一度にすべて表示したい*場合でも、応答性には良いことです。

マークアップを簡素化し、デフレート圧縮を使用してペイロードのサイズを抑えることで、遅延を可能な限り減らすことができます。これは、一般的に行う価値のあることです。さらに、スタイル設定されていないコンテンツのフラッシュに当たらないようにすることができます。しかし、ブラウザーがいつレンダリングを選択するかを制御することはできません。すべてを JavaScript で実行しなければ、すべての欠点が伴います (それでも、ブラウザーの再描画が遅くなる可能性があります)。

(* - または、あなたのサイトが Web 上の他のすべてのページとは異なる方法で機能するというこの「重要な要件」を思いついた場合は、クライアント/上司。)

于 2009-01-13T15:41:28.080 に答える
0

tiles コンポーネントで「flush」属性を使用できますか?

<tiles:insertAttribute name="body" flush="false"/>

さらに、出力バッファが大きくなりすぎると、とにかくフラッシュされます。バッファサイズを増やしてみませんか?

<%@ page language="java" buffer="500kb" autoFlush="false" %>
于 2009-01-13T13:42:25.667 に答える