刷新页面时清除 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>
我正在使用一个 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>