2013-02-25 55 views
0

过去几天我面临着一个对我来说成为问题的任务。保存和恢复排序dataTable的输入值的最佳方法(JSF,Richfaces)

我使用rich:dataTable与自己的筛选和排序列。简单的输入或选择与标准的排序和过滤豆后端。我的问题是,我需要记住这种排序和筛选值的许多形式来恢复它们在某些情况下 - 例如:用户使用后退按钮(最重要的情况下)。我知道如何处理浏览器后退按钮,但我不知道必须以一种简单明了的方式保存和恢复我的值。重要的是我不能使用rich:extandedDataTable我使用bean的视图范围。

(其中一个解决方案是使用会话作用域bean来管理s,但是为一个表单创建一个bean远远很贵,并且使得一个这样的bean非常复杂,以我想要的方式使用它)

所以,我的问题是:我该怎么做?处理这样的事情的最佳做法是什么?我应该走哪条路?

我正在使用RF 4.3和Mojarra 2.1.17(我认为这并不重要)。

回答

1

理想情况下,stateVar属性对于您的需求是理想的,但其上的文档很少,而且似乎没有人真正知道如何处理它。我会推荐以下hack,基本上你可以手工保存和恢复数据表变量的状态

如果你只是想保留表的当前过滤状态,RF datatable有一个getComponentState()方法,那。如果你想要存储特定的值,你必须自己深入数据表。无论你选择,你必须做的某个时候它在组件的生命周期

  1. 定义合适的<f:event/>听众中,你将捕获的数据表中的状态变量。我推荐preValidate

    <rich:extendedDataTable binding="#{bean.table}" ...>  
        <f:event type="preValidate" listener="bean.saveTableState"/>   
    </rich:extendedDataTable> 
    

    然后定义您的支持bean的方法,将检索表中的状态变量绑定

    public void saveTableState(ComponentSystemEvent evt){ 
         UIExtendedDataTable table = (UIExtendedDataTable)evt.getComponent(); 
         //now you have the table, you can get what you need from it 
         DataComponentState savedState = table.getComponentState(); //this object obtained here you can restore to reset the table to it's condition when you obtained the state. 
         //or go into the table's hierarchy to retrieve specific values 
         Iterator<UIComponent> cols = table.columns(); 
         while(cols.hasNext()){ 
         UIColumn col = (UIColumn)cols.next(); 
          col.getFilterValue(); //Retrieve the current filter value on the column 
         }  
    } 
    
  2. 根据您的喜好,找到在组件的生命周期中合适的点来恢复值。我会推荐preRenderComponent

    public void restoreTableConditions(ComponentSystemEvent evt){ 
        table.restoreState(FacesContext.getCurrentInstance(),savedState); //restore the DataComponentState from wherever you stashed it 
        } 
    
+0

谢谢您的回复!这似乎相当不错。目前我正在研究我之前提到过的解决方案(s&f的一个会话bean),所以如果我没有成功,我会试试你的方式并报告进度。 但仍然,再次感谢你。我一直在寻找这样的解决方案,但没有效果。 – 2013-02-28 07:53:57