如何在会话范围bean中模拟请求范围行为?

时间:2010-02-01 12:06:10

标签: java jsf

在我的jsf应用程序中,我有一个发送邮件的按钮。每次点击我都想显示邮件已发送或未发送的消息。

这是典型的请求范围功能。但问题是我现在有一个带会话范围的支持bean。所有数据都在这个bean中。按钮的action属性引用的方法'send'在这个bean中。

那么,出路是什么?如果我应该再创建一个请求范围bean,那么我应该如何从会话bean中引用它?

2 个答案:

答案 0 :(得分:3)

另一种方法是,您可以使用FacesMessage在此处使用FacesContext#addMessage()添加到上下文中。 FacesMessages是基于请求的,并且可能比某些自定义消息传递方法更适合特定的功能需求。

以下是bean操作方法的示例:

public void sendMail() {
    FacesMessage message;
    try {
        Mailer.send(from, to, subject, message);
        message = new FacesMessage("Mail successfully sent!");
    } catch (MailException e) {
        message = new FacesMessage("Sending mail failed!");
        logger.error("Sending mail failed!", e); // Yes, you need to know about it as well! ;)
    }
    FacesContext.getCurrentInstance().addMessage(null, message);
}

使用null clientId消息变为“全局”,以便您可以使用以下构造来显示全局消息:

 <h:messages globalOnly="true" />

更新:要以不同的方式显示成功和错误消息,请使用FacesMessage.Severity

        message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Mail successfully sent!", null);
    } catch (MailException e) {
        message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Sending mail failed!", null);

..与infoClass/infoStyle中的errorClass/errorStyleh:messages结合使用:

 <h:messages globalOnly="true" infoStyle="color:green" errorStyle="color:red" />

答案 1 :(得分:1)

或者:

  • 只需将消息从send方法(通过ExternalContext
  • 推送到请求范围
  • 将方法重构为请求范围bean并注入所需的任何会话信息(托管bean框架可以执行此操作)