对prettyfaces-jsf进行双重调用



我正在制作一个页面,在其中我调用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>

由于某种原因,informesPerfilMB.load()操作被调用两次,第二次调用中的参数值为"null"或"RES_NOT_FOUND"。

这是我的加载方法:

public void load() {
    if (isPostBack) {
        isPostBack = false;
        try {
            System.out.println(codigo);
            informe = informeEJBServiceLocal.getByCodigo(codigo);
            this.buscarInformeIngreso();
            this.buscarInformeOtroIngreso();
        } catch (EJBServiceException e) {
            e.printStackTrace();
        }
    }
}

isPostBack变量被初始化为false,因此这应该可以防止再次调用该方法,但由于某种原因,它是。

此代码首先打印String: dcc509a6f75849b。然后,当重复加载时,它会打印以下内容:RES_NOT_FOUND

我希望这段代码能帮助解释发生了什么,足以解决我的问题,谢谢。

我以前在类似的系统上看到过这种情况。我认为这是人脸和缺少文件的漂亮人脸之间的交互。RES_NOT_FOUND部分来自网络流量。它试图在库中找到一些可能的face资源(或样式表),但如果找不到,则会导致浏览器转到URL /informes/RES_NOT_FOUND。出于某种原因,如果我刷新页面并且不发出RES_NOT_FOUNDURL,它通常会找到该资源。

首先,我打开页面源代码,您会发现RES_NOT_FOUND,很可能还有样式表。考虑到它的位置,您可能能够将它与xhtml文件中加载的资源关联起来,并查看缺少哪一个。如果这没有帮助,请尝试开发人员工具,看看哪些资源已加载,哪些未加载。然后确保资源存在、部署并且位于正确的位置。

如果它不是您可以控制的东西(如库资源),您可以始终确保setCodigo函数忽略"RES_not_FOUND"的值。

public void setCodigo(String value) {
  if (!"RES_NOT_FOUND".equals(value)) {
    this.codigo = value;
  } 
}

您可能可以修改您的安全性或servlet映射设置(在WEB.XML中),以防止以RES_NOT_FOUND结尾的URL进入prettyfaces页面,但我对此了解不足。

首先,isPostBack变量被调用两次的原因很可能是因为您有两个bean实例,而不是一个singleton实例。发生这种情况有几个原因:

  • 您的bean是请求范围的,并且正在向页面发出多个请求
  • 应用程序中使用bean并调用load()方法的部分正在多次创建bean

我还相信,由于您编写EL表达式的方式,您的方法可能被调用了两次(我不能100%确定):

 <action onPostback="false">#{informesPerfilMB.load()}</action>
                                                   ^^

注意方法表达式末尾的括号。我相信这将迫使EL在评估表达式时评估该方法。您的方法表达式应该如下所示:

 <action onPostback="false">#{informesPerfilMB.load}</action>

您还应该检查应用程序中可能调用此方法的其他位置。

如果这有帮助,请告诉我。

相关内容

  • 没有找到相关文章

最新更新