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

11

当调用某个方法时,我希望通过JSF后端Bean进行重置。假设有一个命令按钮,某人按下它并在成功事务后,我的View或Session范围的JSF Bean应该被重置。有没有一种方法可以实现这个目的?

谢谢。

5个回答

15

我找到了 View Scope 的解决方案。

    public static void removeViewScopedBean(String beanName) 
    {
      FacesContext.getCurrentInstance().getViewRoot().getViewMap().remove(beanName);
    }

8
这实在是太笨拙了,对于视图作用域的Bean来说是不必要的。 - BalusC
@BalusC,理论上来说不应该是必须的,但我希望在用户离开页面时(通过关闭标签页或输入自定义网址)销毁我的Bean。而且视图Bean直到会话失效才会被销毁。因此,虽然视图已经消失了,但Bean仍然存在 - 所以这似乎是唯一的方法。只要其他标签页仍然处于活动状态,会话就无法失效... - Falco

13

如果从操作方法返回非null或非void的内容,即使它会返回到相同的视图,ViewScoped bean也将重新创建。因此,只需从操作方法返回一个String,即使它只是一个空字符串:

public String submit() {
    // ...

    return "";
}
为了使它更完整,您可以考虑通过在返回结果中附加?faces-redirect=true查询字符串来发送重定向。
public String submit() {
    // ...

    return "viewId?faces-redirect=true";
}
一个会话作用域的Bean对于你当前尝试实现的任何内容来说,首先是错误的范围。被提及的Bean应该是视图作用域的一个。如果忽略这一点,你可以在操作方法中重新创建模型,或者非常可能使会话失效(这也只会销毁所有其他视图和会话作用域的Bean,不确定这是否符合你的目标)。

如果BackingBean是会话范围的,而我仍然想要实现上述结果怎么办? - Chaitanya Gudala

3
我用以下代码解决了这个问题:
((HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest()).getSession().removeAttribute("bean name");            

通过这种方式,我可以进入会话范围的Bean并重置它,而不会保留以前存在的数据。

3
你也可以通过 JavaScript 刷新页面,这样 ViewScoped Bean 将被重置。例如,在 PrimeFaces 的 commandButton 中:
<p:commandButton value="Button" action="#{bean.someAction()}" oncomplete="location.reload()"/>

3

清除所有视图:

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

并且请记得在所有视图中实现Serializable接口。


我更喜欢这个 - 这样你就不必担心单独的bean被遗漏...干净的板子 - 清除所有内容。 - Falco
使用myfaces(2.2.27)时,clear()没有效果,但是如果我移除单个bean,则可以工作。 - Neo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接