【问题标题】:Reset JSF Backing Bean(View or Session Scope)重置 JSF 支持 Bean(视图或会话范围)
【发布时间】:2012-03-16 13:34:14
【问题描述】:

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

谢谢

【问题讨论】:

    标签: jsf


    【解决方案1】:

    我找到了 View 范围的解决方案。

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

    【讨论】:

    • 这只是简单的笨拙,对于视图范围的 bean 来说不应该是必需的。
    • @BalusC 应该没有必要,但我希望在用户离开页面时销毁我的 Bean(通过关闭选项卡或键入自定义 URL)。在会话失效之前,视图 Bean 不会被销毁。所以 View 消失了,但 Bean 仍然存在 - 所以这似乎是唯一的方法。只要其他标签仍然处于活动状态,Session就不能失效...
    【解决方案2】:

    当您从操作方法返回非null 或非void 时,将重新创建视图范围的bean,即使它会返回到相同的视图。所以,只需从 action 方法返回一个String,即使它只是一个空字符串:

    public String submit() {
        // ...
    
        return "";
    }
    

    为了使其完整,您可以考虑通过将?faces-redirect=true 查询字符串附加到返回的结果来发送重定向。

    public String submit() {
        // ...
    
        return "viewId?faces-redirect=true";
    }
    

    对于您当前尝试实现的任何目标,会话范围的 bean 首先是错误的范围。有问题的bean应该是一个视图范围的。忽略这一点,您可以只在操作方法中重新创建模型,或者很可能使会话完全无效(这只会破坏所有其他视图和会话范围的 bean,但不确定这是否是您所追求的)。

    【讨论】:

    • 如果 backingbean 是会话范围的,我仍然想达到上述结果怎么办?
    【解决方案3】:

    只需清除所有视图:

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

    记得在所有视图中实现 Serializable

    【讨论】:

    • 我更喜欢这个 - 所以你不必担心个别豆子会被抛在后面......干净的石板 - 清除一切。
    • 使用 myfaces (2.2.27) clear() 没有效果,而如果我删除单个 bean 它可以工作
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-05-18
        • 2011-05-27
        • 2014-07-17
        • 1970-01-01
        • 2012-08-28
        • 1970-01-01
        • 2011-09-02
        • 2014-12-02
        • 1970-01-01
        相关资源
        最近更新 更多