我正在制作一个页面,我在其中调用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
我希望这段代码可以帮助解释发生了什么,足以解决我的问题,谢谢。
答案 0 :(得分:2)
我见过这种情况发生在我过去的类似系统上。我认为这是面孔和漂亮面之间的相互作用,缺少文件。 RES_NOT_FOUND
部分来自网络流量。它有一些可能面临资源(或样式表),它试图在库中找到它们,当它不能时,它实际上导致浏览器转到URL /informes/RES_NOT_FOUND
。出于某种原因,如果我刷新页面并且不会发出RES_NOT_FOUND
网址,它通常会找到该资源。
首先,我打开了页面源代码,你会发现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页面,但我对此不太了解这样做。
答案 1 :(得分:1)
首先,您的isPostBack
变量被调用两次的原因很可能是因为您有两个bean实例,而不是一个单例实例。有几个原因可能会发生:
load()
方法。我也相信你的方法有可能被调用两次,因为你编写EL表达式的方式(我不是100%肯定):
<action onPostback="false">#{informesPerfilMB.load()}</action>
^^
请注意方法表达式末尾的括号。我相信这将迫使EL在评估表达式时评估方法。您的方法表达式应如下所示:
<action onPostback="false">#{informesPerfilMB.load}</action>
您还应该检查应用程序中可能调用此方法的其他位置。
如果有帮助,请告诉我。