多次执行JSF生命周期

多次执行JSF生命周期,jsf,lifecycle,Jsf,Lifecycle,我注意到,在InternetExplorer和Chrome中加载我的页面最多会触发JSF生命周期3次,因为会触发多个HTTP请求。然而,我的调试输出仅出现在第一个生命周期中。(对于Firefox,只有一个生命周期) 由于Firefox中不存在该问题,我假设这不是服务器端问题(例如,连接两次phaselistener可能就是一个问题) 因此,Chrome和IE需要进行一些调用,这些调用会导致对某个服务器资源的请求,而实际上不需要任何人 最大的问题是:什么样的组件/标签可能会导致另一个HTTP请求,

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

由于Firefox中不存在该问题,我假设这不是服务器端问题(例如,连接两次phaselistener可能就是一个问题)

因此,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 --

解决方案非常简单:

我宣布了两项义务:

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

Facesservlet
/面孔/*
因此,IE和Chrome一直在寻找
http://localhost/myApp/faces/img/favicons/favicon.png
并通过这样做调用servlet。将favicon更改为绝对URL(不使用面)解决了这个问题


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

这不是JSF的问题。JSF不创建请求。是客户干的。IE有效地发送了2个HTTP请求。如果在IE中禁用JavaScript,它还会这样做吗?如果没有,那么你就找到了根本原因。很可能在某个地方有一个
form.submit()
调用或在文档准备期间执行的XHR POST请求。此外,在您的问题中,“生命周期”一词的用法也是不正确和令人困惑的。一般来说,您实际上是想说“HTTP请求”。我建议修改您的问题。@BalusC如果客户端创建的HTTP请求超过1个,如何处理?不能期望最终用户禁用Java脚本。最终用户甚至可能不知道浏览器中的这种功能。如果我发现
form.submit()
或文档准备期间执行的XHR POST请求,应该做什么修复?@VikasV:uhm,禁用JS只是一个确定根本原因的快速测试:)至于应该做什么,取决于问题的根本原因和业务需求,到目前为止,这两个都还不清楚。@BalusC thx以获取提示。我在IE中禁用了图像加载,现在只有一个HTTP请求,触发了一个JSF生命周期(更好的措词?:-),因此它必须处理文章中提到的图像,即使所有图像都正确显示和加载。我会仔细检查这一页,看看能不能找到有虫子的苹果。@dognose请在你修好后告诉我们。我也面临着同样的问题:)也许浏览器对favicon的处理方式不同,昨天我收到了一篇关于favicon和浏览器行为的有趣博客文章(特别注意IE favicon的处理方式):