当调用某个方法时,我想通过JSF backingbean重置。假设有一个命令按钮,有人按下它,在成功的事务之后,我的视图或会话范围JSFbean应该被重新设置种子。有办法做到这一点吗?
感谢
我找到了View范围的解决方案。
public static void removeViewScopedBean(String beanName)
{
FacesContext.getCurrentInstance().getViewRoot().getViewMap().remove(beanName);
}
当您从action方法返回非null
或非void
时,视图范围的bean将被重新创建,即使它将返回到同一视图。因此,只需从action方法返回一个String
,即使它只是一个空字符串:
public String submit() {
// ...
return "";
}
为了使其完整,您可以考虑通过将?faces-redirect=true
查询字符串附加到返回的结果来发送重定向。
public String submit() {
// ...
return "viewId?faces-redirect=true";
}
会话范围的bean首先是错误的范围,用于您当前试图实现的任何目标。有问题的bean应该是一个视图范围的bean。忽略这一点,您可以在action方法中重新创建模型,或者很可能完全使会话无效(这只会破坏所有其他视图和会话范围的bean,但不确定这是否是您想要的)。
只需清除所有视图:
FacesContext.getCurrentInstance().getViewRoot().getViewMap().clear();
记住在所有视图中实现Serializable
您也可以从javascript刷新页面,这样ViewScoped Bean将被重新设置种子,例如在primefaces命令中按钮:
<p:commandButton value="Button" action="#{bean.someAction()}" oncomplete="location.reload()"/>
我用这样的代码解决了这个问题:
((HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest()).getSession().removeAttribute("bean name");
通过这种方式,我进入会话范围的bean,并在没有之前的数据的情况下重置它