【发布时间】:2012-03-16 13:34:14
【问题描述】:
我想在调用某些方法时通过 JSF 支持 bean 进行重置。假设有一个命令按钮,有人按下它,在事务成功后,我的视图或会话范围 JSF bean 应该被重置。有没有办法做到这一点?
谢谢
【问题讨论】:
标签: jsf
我想在调用某些方法时通过 JSF 支持 bean 进行重置。假设有一个命令按钮,有人按下它,在事务成功后,我的视图或会话范围 JSF bean 应该被重置。有没有办法做到这一点?
谢谢
【问题讨论】:
标签: jsf
我找到了 View 范围的解决方案。
public static void removeViewScopedBean(String beanName)
{
FacesContext.getCurrentInstance().getViewRoot().getViewMap().remove(beanName);
}
【讨论】:
当您从操作方法返回非null 或非void 时,将重新创建视图范围的bean,即使它会返回到相同的视图。所以,只需从 action 方法返回一个String,即使它只是一个空字符串:
public String submit() {
// ...
return "";
}
为了使其完整,您可以考虑通过将?faces-redirect=true 查询字符串附加到返回的结果来发送重定向。
public String submit() {
// ...
return "viewId?faces-redirect=true";
}
对于您当前尝试实现的任何目标,会话范围的 bean 首先是错误的范围。有问题的bean应该是一个视图范围的。忽略这一点,您可以只在操作方法中重新创建模型,或者很可能使会话完全无效(这只会破坏所有其他视图和会话范围的 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 并在没有之前存在的数据的情况下重置它
【讨论】: