刷新页面时清除SessionScoped bean

时间:2015-04-08 10:53:06

标签: jsf primefaces jsf-2.2 breadcrumbs session-scope

我使用Bean(MenuBean)动态创建

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

当我浏览应用程序的每个页面时,我会从页面堆栈中推送或弹出页面&#34;,以便调整每页的breadCrumb。

@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没有改变),但breadCrumb仍然显示整个堆栈。

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

2 个答案:

答案 0 :(得分:2)

你可以刷新bean的一种方法是使用remoteCommand和set auto run on true。因此,一旦刷新页面,远程commad就会在后台bean中激活并调用方法。

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

答案 1 :(得分:0)

这对我来说使用JSF而不是Primefaces起作用。

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