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