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

时间:2012-02-27 01:13:10

标签: jsf

我希望在调用某个方法时由JSF支持bean重置。假设有一个命令按钮,有人按下它,在成功完成事务后,我的View或Session范围JSF bean应该被重置。有没有办法做到这一点?

感谢

5 个答案:

答案 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并重置了之前没有数据的