【问题标题】:How to initialize variables in a session scoped bean如何在会话范围的 bean 中初始化变量
【发布时间】:2013-05-18 13:28:39
【问题描述】:

我有两个布尔值来控制某些组件的渲染,问题是变量在那里保存最后一个状态,直到会话到期,我

<f:facet name="footer">
  <p:commandButton action="#{personBean.report}" ajax="false" value="Publish"
                            rendered="#{personBean.reportMode}" icon="ui-icon-check" />
  <p:commandButton action="#{personBean.saveEditing}" ajax="false" value="Save"
                            rendered="#{personBean.editMode}" icon="ui-icon-check" />
</f:facet>

bean 是会话范围的,并具有以下属性:

@ManagedBean(name = "personBean")
@SessionScoped
public class ReportPerson {
private boolean editMode;
private boolean reportMode;

}

bean 包含这些更改布尔值的方法:

public String editPerson() {
    System.err.println("Edit Missing Person");
    editMode = true;
    reportMode = false;
    return "ReportNewPerson";
}

问题是这些值会一直保留到会话过期,因此组件呈现不正确

【问题讨论】:

    标签: jsf jsf-2 managed-bean


    【解决方案1】:

    如果您使用的是会话范围的 bean,那么您应该在构造函数中初始化它们,例如

    public ReportPerson(){
    //let say you want to show report mode by default
    editMode = false;
    reportMode = true;
    }
    

    然后,创建两个方法,例如

    public void inEditMode(){
               editMode = true;
               reportMode = false;
    }
    
    public void inReportMode(){
               editMode = false;
               reportMode = true;
    }
    


    现在在您的渲染组件上调用#{reportPerson.editMode}#{reportPerson.reportMode},并通过从支持bean 中的sessionmap 获取bean 来调用这些方法inReportMode()inEditMode。您可以像这样从会话映射中获取bean

    ReportPerson rp = FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("reportPerson");
    

    从中,您可以获取当前的 bean,然后您可以从中调用

    rp.inEditMode();
    


    与使用会话范围一样,您必须通过逻辑更改它们,因为它们将在整个会话期间保持其状态。

    【讨论】:

    • 好的,我可以在哪里调用 triggerReportMode() 我想在用户报告一个新人时调用这些方法,换句话说,如何显式调用会话范围 bean 的构造函数?
    • 在创建 bean 对象时会自动调用构造函数,JSF 框架会处理这些。但是,我不建议在 bean 的构造函数中初始化任何东西,而是在带有 @PostConstruct 注释的 private void init()(方法的名称和范围可以由您选择)方法中进行。
    • @Manuel 不错的建议 :) 但是你能解释一下 init 方法相对于构造函数的优缺点吗
    • 在使用@PostConstruct 注释的init 方法中,您已经注入了托管bean。例如。如果在您的personBean 注入(通过@ManagedProperty)中有对someRandomBean 的引用,则该引用将获得t be available within the constructor of the personBean`,但它将在init 方法中。
    猜你喜欢
    • 2013-05-22
    • 2011-12-19
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-05
    • 2013-02-13
    • 1970-01-01
    相关资源
    最近更新 更多