我有一个关于p:messages组件的问题。
首先,这是我的配置:
- PrimeFaces:4.0.3(精英)
- JSF:MyFaces 2.0.2
- 服务器:WebSphere 8.5.0.2
然后,我的代码:
测试.xhtml
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
xmlns:fn="http://java.sun.com/jsp/jstl/functions">
<h:head>
<f:facet name="first">
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</f:facet>
<meta http-equiv="cache-control" content="no-store,no-cache" />
<meta http-equiv="pragma" content="no-cache" />
<meta http-equiv="expires" content="0" />
</h:head>
<h:body>
<div id="content">
<h:form id="form1">
<p:tooltip/>
<p:messages id="messages" showDetail="true" />
<p:remoteCommand async="true" autoRun="true" process="@this" partialSubmit="true" action="#{testBean.checkA}" />
<p:remoteCommand async="true" autoRun="true" process="@this" partialSubmit="true" action="#{testBean.checkB}" />
</h:form>
</div>
</h:body>
</html>
测试.java
import java.io.Serializable;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.primefaces.context.RequestContext;
@ManagedBean(name="testBean")
@ViewScoped
public class Test implements Serializable {
private static final long serialVersionUID = -1L;
public void checkA() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Message 1", null));
RequestContext.getCurrentInstance().update("form1:messages");
}
public void checkB() {
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN,"Message 2", null));
RequestContext.getCurrentInstance().update("form1:messages");
}
}
这段代码的作用非常简单。当页面加载时,会进行两次 AJAX 调用(checkA 和 checkB)。我Thread.sleep(2000)
在 checkA 中放了一个用于测试目的,因为我希望它在 checkB 之后完成。一旦方法完成,它会向 UI 发送回一条消息。
当我加载页面时,我看到了两个 AJAX 调用。CheckB 将首先完成,所以我会在我的页面上看到“消息 2”。但是一旦 checkA 完成,消息就会被“消息 1”替换。我想做的是将“消息 1”附加到“消息 2”,因此用户将在屏幕上看到两条消息。有没有办法做到这一点,或者它是组件的限制?
其次,正如您在我的代码中看到的那样,我必须打电话RequestContext.getCurrentInstance().update("form1:messages");
才能看到我p:messages
的更新。如果我删除这行代码并添加autoUpdate="true"
到组件中,它就不起作用......
不幸的是,需要考虑的一件事是,我无法更改服务器的配置,因为我不管理它,并且上面已经有几十个其他应用程序。
在此先感谢您的帮助!