隨筆-348  評(píng)論-598  文章-0  trackbacks-0

          之前第一版有個(gè)問(wèn)題,就是如果進(jìn)行了刪除等操作并立即返回列表頁(yè),被刪除的項(xiàng)還在那,但其實(shí)數(shù)據(jù)庫(kù)已經(jīng)被刪除了,需要做一個(gè)刷新列表操作才可以,本版就是修正此問(wèn)題的。
          如果要修正此問(wèn)題,就需要將分頁(yè)的擴(kuò)展代碼也就是第一版中TestBean中的代碼放入業(yè)務(wù)相關(guān)管理Bean中。

          頁(yè)面代碼(其中testBean已經(jīng)變成業(yè)務(wù)Managed-bean user了):

              <f:view>
                  
          <h:form id="formlist">    
                      
          <rich:dataTable id="carList" width="483" columnClasses="col" rows="#{user.pageSize}"
                          value
          ="#{user.dataModel}" var="car">            
                          
          <f:facet name="header">
                              
          <rich:columnGroup>
                                  
          <h:column>
                                      
          <h:outputText styleClass="headerText" value="Name" />
                                  
          </h:column>
                                  
          <h:column>
                                      
          <h:outputText styleClass="headerText" value="Decription" />
                                  
          </h:column>
                                  
          <h:column>
                                      
          <h:outputText styleClass="headerText" value="Base Price" />
                                  
          </h:column>
                                  
          <h:column>
                                      
          <h:outputText styleClass="headerText" value="Time" />
                                  
          </h:column>
                                  
          <h:column>
                                      
          <h:outputText styleClass="headerText" value="操作" />
                                  
          </h:column>                        
                              
          </rich:columnGroup>
                          
          </f:facet>
              
                          
          <h:column>
                              
          <h:outputText value="#{car.name}" />
                          
          </h:column>
                          
          <h:column>
                              
          <h:outputText value="#{car.description}" />
                          
          </h:column>
                          
          <h:column>
                              
          <h:outputText value="#{car.baseprice}" />
                          
          </h:column>
                          
          <h:column>
                              
          <h:outputText value="#{car.timestamp}" />
                          
          </h:column>
                          
          <h:column>
                              
          <h:commandLink action="#{user.delete}" value="刪除" >
                                  
          <f:param name="id" value="#{car.id}"/>
                              
          </h:commandLink>
                          
          </h:column>                
                      
          </rich:dataTable>
                      
          <rich:datascroller for="carList" id="dc1"
                      style
          ="width:483px" page="#{user.scrollerPage}"/>                        
                  
          </h:form>
              
          </f:view>

          DataPage.java(沒(méi)有變化):
          import java.util.List;

          public class DataPage
          {

              
          /**
               * 將需要的頁(yè)的數(shù)據(jù)封裝到一個(gè)DataPage中去, 這個(gè)類表示了我們需要的一頁(yè)的數(shù)據(jù),<br>
               * 里面包含有三個(gè)元素:datasetSize,startRow,和一個(gè)用于表示具體數(shù)據(jù)的List。<br>
               * datasetSize表示了這個(gè)記錄集的總條數(shù),查詢數(shù)據(jù)的時(shí)候,使用同樣的條件取count即可,<br>
               * startRow表示該頁(yè)的起始行在數(shù)據(jù)庫(kù)中所有記錄集中的位置
               
          */


              
          private int datasetSize;

              
          private int startRow;

              
          private List data;

              
          /**
               * 
               * 
          @param datasetSize
               *            數(shù)據(jù)集大小
               * 
          @param startRow
               *            起始行
               * 
          @param data
               *            數(shù)據(jù)list
               
          */

              
          public DataPage(int datasetSize, int startRow, List data)
              
          {

                  
          this.datasetSize = datasetSize;

                  
          this.startRow = startRow;

                  
          this.data = data;

              }


              
          /**
               * 
               * 
          @return
               
          */

              
          public int getDatasetSize()
              
          {

                  
          return datasetSize;

              }


              
          public int getStartRow()
              
          {

                  
          return startRow;

              }


              
          /**
               * 
               * 
          @return 已填充好的數(shù)據(jù)集
               
          */

              
          public List getData()
              
          {

                  
          return data;

              }


          }


          PagedListDataModel.java(添加了一些注釋):

          import java.util.List;

          import javax.faces.model.DataModel;

          /**
           * 
           * TODO 分頁(yè)所使用的類

           * 
          @author <a href="mailto:tianlu@jsecode.com">TianLu</a>
           * 
          @version $Rev$ <br>
           *          $Id$
           
          */

          /* 使用方法:
           * 前臺(tái)的功能模塊Bean(例如User)中加入類似下面的代碼,可根據(jù)您的需要進(jìn)行相應(yīng)修改
           * private PagedListDataModel dataModel;
              private int pageSize = 10;
              public int getPageSize()
              {
                  return pageSize;
              }

              public PagedListDataModel getDataModel()
              {
                  
                  if ( dataModel == null ) {
                      dataModel = new PagedListDataModel(pageSize)
                      {
                          //查詢分頁(yè)函數(shù)
                          public DataPage fetchPage(int startRow, int pageSize)
                          {
                              // call enclosing managed bean method to fetch the data
                              CarBeanDAO dao = new CarBeanDAO();
                              String sql = "from CarBean model order by model.id desc";                
                              Query query = EntityManagerHelper.createQuery(sql);                    
                              query.setFirstResult(startRow);                    
                              query.setMaxResults(pageSize);                    
                              List list = query.getResultList();
                              System.out.println("current row count = " + list.size());
                              Query q = EntityManagerHelper.createQuery("select count(*) from CarBean");
                              return new DataPage(Integer.parseInt(q.getSingleResult().toString()), startRow, list);                    
                          }
                      };
                  }
                  
                  return dataModel;
              }
          */


          /* 前臺(tái)控件像這樣使用
           * <rich:dataTable id="carList" width="483" columnClasses="col" rows="#{user.pageSize}"
              value="#{user.dataModel}" var="car">            
              <f:facet name="header">
                  <rich:columnGroup>
                      <h:column>
                          <h:outputText styleClass="headerText" value="Name" />
                      </h:column>
                      <h:column>
                          <h:outputText styleClass="headerText" value="Decription" />
                      </h:column>
                      <h:column>
                          <h:outputText styleClass="headerText" value="Base Price" />
                      </h:column>
                      <h:column>
                          <h:outputText styleClass="headerText" value="Time" />
                      </h:column>
                      <h:column>
                          <h:outputText styleClass="headerText" value="操作" />
                      </h:column>                        
                  </rich:columnGroup>
              </f:facet>

              <h:column>
                  <h:outputText value="#{car.name}" />
              </h:column>
              <h:column>
                  <h:outputText value="#{car.description}" />
              </h:column>
              <h:column>
                  <h:outputText value="#{car.baseprice}" />
              </h:column>
              <h:column>
                  <h:outputText value="#{car.timestamp}" />
              </h:column>
              <h:column>
                  <h:commandLink action="#{user.delete}" value="刪除" >
                      <f:param name="id" value="#{car.id}"/>
                  </h:commandLink>
              </h:column>                
          </rich:dataTable>
          <rich:datascroller for="carList" id="dc1"
          style="width:483px" page="#{user.scrollerPage}"/>
          */


          /*
           * 進(jìn)行刪除等操作后會(huì)立即改變列表項(xiàng)并且返回列表頁(yè)的,請(qǐng)調(diào)用本類的refresh方法刷新當(dāng)前頁(yè)面
           * 使用方法:
           *             dao.delete(bean);
           *            dataModel.refresh();
           
          */

          public abstract class PagedListDataModel extends DataModel {
              
          int pageSize;
              
          int rowIndex;
              DataPage page;

              
          /**
               * Create a datamodel that pages through the data showing the specified
               * number of rows on each page.
               
          */

              
          public PagedListDataModel(int pageSize) {
                  
          super();
                  
          this.pageSize = pageSize;
                  
          this.rowIndex = -1;
                  
          this.page = null;
              }


              
          /**
               * Not used in this class; data is fetched via a callback to the fetchData
               * method rather than by explicitly assigning a list.
               
          */

              
          public void setWrappedData(Object o) {
                  
          if (o instanceof DataPage) {
                      
          this.page = (DataPage) o;
                  }
           else {
                      
          throw new UnsupportedOperationException(" setWrappedData ");
                  }

              }


              
          public int getRowIndex() {
                  
          return rowIndex;
              }


              
          /**
               * Specify what the "current row" within the dataset is. Note that the
               * UIData component will repeatedly call this method followed by getRowData
               * to obtain the objects to render in the table.
               
          */

              
          public void setRowIndex(int index) {
                  rowIndex 
          = index;
              }


              
          /**
               * Return the total number of rows of data available (not just the number of
               * rows in the current page!).
               
          */

              
          public int getRowCount() {
                  
          return getPage().getDatasetSize();
              }


              
          /**
               * Return a DataPage object; if one is not currently available then fetch
               * one. Note that this doesn't ensure that the datapage returned includes
               * the current rowIndex row; see getRowData.
               
          */

              
          private DataPage getPage() {
                  
          if (page != null{
                      
          return page;
                  }

                  
          int rowIndex = getRowIndex();
                  
          int startRow = rowIndex;
                  
          if (rowIndex == -1{
                      
          // even when no row is selected, we still need a page
                      
          // object so that we know the amount of data available.
                      startRow = 0;
                  }
           // invoke method on enclosing class
                  page = fetchPage(startRow, pageSize);
                  
          return page;
              }


              
          /**
               * Return the object corresponding to the current rowIndex. If the DataPage
               * object currently cached doesn't include that index then fetchPage is
               * called to retrieve the appropriate page.
               
          */

              
          public Object getRowData() {
                  
          if (rowIndex < 0{
                      
          throw new IllegalArgumentException(
                              
          " Invalid rowIndex for PagedListDataModel; not within page ");
                  }
           // ensure page exists; if rowIndex is beyond dataset size, then
                  
          // we should still get back a DataPage object with the dataset size
                  
          // in it
                  if (page == null{
                      page 
          = fetchPage(rowIndex, pageSize);
                  }

                  
          int datasetSize = page.getDatasetSize();
                  
          int startRow = page.getStartRow();
                  
          int nRows = page.getData().size();
                  
          int endRow = startRow + nRows;
                  
          if (rowIndex >= datasetSize) {
                      
          throw new IllegalArgumentException(" Invalid rowIndex ");
                  }

                  
          if (rowIndex < startRow) {
                      page 
          = fetchPage(rowIndex, pageSize);
                      startRow 
          = page.getStartRow();
                  }
           else if (rowIndex >= endRow) {
                      page 
          = fetchPage(rowIndex, pageSize);
                      startRow 
          = page.getStartRow();
                  }

                  
          return page.getData().get(rowIndex - startRow);
              }


              
          public Object getWrappedData() {
                  
          return page.getData();
              }


              
          /**
               * Return true if the rowIndex value is currently set to a value that
               * matches some element in the dataset. Note that it may match a row that is
               * not in the currently cached DataPage; if so then when getRowData is
               * called the required DataPage will be fetched by calling fetchData.
               
          */

              
          public boolean isRowAvailable() {
                  DataPage page 
          = getPage();
                  
          if (page == null{
                      
          return false;
                  }

                  
          int rowIndex = getRowIndex();
                  
          if (rowIndex < 0{
                      
          return false;
                  }
           else if (rowIndex >= page.getDatasetSize()) {
                      
          return false;
                  }
           else {
                      
          return true;
                  }

              }


              
          /**
               * Method which must be implemented in cooperation with the managed bean
               * class to fetch data on demand.
               
          */

              
          public abstract DataPage fetchPage(int startRow, int pageSize);

              
          /**
               * 進(jìn)行刪除等操作后會(huì)立即改變列表項(xiàng)并且返回列表頁(yè)的,請(qǐng)調(diào)用此方法,用于刷新列表。
               
          */

              
          public void refresh() {
                  
          if (this.page != null{
                      
          this.page = null;
                      getPage();
                  }

              }

          }



          User中的delete方法:
              public String delete()
              
          {
                  FacesContext ctx 
          = FacesContext.getCurrentInstance();
                  
          int id = Integer.parseInt(ctx.getExternalContext().getRequestParameterMap().get("id"));
                  EntityManagerHelper.beginTransaction();
                  CarBeanDAO dao 
          = new CarBeanDAO();
                  CarBean bean 
          = dao.findById(id);
                  
          if(bean != null)
                  
          {            
                      dao.delete(bean);
                      dataModel.refresh();
                  }

                      
                  EntityManagerHelper.commit();
                  
          return null;
              }

          User中scrollerPage的相關(guān)代碼:
              private int scrollerPage = 1;

              
          public int getScrollerPage()
              
          {
                  
          return scrollerPage;
              }


              
          public void setScrollerPage(int scrollerPage)
              
          {
                  
          this.scrollerPage = scrollerPage;
                  System.out.println(
          "current page = " + scrollerPage);
              }

          Faces-config.xml:
           <managed-bean>
            
          <managed-bean-name>user</managed-bean-name>
            
          <managed-bean-class>com.gcoresoft.jsfdemo.bean.User</managed-bean-class>
            
          <managed-bean-scope>session</managed-bean-scope>
           
          </managed-bean>

          有人反映會(huì)出現(xiàn)獲取兩次DataModel的情況,為什么呢?
          經(jīng)過(guò)我的測(cè)試,是因?yàn)樵O(shè)置的datatable的rows屬性的值大于了程序中pageSize的值,比如你設(shè)置rows="12",而你的pageSize設(shè)置的是10,那么JSF為了滿足顯示12條得條件,就會(huì)取兩次數(shù)據(jù)集組成一個(gè)12跳得數(shù)據(jù)集顯示出來(lái),所以給定的rows屬性最好可以使用相關(guān)管理bean的pageSize變量,這樣前后臺(tái)統(tǒng)一數(shù)據(jù)條目,提高性能和可操作性。

          為了方便大家JSF的項(xiàng)目開(kāi)發(fā),后面我會(huì)推出一套我自己寫(xiě)的一個(gè)基于JSF的框架,當(dāng)然此框架是基于實(shí)際項(xiàng)目成功實(shí)施后提取出來(lái)的,主要是簡(jiǎn)化了對(duì)表單的操作,增加一些常用的工具套件,例如分頁(yè),驗(yàn)證器等等。對(duì)表單操作部分的簡(jiǎn)化主要體現(xiàn)在:每種控件都可以和固定的模型綁定,這樣操作模型就可以做到對(duì)前臺(tái)控件的控制,比如后臺(tái)取值可以使用attributes.get("username"),設(shè)置前臺(tái)控件值可以使用attributes.put("username","admin"),對(duì)選擇控件操作也更加簡(jiǎn)便,當(dāng)使用put的方法的時(shí)候,前臺(tái)會(huì)自動(dòng)選擇到那項(xiàng),更重要的是這些簡(jiǎn)化不需要你寫(xiě)程序代碼,寫(xiě)一些簡(jiǎn)單的配置文件即可,而且選擇項(xiàng)不僅可以設(shè)置在配置文件中,還可以通過(guò)數(shù)據(jù)庫(kù)等其他數(shù)據(jù)源獲取,大大提高開(kāi)發(fā)效率。

          ---------------------------------------------------------
          專注移動(dòng)開(kāi)發(fā)

          Android, Windows Mobile, iPhone, J2ME, BlackBerry, Symbian
          posted on 2008-11-01 09:42 TiGERTiAN 閱讀(5588) 評(píng)論(13)  編輯  收藏 所屬分類: JavaJSF

          評(píng)論:
          # re: 【第二版】RichFaces中使用datatable和datascroller進(jìn)行分頁(yè)(使用數(shù)據(jù)庫(kù)分頁(yè),改良版)(含源碼)(JSF 1.2,RichFaces 3.2.1GA) 2008-11-01 16:52 | 金山毒霸2008
          直接通過(guò)控件來(lái)翻頁(yè)不是很方便?  回復(fù)  更多評(píng)論
            
          # re: 【第二版】RichFaces中使用datatable和datascroller進(jìn)行分頁(yè)(使用數(shù)據(jù)庫(kù)分頁(yè),改良版)(含源碼)(JSF 1.2,RichFaces 3.2.1GA) 2008-11-01 20:39 | TiGERTiAN
          @金山毒霸2008
          直接通過(guò)控件翻頁(yè)的確很方便,但是做正式的項(xiàng)目只要數(shù)據(jù)達(dá)到一定規(guī)模是不會(huì)這樣的,直接通過(guò)控件翻頁(yè)會(huì)將所有數(shù)據(jù)讀出然后丟入內(nèi)存進(jìn)行分頁(yè)計(jì)算操作等,如果你數(shù)據(jù)庫(kù)有100萬(wàn)的數(shù)據(jù),你可以試試看你的速度。。。  回復(fù)  更多評(píng)論
            
          # re: 【第二版】RichFaces中使用datatable和datascroller進(jìn)行分頁(yè)(使用數(shù)據(jù)庫(kù)分頁(yè),改良版)(含源碼)(JSF 1.2,RichFaces 3.2.1GA) [未登錄](méi) 2008-11-03 12:45 | FoxInSky
          請(qǐng)教樓主:
          <rich:datascroller for="carList" id="dc1"
          style="width:483px" page="#{user.scrollerPage}"/>
          分頁(yè)控件中的page綁定的代碼可以貼出來(lái)么?
          小弟剛接觸java不久,最近一個(gè)項(xiàng)目要使用到JSF,尤其dataTable這個(gè),有些問(wèn)題不太明白,希望能請(qǐng)教樓主!  回復(fù)  更多評(píng)論
            
          # re: 【第二版】RichFaces中使用datatable和datascroller進(jìn)行分頁(yè)(使用數(shù)據(jù)庫(kù)分頁(yè),改良版)(含源碼)(JSF 1.2,RichFaces 3.2.1GA) 2008-11-03 19:54 | TiGERTiAN
          @FoxInSky
          文章已經(jīng)重新編輯過(guò)了,把page綁定的相關(guān)代碼添加進(jìn)來(lái)了,你看下,對(duì)你是否有幫助  回復(fù)  更多評(píng)論
            
          # re: 【第二版】RichFaces中使用datatable和datascroller進(jìn)行分頁(yè)(使用數(shù)據(jù)庫(kù)分頁(yè),改良版)(含源碼)(JSF 1.2,RichFaces 3.2.1GA) 2008-11-04 14:16 | foxinsky
          我還需要向樓主請(qǐng)教這些問(wèn)題:
          以前做C#時(shí),我做類似樓主說(shuō)的“按需取數(shù)”是這樣的:從數(shù)據(jù)庫(kù)中取出數(shù)據(jù)集所需要的數(shù)據(jù)記錄數(shù),然后顯示給dataTable,
          比如數(shù)據(jù)庫(kù)中現(xiàn)在有1000條記錄,設(shè)置分頁(yè)10/頁(yè),現(xiàn)在我需要取第2頁(yè)的數(shù)據(jù),那么用
          select * from tablename where rownum>10 and rownum<=2*10
          查詢出來(lái)記錄(以oracle為例),然后將它保存至ArrayList中,將該ArrayList返回給DataModal以供DataTable綁定使用。

          查詢出來(lái)的記錄轉(zhuǎn)換為ArrayList的過(guò)程是否應(yīng)在fetchData中進(jìn)行?
          在樓主的上一篇博文的TestBean中的getDataModel方法里重寫(xiě)的fetchData中的兩個(gè)參數(shù)(int startRow, int pageSize)在什么地方傳進(jìn)去?我如何告知datascroller數(shù)據(jù)集中共有多少條記錄?在查詢的時(shí)候我如何知道當(dāng)前是第幾頁(yè)?
          還煩請(qǐng)樓主多我指教!
            回復(fù)  更多評(píng)論
            
          # re: 【第二版】RichFaces中使用datatable和datascroller進(jìn)行分頁(yè)(使用數(shù)據(jù)庫(kù)分頁(yè),改良版)(含源碼)(JSF 1.2,RichFaces 3.2.1GA) 2008-11-04 19:47 | TiGERTiAN
          @foxinsky
          你可以看下PagedListDataModel.java的注釋
          需要自己實(shí)現(xiàn)fetchPage方法,這個(gè)方法何時(shí)被調(diào)用,你可以自己看下PagedListDataModel類,這個(gè)實(shí)現(xiàn)了JSF里面的一個(gè)數(shù)據(jù)模型,這個(gè)數(shù)據(jù)模型中,獲取數(shù)據(jù)的時(shí)候就是調(diào)用了fetchPage方法。
          你不需要告訴dataScroller控件有多少條數(shù)據(jù),它不管的,它是和Datatable綁定的,它的作用只是負(fù)責(zé)翻頁(yè)和傳遞當(dāng)前頁(yè)碼。
          還有就是查詢的時(shí)候你不需要知道當(dāng)前是第幾頁(yè),因?yàn)閿?shù)據(jù)模型會(huì)自動(dòng)調(diào)用fetchPage方法,而他只要知道起始行號(hào),和你要取得數(shù)據(jù),所以當(dāng)前是多少頁(yè)你不需要關(guān)心,如果你想要得到當(dāng)前是第幾頁(yè),調(diào)用User中scrollerPage變量就可以了,因?yàn)樗壎薲ataScroller的page屬性,可以設(shè)置或者獲得當(dāng)前頁(yè)碼。  回復(fù)  更多評(píng)論
            
          # re: 【第二版】RichFaces中使用datatable和datascroller進(jìn)行分頁(yè)(使用數(shù)據(jù)庫(kù)分頁(yè),改良版)(含源碼)(JSF 1.2,RichFaces 3.2.1GA) 2009-06-26 14:22 | dp
          if (rowIndex < startRow) {
          page = fetchPage(rowIndex, pageSize);
          startRow = page.getStartRow();
          } else if (rowIndex >= endRow) {
          page = fetchPage(rowIndex, pageSize);
          startRow = page.getStartRow();
          }

          樓主,你寫(xiě)的這段是不是可以直接寫(xiě)成下面這樣呢;
          page = fetchPage(rowIndex, pageSize);
          startRow = page.getStartRow();
          因?yàn)?你的if...else if兩個(gè)里面執(zhí)行的都是一樣的,為什么要加個(gè)條件判斷呢?  回復(fù)  更多評(píng)論
            
          # re: 【第二版】RichFaces中使用datatable和datascroller進(jìn)行分頁(yè)(使用數(shù)據(jù)庫(kù)分頁(yè),改良版)(含源碼)(JSF 1.2,RichFaces 3.2.1GA) [未登錄](méi) 2009-08-05 14:10 | sam
          為什么我的查詢結(jié)果為空的時(shí)候報(bào)異常, return page.getData().get(rowIndex - startRow);理論上不應(yīng)該運(yùn)行到這里的啊  回復(fù)  更多評(píng)論
            
          # re: 【第二版】RichFaces中使用datatable和datascroller進(jìn)行分頁(yè)(使用數(shù)據(jù)庫(kù)分頁(yè),改良版)(含源碼)(JSF 1.2,RichFaces 3.2.1GA) 2009-08-05 14:21 | TiGERTiAN
          @sam
          不會(huì)啊,你debug一下呢
            回復(fù)  更多評(píng)論
            
          # re: 【第二版】RichFaces中使用datatable和datascroller進(jìn)行分頁(yè)(使用數(shù)據(jù)庫(kù)分頁(yè),改良版)(含源碼)(JSF 1.2,RichFaces 3.2.1GA) 2009-09-02 17:23 | x800xl
          datasetSize每一次調(diào)用 都 要在數(shù)據(jù)庫(kù)里邊查詢一次,需要把datasetSize的值在pageListDataModel中保存
            回復(fù)  更多評(píng)論
            
          # re: 【第二版】RichFaces中使用datatable和datascroller進(jìn)行分頁(yè)(使用數(shù)據(jù)庫(kù)分頁(yè),改良版)(含源碼)(JSF 1.2,RichFaces 3.2.1GA) 2009-09-02 17:25 | x800xl
          修改后的代碼:
          public abstract class PageListDataModel extends DataModel {

          int pageSize;
          int rowIndex;
          DataPage page;

          /**
          * 抽像獲取一頁(yè)數(shù)據(jù)方法,由子類實(shí)現(xiàn)
          * */
          public abstract DataPage fetchPage(int dataSize,int startRow, int pageSize);

          public PageListDataModel(int pageSize) {
          super();
          this.pageSize = pageSize;
          this.rowIndex = -1;
          this.page = null;
          }

          public int getPageSize() {
          return pageSize;
          }

          public void setPageSize(int pageSize) {
          this.pageSize = pageSize;
          }

          public DataPage getPage() {
          int dataSize = 0;
          if(null !=this.page) {
          dataSize = this.page.getDataSize();
          return this.page;
          }
          int rowIndex = this.getRowIndex();
          int startRow = rowIndex;
          if(rowIndex == -1) {
          startRow = 0;
          }
          return fetchPage(dataSize,startRow, pageSize);
          }

          public void setPage(DataPage page) {
          this.page = page;
          }

          @Override
          public int getRowCount() {
          return this.getPage().getDataSize();
          }

          @Override
          public Object getRowData() {
          if(rowIndex <0) {
          throw new IllegalArgumentException("Invalid rowIndex for PagedListDataModel; not within page");
          }
          if(null == page) {
          page = fetchPage(0,rowIndex, pageSize);
          }
          int dataSize = page.getDataSize();
          int startRow = page.getStartRow();
          int nRows = page.getData().size();
          int endRow = startRow + nRows;
          if(rowIndex >= dataSize) {
          throw new IllegalArgumentException(" Invalid rowIndex ");
          }
          if(rowIndex < startRow) {
          page = fetchPage(dataSize,rowIndex, pageSize);
          startRow = page.getStartRow();
          }else if (rowIndex >= endRow) {
          page = fetchPage(dataSize,rowIndex, pageSize);
          startRow = page.getStartRow();
          }
          return page.getData().get(rowIndex - startRow);
          }

          @Override
          public int getRowIndex() {
          return this.rowIndex;
          }

          @Override
          public Object getWrappedData() {
          return page.getData();
          }

          @Override
          public boolean isRowAvailable() {
          DataPage page = getPage();
          if (page == null) {
          return false;
          }
          int rowIndex = getRowIndex();
          if (rowIndex < 0) {
          return false;
          } else if (rowIndex >= page.getDataSize()) {
          return false;
          } else {
          return true;
          }
          }

          @Override
          public void setRowIndex(int rowIndex) {
          this.rowIndex = rowIndex;
          }

          @Override
          public void setWrappedData(Object o) {
          if (o instanceof DataPage) {
          this.page = (DataPage)o;
          }else {
          throw new UnsupportedOperationException("setWrappedData");
          }
          }

          public void refresh() {
          if (null !=this.page) {
          this.page = null;
          getPage();
          }
          }
            回復(fù)  更多評(píng)論
            
          # re: 【第二版】RichFaces中使用datatable和datascroller進(jìn)行分頁(yè)(使用數(shù)據(jù)庫(kù)分頁(yè),改良版)(含源碼)(JSF 1.2,RichFaces 3.2.1GA) [未登錄](méi) 2010-05-22 18:03 | gary
          這個(gè)分頁(yè)組件,在表頭排序的時(shí)候會(huì)查詢多次  回復(fù)  更多評(píng)論
            
          # re: 【第二版】RichFaces中使用datatable和datascroller進(jìn)行分頁(yè)(使用數(shù)據(jù)庫(kù)分頁(yè),改良版)(含源碼)(JSF 1.2,RichFaces 3.2.1GA) 2011-04-09 16:40 | 救學(xué)
          請(qǐng)問(wèn),按你這樣子的做法,為什么點(diǎn)翻頁(yè)沒(méi)有反應(yīng)呢。打開(kāi)源碼,翻頁(yè)是javascript:void())  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 全州县| 新宾| 永定县| 巍山| 曲靖市| 齐齐哈尔市| 天峻县| 黎城县| 南华县| 府谷县| 车致| 赫章县| 汨罗市| 黑山县| 甘肃省| 屏南县| 彭州市| 江都市| 西和县| 新田县| 福贡县| 余姚市| 霞浦县| 南安市| 万宁市| 伊宁市| 保定市| 东乌| 大安市| 永嘉县| 满城县| 孟津县| 邵阳县| 连江县| 湘西| 成都市| 当涂县| 连城县| 行唐县| 博乐市| 万载县|