2013-04-04 86 views
7

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

成功登录后,我需要此登录页面。我尝试了以下方法,并且可以在登录失败时看到警告消息,但不能在登录成功时看到成功消息。它立即显示目标页面。

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" /> 
在登录页面上

回答

6

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

public class MultiPageMessagesSupport implements PhaseListener { 

private static final long serialVersionUID = 1250469273857785274L; 
private static final String sessionToken = "MULTI_PAGE_MESSAGES_SUPPORT"; 

@Override 
public PhaseId getPhaseId() { 
    return PhaseId.ANY_PHASE; 
} 

/* 
* Check to see if we are "naturally" in the RENDER_RESPONSE phase. If we 
* have arrived here and the response is already complete, then the page is 
* not going to show up: don't display messages yet. 
*/ 
@Override 
public void beforePhase(final PhaseEvent event) { 
    FacesContext facesContext = event.getFacesContext(); 
    int msg = this.saveMessages(facesContext); 

    if (PhaseId.RENDER_RESPONSE.equals(event.getPhaseId())) { 
     if (!facesContext.getResponseComplete()) { 
      this.restoreMessages(facesContext); 
     } 
    } 
} 

/* 
* Save messages into the session after every phase. 
*/ 
@Override 
public void afterPhase(final PhaseEvent event) { 
    if (event.getPhaseId() == PhaseId.APPLY_REQUEST_VALUES || 
      event.getPhaseId() == PhaseId.PROCESS_VALIDATIONS || 
      event.getPhaseId() == PhaseId.INVOKE_APPLICATION) { 
     FacesContext facesContext = event.getFacesContext(); 
     int msg = this.saveMessages(facesContext); 
    } 
} 

@SuppressWarnings("unchecked") 
private int saveMessages(final FacesContext facesContext) { 
    List<FacesMessage> messages = new ArrayList<FacesMessage>(); 
    for (Iterator<FacesMessage> iter = facesContext.getMessages(null); iter.hasNext();) { 
     messages.add(iter.next()); 
     iter.remove(); 
    } 

    if (messages.isEmpty()) { 
     return 0; 
    } 

    Map<String, Object> sessionMap = facesContext.getExternalContext().getSessionMap(); 
    List<FacesMessage> existingMessages = (List<FacesMessage>) sessionMap.get(sessionToken); 
    if (existingMessages != null) { 
     existingMessages.addAll(messages); 
    } else { 
     sessionMap.put(sessionToken, messages); 
    } 
    return messages.size(); 
} 

@SuppressWarnings("unchecked") 
private int restoreMessages(final FacesContext facesContext) { 
    Map<String, Object> sessionMap = facesContext.getExternalContext().getSessionMap(); 
    List<FacesMessage> messages = (List<FacesMessage>) sessionMap.remove(sessionToken); 

    if (messages == null) { 
     return 0; 
    } 

    int restoredCount = messages.size(); 
    for (Object element : messages) { 
     facesContext.addMessage(null, (FacesMessage) element); 
    } 
    return restoredCount; 
} 
} 

如果你不工作,你需要之前显示的信息,然后你必须如下所示:使方法返回void,通过ajax调用它,并在添加成功消息后调用一些javascript方法,该方法将等待几秒钟,然后进行重定向(也许通过以编程方式单击隐藏的按钮重定向到下一页)。 在我看来这是不值得的麻烦,你只会推迟登录过程。反正用户就会知道塔tlogin成功是因为他会重定向到主页(或你送他到任何网页)

编辑: 的消息显示在页面时的方法完成,在管理,以便等待bean方法不起作用。加入的FacesMessage后,使用

RequestContext.getCurrentInstance().execute("waitAndRedirect()"); 

而在你的XHTML,你需要有一个类似的JavaScript函数:

function waitAndRedirect() { 
    setTimeout(function() { 
     hiddenButtonId.click(); 
    }, 2000); 
} 

其中hiddenButtonId是AP的ID:该按钮来重定向主页和隐藏(显示:无)

但是,再次,这是一个讨厌的方法,在我看来没有必要这样做,你只会延迟登录过程。

+0

你好@Damian, 我与阿贾克斯的工作,我都试过Thread.currentThread()睡眠(5000);它让页面等待5秒,但消息在重定向后显示,我只是想在显示消息之前用该方法重定向,谢谢! – Holysh 2013-04-04 12:35:41

+0

请注意,这是一个JSF 1。x目标解决方案。在JSF 2.x中,使用Flash范围有更好的方法。 – BalusC 2013-04-04 12:54:10

+0

@Holysh我编辑了答案,解释如何在重定向之前显示消息。 – Damian 2013-04-04 19:22:05

14

这是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!")); 
+0

'setRedirect()'调用是不必要的。请注意,该消息将出现在目标页面中,因此OP必须在该处有一个“”。 – BalusC 2013-04-04 12:52:26

+0

嗨@BalusC我在等你的答案:) 是的,它与我的代码和用户提供的代码一起工作......但问题是我如何显示消息之前重定向然后5秒后例如重定向到另一个页面 – Holysh 2013-04-04 12:58:35

+0

Hi Balus,setRedirect的确切用途是什么? – user1643352 2013-04-04 14:06:42

0

你不能在web.xml中声明MultiPageMes​​sagesSupport必须在faces-config.xml中声明MultiPageMes​​sagesSupport。 。POR例如:

enter code here 

<lifecycle> 
    <phase-listener>your.package.MultiPageMessagesSupport</phase-listener> 
</lifecycle> 
相关问题