在JSF中显示FacesMessage并重新加载页面

我正在从JSF应用程序发送电子邮件。 我需要它当我发送电子邮件时,显示一个FacesMessage确认操作并且浏览器重新加载到同一页面。 我的代码显示面部但不重新加载相同的页面。

public String sendEmail(){ //Email Sending Code..... Transport.send(message); FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Successfull\n", "You have successfully sent an e-mail to : " + e_mail + ". \n Thank You")); return "Email?redirect-true"; } 

这是我尝试过的,此代码重新加载页面但未显示FacesMessage。

 public String sendEmail(){ //Email Sending Code..... Transport.send(message); FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Successfull\n", "You have successfully sent an e-mail to : " + e_mail + ". \n Thank You")); FacesContext context = FacesContext.getCurrentInstance(); HttpServletRequest origRequest = (HttpServletRequest) context.getExternalContext().getRequest(); String contextPath = origRequest.getContextPath(); FacesContext.getCurrentInstance().getExternalContext().redirect(contextPath + "/faces/Email.xhtml"); return "Email?redirect-true"; } 

以下是发送电子邮件页面的代码:

   

请帮忙

如果要在重定向中保留FacesMessages ,则应在Flash对象keepMessages设置为trueFlash范围是JSF2中引入的新范围。 范围(以及随附的隐式EL对象flash )用于短期存储“填充”(意味着您想要保留的任何短期内容)。

重定向之前,请尝试以下行:

  FacesContext.getCurrentInstance().getExternalContext().getFlash().setKeepMessages(true); 

上面的行设置必要的标志以确保您的邮件被保留。

进一步阅读:

  • Max Katz关于Flash的JSF博客

您无法将FacesMessage添加到下一个视图。 重定向后,将创建一个新的ViewsContext,其中消息是一个空列表。 如果您逐步遵循此机制,您可以看到无法执行此操作:

  1. 请求在服务器上命中,JSF servlet 创建一个新的FacesContext ,将请求包装到RequestContext中,进入JSF生命周期
  2. JSF恢复当前视图,应用请求,进行validation,更新模型,调用应用程序代码(将发送重定向),呈现响应(仅包含重定向)
  3. 浏览器重定向到新视图
  4. 请求在服务器上命中,JSF servlet 创建一个新的FacesContext ,将请求包装到RequestContext中,进入JSF生命周期
  5. JSF创建一个新视图并呈现响应。

如果要在页面加载时添加消息,则应将其中的某些内容存储在仍然存在重定向的范围内(例如,flash,会话),并在新视图的bean的@PostConstruct方法中添加FacesMessage。