刷新页面时清除 SessionScoped bean

Clear SessionScoped bean when refreshing page

我正在使用一个 Bean (MenuBean) 来动态创建一个

<p:breadCrumb model="#{menuBean.model}" />  

在我的应用程序的每个页面之间转换时,我从 "page stack" 中推送或弹出页面,以适应每个页面的面包屑导航。

@ManagedBean
@SessionScoped
public class MenuBean implements Serializable {

private MenuModel model;
private int navIdx;
private ArrayList<String[]> pageStack;

@PostConstruct
public void init() {
    pageStack = new ArrayList<>();
    navIdx = 0;
    String [] home = new String[2];
    home[0] = "Home";
    home[1] = "home.xhtml";     
    pageStack.add(home);

    refreshModel();
}

private void refreshModel() {
    model = new DefaultMenuModel();
    int i = 0;
    for(String[] s: pageStack) {
        DefaultMenuItem index = new DefaultMenuItem();
        index.setValue(s[0]);
        index.setCommand("#{menuBean.navigate}");
        index.setParam("index", String.valueOf(i++));
        model.addElement(index);            
    }
}

private void push(String [] page) {
    pageStack.add(page);                
    navIdx++;
    refreshModel();
}

private String pop() {
    pageStack.remove(navIdx--);     
    String[] prevPage = pageStack.get(navIdx);
    refreshModel();

    return prevPage[1];
}

}

为了维护这个栈,我的MenuBean是SessionScoped.
但是,例如,当我刷新最后一页时,会显示初始页面(因为 url 不会更改)但面包屑仍然显示整个堆栈。

我的问题是:有没有办法在用户离开页面或刷新页面时清除MenuBean?

刷新 bean 的一种方法是使用 remoteCommand 并将 auto 运行 设置为 true。因此,一旦您刷新页面,远程命令将触发并调用支持 bean 中的方法。

<!-- init bean on page load -->
<h:form id="initializePageDataForm">
    <p:remoteCommand name="initializePageDataCommand" autoRun="true" action="#{MenuBean.init()}" />
</h:form>

这对我使用 JSF 而不是 Primefaces 很有效。

      <!-- init bean on page load -->
    <f:metadata>
        <f:event type="preRenderView" listener="#{MenuBean.init() }" />
    </f:metadata>