重置JSF BackingBean(视图或会话范围)



当调用某个方法时,我想通过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,并在没有之前的数据的情况下重置它

最新更新