双重调用action-prettyfaces-jsf

双重调用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

我正在制作一个页面,其中我调用了一个PrettyFaces页面加载操作方法:

<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并调用
    load()
    方法的部分多次创建bean
我还认为,由于您编写EL表达式的方式,您的方法可能会被调用两次(我不是100%确定):

#{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;
  } 
}