【问题标题】:Double call to action - prettyfaces - jsf双重号召性用语 - 漂亮面孔 - jsf
【发布时间】:2016-11-24 01:33:44
【问题描述】:

我正在制作一个调用 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

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

【问题讨论】:

  • 能否包含您的配置? 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 在 JBoss EAP 6.2

标签: jsf action prettyfaces


【解决方案1】:

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

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

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

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

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

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

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

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

【讨论】:

  • 虽然没有直接报错,建议我还是留下。问题是我有一个 PrimeFaces 扩展的组件。例如:pe:inputNumber。这次它被调用,volviar 执行对页面的调用。我不明白为什么,但已经解决了。感谢您的帮助。
【解决方案2】:

我过去曾在类似的系统上看到过这种情况。我认为这是缺少文件的面孔和漂亮面孔之间的交互。 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 进入漂亮的页面,但我对此知之甚少。

【讨论】:

    猜你喜欢
    • 2014-04-10
    • 2014-07-16
    • 2012-11-12
    • 2012-10-18
    • 2012-10-05
    • 1970-01-01
    • 2011-05-25
    • 2015-03-30
    • 2010-11-18
    相关资源
    最近更新 更多