重置JSF支持Bean(视图或会话范围)

重置JSF支持Bean(视图或会话范围),jsf,Jsf,我想在调用某个方法时,通过JSF支持bean进行重置。假设有一个命令按钮,有人按下它,事务成功后,我的视图或会话范围JSFbean应该被重置。有办法吗 感谢当您从action方法返回non-null或non-void时,视图范围的bean将被重新创建,即使它将返回到相同的视图。因此,只需从action方法返回一个字符串,即使它只是一个空字符串: public String submit() { // ... return ""; } 为了完成它,您可以考虑通过将脸部重定向=真

我想在调用某个方法时,通过JSF支持bean进行重置。假设有一个命令按钮,有人按下它,事务成功后,我的视图或会话范围JSFbean应该被重置。有办法吗


感谢

当您从action方法返回non-
null
或non-
void
时,视图范围的bean将被重新创建,即使它将返回到相同的视图。因此,只需从action方法返回一个
字符串
,即使它只是一个空字符串:

public String submit() {
    // ...

    return "";
}

为了完成它,您可以考虑通过将<代码>脸部重定向=真/<代码>查询字符串发送到重定向结果来发送重定向。

public String submit() {
    // ...

    return "viewId?faces-redirect=true";
}

会话作用域bean首先是错误的作用域,无论您当前试图实现什么。所讨论的bean应该是视图范围的bean。忽略这一点,您可以在action方法中重新创建模型,或者完全使会话无效(这只会破坏所有其他视图和会话范围的bean,但不确定这是否是您想要的)。

我找到了视图范围的解决方案

    public static void removeViewScopedBean(String beanName) 
    {
      FacesContext.getCurrentInstance().getViewRoot().getViewMap().remove(beanName);
    }
只需清除所有视图:

FacesContext.getCurrentInstance().getViewRoot().getViewMap().clear()


记住在所有视图中实现可序列化

您还可以从javascript刷新页面,因此ViewScope Bean将被重置,例如在primefaces命令按钮中:

<p:commandButton value="Button" action="#{bean.someAction()}" oncomplete="location.reload()"/>

我用这样的代码解决问题:

((HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest()).getSession().removeAttribute("bean name");            

通过这种方式,我进入会话范围bean,并在没有之前存在的数据的情况下重置它。

这非常笨拙,不应该是查看范围bean所必需的。@BalusC这不应该是必需的,但我希望在用户离开页面时销毁我的bean(通过关闭选项卡或键入自定义URL)。在会话失效之前,视图bean不会被销毁。因此,视图消失了,但豆子仍然存在——因此这似乎是唯一的方法。只要其他选项卡仍处于活动状态,会话就不能无效…如果backingbean是会话范围的,并且我仍然希望实现上述结果,该怎么办?我更喜欢这个-因此您不必担心单个Bean被甩在后面。。。clean slate-清除所有内容。使用myfaces(2.2.27)clear()没有任何效果,而如果我删除单个bean,它就会工作