当调用某个方法时,我希望通过JSF后端Bean进行重置。假设有一个命令按钮,某人按下它并在成功事务后,我的View或Session范围的JSF Bean应该被重置。有没有一种方法可以实现这个目的?
谢谢。
当调用某个方法时,我希望通过JSF后端Bean进行重置。假设有一个命令按钮,某人按下它并在成功事务后,我的View或Session范围的JSF Bean应该被重置。有没有一种方法可以实现这个目的?
谢谢。
我找到了 View Scope 的解决方案。
public static void removeViewScopedBean(String beanName)
{
FacesContext.getCurrentInstance().getViewRoot().getViewMap().remove(beanName);
}
如果从操作方法返回非null
或非void
的内容,即使它会返回到相同的视图,ViewScoped bean也将重新创建。因此,只需从操作方法返回一个String
,即使它只是一个空字符串:
public String submit() {
// ...
return "";
}
为了使它更完整,您可以考虑通过在返回结果中附加?faces-redirect=true
查询字符串来发送重定向。public String submit() {
// ...
return "viewId?faces-redirect=true";
}
一个会话作用域的Bean对于你当前尝试实现的任何内容来说,首先是错误的范围。被提及的Bean应该是视图作用域的一个。如果忽略这一点,你可以在操作方法中重新创建模型,或者非常可能使会话失效(这也只会销毁所有其他视图和会话作用域的Bean,不确定这是否符合你的目标)。((HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest()).getSession().removeAttribute("bean name");
<p:commandButton value="Button" action="#{bean.someAction()}" oncomplete="location.reload()"/>
清除所有视图:
FacesContext.getCurrentInstance().getViewRoot().getViewMap().clear();
并且请记得在所有视图中实现Serializable接口。