双重调用action-prettyfaces-jsf
我正在制作一个页面,其中我调用了一个PrettyFaces页面加载操作方法:双重调用action-prettyfaces-jsf,jsf,action,prettyfaces,Jsf,Action,Prettyfaces,我正在制作一个页面,其中我调用了一个PrettyFaces页面加载操作方法: <url-mapping id="informes-perfil"> <pattern value="/informes/#{informesPerfilMB.codigo}" /> <view-id value="/faces/informes_perfil.xhtml" /> <action onPostback="false">#{infor
<url-mapping id="informes-perfil">
<pattern value="/informes/#{informesPerfilMB.codigo}" />
<view-id value="/faces/informes_perfil.xhtml" />
<action onPostback="false">#{informesPerfilMB.load()}</action>
</url-mapping>
isPostBack
变量被初始化为false
,因此这应该可以防止再次调用该方法,但由于某些原因,它是
此代码首先打印字符串:dcc509a6f75849b
。
然后,当重复加载时,它会打印以下内容:RES\u NOT\u FOUND
我希望这段代码能够帮助解释发生了什么,足以解决我的问题,谢谢。首先,调用
isPostBack
变量两次的原因很可能是因为您有两个bean实例,而不是一个单例实例。发生这种情况有几个原因:
- 您的bean是请求范围的,并且正在对页面发出多个请求
- 应用程序中使用bean并调用
方法的部分多次创建beanload()
#{informesPerfilMB.load()}
^^
注意方法表达式末尾的括号。我相信这将迫使EL在计算表达式时计算方法。您的方法表达式应如下所示:
<action onPostback="false">#{informesPerfilMB.load}</action>
#{informesPerfilMB.load}
您还应该检查应用程序中可能调用此方法的其他位置
请告诉我这是否有帮助。我以前在类似的系统上见过这种情况。我认为这是一个脸和漂亮脸之间的互动,缺少文件。
RES\u NOT\u FOUND
部分来自网络流量。它试图在库中找到一些可能的faces资源(或样式表),如果找不到,则会导致浏览器转到URL/informes/RES\u NOT\u FOUND
。出于某种原因,如果我刷新页面并且不发出RES\u NOT\u FOUND
URL,它通常会找到该资源
首先,我打开页面源代码,您会发现RES\u NOT\u FOUND
,很可能还有样式表。考虑到它的位置,您可以将它与xhtml文件中加载的资源相关联,并查看缺少的资源。如果这没有帮助,请尝试开发人员工具,查看哪些资源已加载,哪些未加载。然后确保资源存在、部署并且位于正确的位置
如果它不是您可以控制的(如库资源),您可以始终确保setCodigo
函数忽略“RES\u not\u FOUND”的值
您可以修改您的安全性或servlet映射设置(在
WEB.XML
中),以防止以RES\u NOT\u FOUND
结尾的URL访问prettyfaces页面,但我对此了解不够。您可以包括您的配置吗?web.xml和faces config.xml?此外,您使用的是什么版本的PrettyFaces?如果您在此方法中设置断点(或打印堆栈跟踪)并发布堆栈,以便我们可以查看从何处调用该方法,这也会有所帮助。这是理解该方法为何被调用两次的第一步。rewrite-config-prettyfaces-2.0.9.Final.jar、rewrite-integration-faces-2.0.9.Final.jar、rewrite-servlet-2.0.9.Final.jar和rewrite-servlet-2.0.9.Final.jar在JBoss EAP 6.2上虽然没有直接指向错误,但我给出了建议。问题是我有一个PrimeFaces扩展的组件。例如:pe:inputNumber。这次调用它时,volviar执行对页面的调用。我不明白确切的原因,但已经解决了。谢谢你的帮助。
<action onPostback="false">#{informesPerfilMB.load()}</action>
^^
<action onPostback="false">#{informesPerfilMB.load}</action>
public void setCodigo(String value) {
if (!"RES_NOT_FOUND".equals(value)) {
this.codigo = value;
}
}