Redirect 显示成功消息,然后在超时后使用PageFlow重定向到另一个页面

Redirect 显示成功消息,然后在超时后使用PageFlow重定向到另一个页面,redirect,jsf-2,primefaces,timeout,seam,Redirect,Jsf 2,Primefaces,Timeout,Seam,如何显示成功消息,然后在超时(例如5秒)后将用户重定向到另一个页面 我需要一个成功登录后登录页面这一点。我尝试了以下操作,可以看到登录失败时的警告消息,但无法看到登录成功时的成功消息。它立即显示目标页面 public String check(){ if (username.equals("test") && password.equals("test")) { FacesContext.getCurrentInstance().addMessag

如何显示成功消息,然后在超时(例如5秒)后将用户重定向到另一个页面

我需要一个成功登录后登录页面这一点。我尝试了以下操作,可以看到登录失败时的警告消息,但无法看到登录成功时的成功消息。它立即显示目标页面

public String check(){
      if (username.equals("test") && password.equals("test")) {
          FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Sample info message", "PrimeFaces rocks!")); 
            return "Success";
        }else{
          FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN,"Sample warn message", "Watch out for PrimeFaces!"));  
            return "Failure";
        }
    }
我使用Seam的PageFlow进行导航

我有一个

<p:messages id="messages" showDetail="true" autoUpdate="true" closable="true" />


在登录页面上。

首先,使用您发布的代码,您不会在重定向之前看到FacesMessage,而会在重定向之后看到它。但是,为了实现这一点,您需要添加一个过滤器,因为重定向时消息会丢失。这是所需过滤器的代码(别忘了在web.xml中声明):

在xhtml中,您需要有一个类似于以下内容的javascript函数:

function waitAndRedirect() {
    setTimeout(function() {
        hiddenButtonId.click();
    }, 2000);
}
其中Hiddenbutonid是重定向到主页并隐藏的p:按钮的ID(显示:无)


但同样,这是一种令人讨厌的方法,在我看来,没有必要这样做,您只需延迟登录过程。

这是Flash的实用程序之一。而不是

FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Sample info message", "PrimeFaces rocks!"));:
只需使用此代码

FacesContext facesContext = FacesContext.getCurrentInstance();
Flash flash = facesContext.getExternalContext().getFlash();
flash.setKeepMessages(true);
flash.setRedirect(true);
facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Sample info message", "PrimeFaces rocks!"));

不能在web.xml中声明MultipageMessageSupport,必须在faces-config.xml中声明MultipageMessageSupport。por示例:

enter code here

<lifecycle>
    <phase-listener>your.package.MultiPageMessagesSupport</phase-listener>
</lifecycle>
在此处输入代码
您的.package.multipageMessageSupport

Hello@Damian,我正在使用ajax,我尝试了Thread.currentThread().sleep(5000);它让页面等待5秒,但消息在重定向后显示,我只想在重定向前用该方法显示消息谢谢!!注意,这是一个面向JSF1.x的解决方案。在JSF 2.x中,使用flash scope有一种更好的方法。@Holysh我编辑了答案,解释了如何在重定向之前显示消息。
setRedirect()
调用是不必要的。请注意,该消息将出现在目标页面中,因此OP必须在那里有一个
。Hi@BalusC我正在等待您的回答:)是的,它与我的代码以及用户提供的代码一起工作,但问题是,我如何在重定向前显示消息,然后在5秒后显示消息,例如重定向到另一个页面Hi Balus,setRedirect的确切用途是什么?@Holysh,显示消息5秒不符合人体工程学,因为用户可能看不到消息,或者可能会浪费5秒。
FacesContext facesContext = FacesContext.getCurrentInstance();
Flash flash = facesContext.getExternalContext().getFlash();
flash.setKeepMessages(true);
flash.setRedirect(true);
facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Sample info message", "PrimeFaces rocks!"));
enter code here

<lifecycle>
    <phase-listener>your.package.MultiPageMessagesSupport</phase-listener>
</lifecycle>