双重号召性用语 - 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 页面,但我对此了解不够。
我正在制作一个调用 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 页面,但我对此了解不够。