保存和恢复输入值以排序dataTable(JSF,Richfaces)的最佳方法

时间:2013-02-25 23:26:54

标签: jsf-2 richfaces datatables restore

过去几天我面临的任务对我来说都有问题。

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

(其中一个解决方案是使用会话范围bean来管理s& f,但是为一个表单创建一个bean是非常昂贵的,并且制作一个这样的bean在我想要使用它的方式中使用起来非常复杂。 )

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

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

1 个答案:

答案 0 :(得分:2)

理想情况下,stateVar属性非常适合您的需求,但有关它的文档很少,似乎没有人真正知道如何处理它。我会推荐以下hack,它基本上可以手动保存和恢复数据表变量的状态

如果您只想保留表的当前过滤器状态,则RF数据表具有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
        }