双重号召性用语 - prettyfaces - jsf

Double call to action - 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

我希望这段代码有助于解释正在发生的事情,足以解决我的问题,谢谢。

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

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

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

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

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

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

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

如果有帮助,请告诉我。

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

,它通常会找到该资源

首先,我打开页面源代码,您会发现 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 页面,但我对此了解不够。