JSF生命周期多次执行

时间:2013-01-29 13:05:24

标签: jsf lifecycle

我注意到在InternetExplorer和Chrome中加载我的页面会触发JSF-Lifecycle最多3次,因为有多个HTTP请求被触发。然而,我的调试输出仅存在于第一个生命周期中。 (对于Firefox,只有一个生命周期)

由于Firefox中没有问题,我认为它不是服务器端问题(附加一个phaselistener 2次可能是一个例子)

因此,Chrome和IE需要进行一些调用,这些调用会导致对某些服务器资源的请求,而实际上并不需要任何人。

最大的问题是:什么类型的组件/标签可能会导致另一个HTTP请求,为什么它在没有这些额外请求的Firefox中工作? 我读到没有url属性的图片标记可能会导致此类行为,因为浏览器再次请求索引文件。但Chrome的网络诊断不会显示任何无效图片,也不会显示任何双重请求其中一个xhtml网站。

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 --

1 个答案:

答案 0 :(得分:1)

解决方案非常简单:

我宣布了2个favicons:

<!-- 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映射如下:

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

因此,IE和Chrome一直在寻找http://localhost/myApp/faces/img/favicons/favicon.png并通过这样做来调用servlet。将favicon更改为绝对URL(将面省略)修复了问题。

将Faces Servlet的url-pattern更改为更具体的内容(如*.xhtml或您想要调用它的任何文件类型)也许是一个好主意。