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

时间:2014-04-22 09:54:26

标签: java jsf-2

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

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";
    }

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

    <h:form >
            <p:growl id="growl" showDetail="true"/>
            <p:panel header="Send Email" style=" width: 70%">
                <h:panelGrid columns="2"> 
                    <h:outputLabel value="E Mail Address: " />
                    <h:inputText value="#{mailing.e_mail}" style="width: 400px"/>

                    <h:outputText value="Subject: " /> 
                    <h:inputText value="#{mailing.subject}" style="width: 400px"/>

                    <h:outputText value="Message: " />
                    <h:inputTextarea value="#{mailing.mess}" style="height: 300px;width: 700px"/>
                    <h:panelGroup/>
                    <p:commandButton
                        value="Send Mail "
                        action="#{mailing.sendEmail()}"
                        ajax="false"/>
                </h:panelGrid> 
            </p:panel>
        </h:form>

请帮忙

2 个答案:

答案 0 :(得分:4)

如果要在重定向中保留FacesMessages,则应在keepMessages to true对象上设置FlashFlash范围是JSF2中引入的新范围。范围(以及随附的隐式EL对象flash)用于短期存储“stuff”(意思是您想要保留的任何内容,短时间内)。

重定向前请尝试以下行:

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

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

进一步阅读:

答案 1 :(得分:-1)

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

  1. 请求在服务器上命中,JSF servlet 创建一个新的FacesContext ,将请求包装到RequestContext中,进入JSF生命周期
  2. JSF恢复当前视图,应用请求,进行验证,更新模型,调用应用程序代码(将发送重定向),呈现响应(仅包含重定向)
  3. 浏览器重定向到新视图
  4. 请求在服务器上命中,JSF servlet 创建一个新的FacesContext ,将请求包装到RequestContext中,进入JSF生命周期
  5. JSF创建一个新视图并呈现响应。
  6. 如果要在页面加载时添加消息,则应将其中的某些内容存储在仍然存在重定向的范围内(例如,flash,会话),并在新视图的bean的@PostConstruct方法中添加FacesMessage。