0

複数の HTTP 要求が発生するため、InternetExplorer と Chrome でページをロードすると、JSF ライフサイクルが最大 3 回トリガーされることに気付きました。ただし、デバッグ出力は最初のライフサイクルにのみ存在します。(Firefox の場合、ライフサイクルは 1 つだけです)

問題はFirefoxには存在しないため、サーバー側の問題ではないと思います(たとえば、フェーズリスナーを2回接続することは1つの可能性があります)

そのため、実際には誰も必要としないサーバーリソースへのリクエストを引き起こしている Chrome と IE による呼び出しが必要です。

大きな問題は、どのような種類のコンポーネント/タグが別の HTTP リクエストを引き起こす可能性があるか、そしてそれらの追加のリクエストがなくても Firefox で機能するのはなぜですか? ブラウザがインデックスファイルを再度要求しているため、url 属性のないイメージタグがこのような動作を引き起こす可能性があることを読みました。ただし、Chrome のネットワーク診断では、無効な画像は表示されず、xhtml サイトの 1 つに対する二重のリクエストも表示されません。

IE の例:

13:56:14,046 INFO  [stdout] (http--0.0.0.0-8090-18) -- Started Request --
13:56:14,046 INFO  [stdout] (http--0.0.0.0-8090-18) ---- Started RESTORE_VIEW 1 ----
13:56:14,048 INFO  [stdout] (http--0.0.0.0-8090-18) ---- Started RENDER_RESPONSE 6 ----
13:56:14,100 INFO  [stdout] (http--0.0.0.0-8090-18) xybean constructed
13:56:14,712 INFO  [stdout] (http--0.0.0.0-8090-18) -- Finished Request --
13:56:15,106 INFO  [stdout] (http--0.0.0.0-8090-10) -- Started Request --
13:56:15,106 INFO  [stdout] (http--0.0.0.0-8090-10) ---- Started RESTORE_VIEW 1 ----
13:56:15,108 INFO  [stdout] (http--0.0.0.0-8090-10) ---- Started APPLY_REQUEST_VALUES 2 ----
13:56:15,110 INFO  [stdout] (http--0.0.0.0-8090-10) ---- Started PROCESS_VALIDATIONS 3 ----
13:56:15,111 INFO  [stdout] (http--0.0.0.0-8090-10) ---- Started UPDATE_MODEL_VALUES 4 ----
13:56:15,112 INFO  [stdout] (http--0.0.0.0-8090-10) ---- Started INVOKE_APPLICATION 5 ----
13:56:15,114 INFO  [stdout] (http--0.0.0.0-8090-10) ---- Started RENDER_RESPONSE 6 ----
13:56:15,115 INFO  [stdout] (http--0.0.0.0-8090-10) -- Finished Request --

Firefox で同じページを呼び出す:

14:03:33,443 INFO  [stdout] (http--0.0.0.0-8090-2) -- Started Request --
14:03:33,443 INFO  [stdout] (http--0.0.0.0-8090-2) ---- Started RESTORE_VIEW 1 ----
14:03:33,444 INFO  [stdout] (http--0.0.0.0-8090-2) ---- Started RENDER_RESPONSE 6 ----
14:03:33,496 INFO  [stdout] (http--0.0.0.0-8090-2) xybean constructed
14:03:34,258 INFO  [stdout] (http--0.0.0.0-8090-2) -- Finished Request --
4

1 に答える 1

1

解決策は非常に簡単でした:

私は2つのファビコンを宣言しました:

<!-- For Modern Browsers -->
<link rel="shortcut icon" href="./img/favicons/favicon.png" />

<!-- For everything else -->
<link rel="shortcut icon" href="./img/favicons/favicon.ico" />

web.xml で、サーブレット マッピングを次のように宣言しました。

<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>/faces/*</url-pattern>
</servlet-mapping>

http://localhost/myApp/faces/img/favicons/favicon.pngそのため、IE と Chrome はそのようにしてサーブレットを探して呼び出しました。ファビコンを絶対 URL に変更すると (面を除外して)、問題が解決しました。

Faces サーブレットの url-pattern を、より具体的なもの*.xhtmlや、呼び出したいファイルの種類に変更することもお勧めです。

于 2013-01-29T14:28:30.327 に答える