gpt4 book ai didi

ajax - 如何使用 PrimeFaces 消息组件堆叠消息?

转载 作者:行者123 更新时间:2023-12-03 05:57:16 24 4
gpt4 key购买 nike

我有一个关于 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 将首先完成,因此我将在我的页面上看到“Message 2”。但是,一旦 checkA 完成,该消息就会被“Message 1”替换。我想要做的是将“消息 1”附加到“消息 2”,这样用户就会在屏幕上看到两条消息。有什么办法可以做到这一点还是组件的限制?

其次,正如你在我的代码中看到的,我必须调用 RequestContext.getCurrentInstance().update("form1:messages");为了看到我的p:messages正在更新。如果我删除这行代码并添加 autoUpdate="true"对于组件,它不起作用...

不幸的是,需要考虑的一件事是,我无法更改服务器的配置,因为我不管理它,而且上面已经有数十个其他应用程序。

预先感谢您的帮助!

最佳答案

您遇到的问题是 FacesMessages 是 Request Scoped 。当您执行两个 ajax 请求时,当您到达第二个请求的末尾时,第一条消息此时不可用。

您使用的是 @ViewScoped bean,它在您离开 View 本身之前一直保持事件状态,因此解决方法应该是有一种堆栈/队列来存储要显示的消息。当您认为最后一个请求已完成时,只需将所有消息添加到 FacesContext 并清除堆栈即可。

其他选择是以相同的方法执行所有操作,然后显示您想要的消息。由于执行一个请求而不是两个请求,您会减少网络流量,但如果您想要render specific parts of the page before other ones,您的选择似乎很有趣.

关于您的更新问题,请记住您可以直接在页面中指定要更新的表单部分。尝试将 update="messages" 添加到您的 p:remoteCommand 标记中。关于 autoUpdate 不起作用,可能是您的 remoteCommandpartialSubmit 属性给您带来了问题。从 Primefaces docs 查看该属性的定义:

partialSubmit: Enables serialization of values belonging to the partially processed components only.

关于ajax - 如何使用 PrimeFaces 消息组件堆叠消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19854012/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com