隨筆 - 170  文章 - 536  trackbacks - 0
          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          我參與的團(tuán)隊(duì)

          隨筆分類(103)

          搜索

          •  

          積分與排名

          • 積分 - 414797
          • 排名 - 135

          最新評(píng)論

          閱讀排行榜

          ???? 前面一篇直接使用了Myfaces中的兩個(gè)Component完成了一個(gè)簡(jiǎn)單的分頁(yè),這里將會(huì)介紹一種On-demand loading的方法來(lái)進(jìn)行分頁(yè),僅僅在需要數(shù)據(jù)的時(shí)候加載。

          ???? 先來(lái)說(shuō)一些題外話,為了實(shí)現(xiàn)這種方式的分頁(yè),公司里大約5-6個(gè)人做了半個(gè)多月的工作,擴(kuò)展了dataTable,修改了dataScrollor,以及各種其他的方法,但是都不是很優(yōu)雅。在上個(gè)月底的時(shí)候,在MyfacesMail List中也針對(duì)這個(gè)問(wèn)題展開了一系列的討論,最后有人總結(jié)了討論中提出的比較好的方法,提出了以下的分頁(yè)方法,也是目前實(shí)現(xiàn)的最為優(yōu)雅的方法,也就是不對(duì)dataTabledataScrollor做任何修改,僅僅通過(guò)擴(kuò)展DataModel來(lái)實(shí)現(xiàn)分頁(yè)。

          ???? DataModel 是一個(gè)抽象類,用于封裝各種類型的數(shù)據(jù)源和數(shù)據(jù)對(duì)象的訪問(wèn),JSFdataTable中綁定的數(shù)據(jù)實(shí)際上被包裝成了一個(gè)DataModel,以消除各種不同數(shù)據(jù)源和數(shù)據(jù)類型的復(fù)雜性,在前面一篇中我們?cè)L問(wèn)數(shù)據(jù)庫(kù)并拿到了一個(gè)List,交給dataTable,這時(shí)候,JSF會(huì)將這個(gè)List包裝成 ListDataModel dataTable訪問(wèn)數(shù)據(jù)都是通過(guò)這個(gè)DataModel進(jìn)行的,而不是直接使用List

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

          /**
          ?*?A?simple?class?that?represents?a?"page"?of?data?out?of?a?longer?set,?ie?a
          ?*?list?of?objects?together?with?info?to?indicate?the?starting?row?and?the?full
          ?*?size?of?the?dataset.?EJBs?can?return?instances?of?this?type?when?returning
          ?*?subsets?of?available?data.
          ?
          */

          public ? class ?DataPage
          {
          ????
          private ? int ?datasetSize;
          ????
          private ? int ?startRow;
          ????
          private ?List?data;

          ????
          /**
          ?????*?Create?an?object?representing?a?sublist?of?a?dataset.
          ?????*?
          ?????*?
          @param ?datasetSize
          ?????*????????????is?the?total?number?of?matching?rows?available.
          ?????*?
          ?????*?
          @param ?startRow
          ?????*????????????is?the?index?within?the?complete?dataset?of?the?first?element
          ?????*????????????in?the?data?list.
          ?????*?
          ?????*?
          @param ?data
          ?????*????????????is?a?list?of?consecutive?objects?from?the?dataset.
          ?????
          */

          ????
          public ?DataPage( int ?datasetSize,? int ?startRow,?List?data)
          ????
          {
          ????????
          this .datasetSize? = ?datasetSize;
          ????????
          this .startRow? = ?startRow;
          ????????
          this .data? = ?data;
          ????}


          ????
          /**
          ?????*?Return?the?number?of?items?in?the?full?dataset.
          ?????
          */

          ????
          public ? int ?getDatasetSize()
          ????
          {
          ????????
          return ?datasetSize;
          ????}


          ????
          /**
          ?????*?Return?the?offset?within?the?full?dataset?of?the?first?element?in?the
          ?????*?list?held?by?this?object.
          ?????
          */

          ????
          public ? int ?getStartRow()
          ????
          {
          ????????
          return ?startRow;
          ????}


          ????
          /**
          ?????*?Return?the?list?of?objects?held?by?this?object,?which?is?a?continuous
          ?????*?subset?of?the?full?dataset.
          ?????
          */

          ????
          public ?List?getData()
          ????
          {
          ????????
          return ?data;
          ????}

          }

          ???? 接下來(lái),我們要對(duì)DataModel進(jìn)行封裝,達(dá)到我們分頁(yè)的要求。該DataModel僅僅持有了一頁(yè)的數(shù)據(jù)DataPage,并在適當(dāng)?shù)臅r(shí)候加載數(shù)據(jù),讀取我們需要頁(yè)的數(shù)據(jù)。


          /**
          ?*?A?special?type?of?JSF?DataModel?to?allow?a?datatable?and?datascroller?to?page
          ?*?through?a?large?set?of?data?without?having?to?hold?the?entire?set?of?data?in
          ?*?memory?at?once.
          ?*?<p>
          ?*?Any?time?a?managed?bean?wants?to?avoid?holding?an?entire?dataset,?the?managed
          ?*?bean?should?declare?an?inner?class?which?extends?this?class?and?implements
          ?*?the?fetchData?method.?This?method?is?called?as?needed?when?the?table?requires
          ?*?data?that?isn't?available?in?the?current?data?page?held?by?this?object.
          ?*?<p>
          ?*?This?does?require?the?managed?bean?(and?in?general?the?business?method?that
          ?*?the?managed?bean?uses)?to?provide?the?data?wrapped?in?a?DataPage?object?that
          ?*?provides?info?on?the?full?size?of?the?dataset.
          ?
          */

          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);
          ????
          }

          ???? 最后,我們需要在Backing Bean中加一些東西,調(diào)用業(yè)務(wù)邏輯,并將數(shù)據(jù)交給PagedListDataModel,來(lái)幫我們完成最后的分頁(yè)工作。

          ?? public ?SomeManagedBean? {
          ????.


          ????
          private ?DataPage?getDataPage( int ?startRow,? int ?pageSize)? {
          ??????
          // ?access?database?here,?or?call?EJB?to?do?so
          ????}


          ????
          public ?DataModel?getDataModel()? {
          ????????
          if ?(dataModel? == ? null )? {
          ????????????dataModel?
          = ? new ?LocalDataModel(20);
          ????????}


          ????????
          return ?dataModel;
          ????}


          ????
          private ? class ?LocalDataModel? extends ?PagedListDataModel? {
          ????????
          public ?LocalDataModel( int ?pageSize)? {
          ????????????
          super (pageSize);
          ????????}

          ????????
          ????????
          public ?DataPage?fetchPage( int ?startRow,? int ?pageSize)? {
          ????????????
          // ?call?enclosing?managed?bean?method?to?fetch?the?data
          ???????????? return ?getDataPage(startRow,?pageSize);
          ????????}

          }


          這里面有一個(gè)getDataPage的方法,只需要把所有業(yè)務(wù)邏輯的調(diào)用放在這里就可以了,最后業(yè)務(wù)邏輯調(diào)用的結(jié)果返回一個(gè)List,總條數(shù)返回一個(gè)int型的count放到DataPage中去就可以了。

          為了實(shí)現(xiàn)復(fù)用,把上面第三段的代碼中的LocalDataModel類和getDataPage方法抽到BasePagedBackingBean中,把getDataPage方法改成:

          protected abstract DataPage getDataPage(int startRow, int pageSize);

          這樣我們把所有需要分頁(yè)的Backing Bean繼承自這個(gè)抽象類,并實(shí)現(xiàn)getDataPage方法即可很容易的實(shí)現(xiàn)分頁(yè)。

          ?

          ???在具體應(yīng)用中可以這么寫:

          ???? protected ?DataPage?getDataPage( int ?startRow,? int ?pageSize)
          ????
          {
          ????????List?scheduleList?
          = ?scheduleService.getSchedulesByDate(scheduleDate,?startRow,?pageSize);
          ????????
          int ?dataSetSize? = ?scheduleService.getSchedulesCountByDate(scheduleDate);
          ????????
          return ? new ?DataPage(dataSetSize,?startRow,?scheduleList);
          ????}


          在數(shù)據(jù)訪問(wèn)中,我們只需要取出我們需要行數(shù)的記錄就可以了,這在hibernate中非常容易實(shí)現(xiàn)。

          如果使用Criteria查詢的話,只要加上:

          ???? criteria.setFirstResult(startRow);

          ???? criteria.setMaxResults(pageSize);

          使用Query查詢的話,只要加上

          ???? query.setFirstResult(startRow);

          ???? query.setMaxResults(pageSize);

          并把兩個(gè)參數(shù)傳入即可。

          我們還需要另外寫一個(gè)CountDAO,取出相同查詢條件的記錄條數(shù)即可。

          還要修改一下Backing Bean中與dataTable綁定的property,將返回類型由List改成DataModel,而第一篇中用到的頁(yè)面不需要做任何修改就可以滿足新的需求了。

          里面最重要的是 PagedListDataModel fetchPage 這個(gè)方法,當(dāng)滿足取數(shù)據(jù)的條件時(shí),都會(huì)調(diào)用它取數(shù)據(jù),因?yàn)闃I(yè)務(wù)邏輯不同,不便于將業(yè)務(wù)邏輯的調(diào)用放在里面實(shí)現(xiàn),于是將其作為抽象方法,將具體的實(shí)現(xiàn)放到具體的Backing Bean中進(jìn)行,在BaseBackingBean中,實(shí)現(xiàn)了這個(gè)方法,調(diào)用了getDataPage(startRow, pageSize)這個(gè)方法,而在BaseBackingBean中,這個(gè)方法又推遲到更具體的頁(yè)面中實(shí)現(xiàn),這樣,我們?cè)诰唧w的頁(yè)面中只需要實(shí)現(xiàn)一個(gè)getDataPage(startRow, pageSize)這個(gè)方法訪問(wèn)業(yè)務(wù)邏輯。

          大功告成,這個(gè)實(shí)現(xiàn)把前面遇到的兩個(gè)問(wèn)題都解決了, On-demand loading 是沒(méi)有問(wèn)題了,因?yàn)橹挥性谑状巫x取和換頁(yè)的時(shí)候DataModel才會(huì)向數(shù)據(jù)庫(kù)請(qǐng)求數(shù)據(jù),雖然在JSF的生命周期中多次調(diào)用與dataTable綁定的方法,但是因?yàn)槊看螛I(yè)務(wù)邏輯請(qǐng)求以后,數(shù)據(jù)都會(huì)存放在DataPage中,如果里面的數(shù)據(jù)滿足需求的話,就不再請(qǐng)求訪問(wèn)數(shù)據(jù)庫(kù),這樣多次訪問(wèn)數(shù)據(jù)庫(kù)的問(wèn)題也解決了。

          雖然這樣的話,dataScrollorTag使用起來(lái)還是很復(fù)雜,通常在同一個(gè)項(xiàng)目中,我們只會(huì)使用一種樣式的分頁(yè)導(dǎo)航,不過(guò)沒(méi)關(guān)系,我們只需要修改以下DataScrollorRender Kit,把一些可以定義的值固定下來(lái),再定義一個(gè)TLD文件,就可以在項(xiàng)目中使用簡(jiǎn)化版的Tag了。

          這個(gè)方法一開始發(fā)布在MyfacesWiki中,http://wiki.apache.org/myfaces/WorkingWithLargeTables,那里很少有人關(guān)注到,大家有興趣可以看看原文,本文只是對(duì)這種方法做一些簡(jiǎn)單的介紹,并非自創(chuàng),希望大家能夠多多關(guān)注開源社區(qū),因?yàn)槟抢镉凶钚伦詈玫臇|西。

          Nightly Build服務(wù)器中拿到的12.27Myfaces包,發(fā)現(xiàn)里面擴(kuò)充了很多新的Component,只是并沒(méi)有正式發(fā)布,大家有興趣的話可以研究研究。

          posted on 2005-12-30 10:30 steady 閱讀(15027) 評(píng)論(21)  編輯  收藏 所屬分類: JSF & Myfaces

          FeedBack:
          # re: 在JSF中實(shí)現(xiàn)分頁(yè)(二) 2006-08-29 14:30 你好
          你好,我看了你寫的這個(gè)分頁(yè).我覺(jué)得不錯(cuò).可以發(fā)一份源代碼給我嗎?  回復(fù)  更多評(píng)論
            
          # re: 在JSF中實(shí)現(xiàn)分頁(yè)(二) 2006-10-25 13:48 figo
          寫的亂七八糟 還不如自己用TAG和存儲(chǔ)過(guò)程來(lái)寫  回復(fù)  更多評(píng)論
            
          # re: 在JSF中實(shí)現(xiàn)分頁(yè)(二) 2006-10-25 15:34 figo
          我估計(jì)你自己都不會(huì) 亂把人家東西拿來(lái)  回復(fù)  更多評(píng)論
            
          # re: 在JSF中實(shí)現(xiàn)分頁(yè)(二) 2006-10-25 15:40 steady
          該方法被很多人應(yīng)用過(guò)了,非常簡(jiǎn)單,稍微懂一點(diǎn)的人都可以正常的調(diào)試出來(lái)。  回復(fù)  更多評(píng)論
            
          # re: 在JSF中實(shí)現(xiàn)分頁(yè)(二) 2006-10-25 15:53 figo
          呵呵多有得罪 才學(xué)JSF 你加我QQ352292867 我給你看看我的分頁(yè) 何必用JSF來(lái)寫呢  回復(fù)  更多評(píng)論
            
          # re: 在JSF中實(shí)現(xiàn)分頁(yè)(二) 2006-10-25 15:54 figo
          兄弟別介意 我這個(gè)人脾氣不好向來(lái)看東西很急 加我QQ 352292867 一起研究研究 我也有一個(gè)很不錯(cuò)的分頁(yè)   回復(fù)  更多評(píng)論
            
          # re: 在JSF中實(shí)現(xiàn)分頁(yè)(二) 2006-12-17 00:10 flmn
          http://wiki.apache.org/myfaces/WorkingWithLargeTables給的代碼可能比你的新,有了些新的東西,我看getRowData方法里多了這段
          // Check if rowIndex is equal to startRow,
          // useful for dynamic sorting on pages

          if (rowIndex == page.getStartRow()){
          page = fetchPage(rowIndex, pageSize);
          }
          不太懂他的意思,而且看sql,取一頁(yè)調(diào)用了三次,而你的代碼只調(diào)一次,我不太明白他這樣做的意圖。  回復(fù)  更多評(píng)論
            
          # re: 在JSF中實(shí)現(xiàn)分頁(yè)(二) 2007-01-07 11:49 魚腸劍
          有幾個(gè)地方不明白:
          public Object getRowData(){

          }
          這個(gè)方法應(yīng)該是取一行數(shù)據(jù)吧?就是一個(gè)model的實(shí)例?

          fetchPage(rowIndex, pageSize)這個(gè)方法應(yīng)該是取得一頁(yè)的數(shù)據(jù)吧?

          那在這個(gè)方法里的下面這段代碼是什么意思:
          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);
            回復(fù)  更多評(píng)論
            
          # re: 在JSF中實(shí)現(xiàn)分頁(yè)(二) 2007-01-16 06:17 harderwu
          潛水很久,看了您不少文章,很是崇拜,這兩天我試圖做一個(gè)分頁(yè)組件,但對(duì)您文章中"我們只需要修改以下DataScrollor的Render Kit,把一些可以定義的值固定下來(lái),再定義一個(gè)TLD文件,就可以在項(xiàng)目中使用簡(jiǎn)化版的Tag了"感覺(jué)不從下手,“DataScrollor的Render Kit”在什么地方,我怎么找不到,可能是自己太弱原故(小人學(xué)jsf不久),能詳細(xì)介紹一下如何實(shí)現(xiàn)制作一個(gè)組件標(biāo)簽及在項(xiàng)目里使用嗎?如果有好的例子能否共享?我的郵箱harder-wu@163.com  回復(fù)  更多評(píng)論
            
          # re: 在JSF中實(shí)現(xiàn)分頁(yè)(二) 2007-04-25 18:00 waryist
          頁(yè)面怎么調(diào)用?唉。就是把人家的東西抄過(guò)來(lái)說(shuō)明一下就算了,又沒(méi)有說(shuō)詳細(xì)  回復(fù)  更多評(píng)論
            
          # re: 在JSF中實(shí)現(xiàn)分頁(yè)(二) 2007-05-19 00:43 嘻哈標(biāo)明
          很高興看到這篇文章,我按這個(gè)操作已經(jīng)兩天了都沒(méi)有完成,報(bào)rowIndex出錯(cuò),作者能提供<t:dataTable>的代碼嗎?  回復(fù)  更多評(píng)論
            
          # re: 在JSF中實(shí)現(xiàn)分頁(yè)(二) 2007-05-19 23:29 原版
          謝謝。
          擴(kuò)展DataModel才是正解,你們五六人半月時(shí)間浪費(fèi)了啊!呵呵。  回復(fù)  更多評(píng)論
            
          # re: 在JSF中實(shí)現(xiàn)分頁(yè)(二) 2007-09-07 12:48 小偉
          你好!!
          現(xiàn)在應(yīng)用這個(gè)成功實(shí)現(xiàn)分頁(yè)!
          一問(wèn):不過(guò)好像在渲染時(shí)會(huì)調(diào)用兩次,與myfaces原先的分頁(yè)實(shí)現(xiàn)一樣!可能是生命周期的問(wèn)題。

          二問(wèn):應(yīng)用了這個(gè)分頁(yè),在我的backing bean里面偶不知要如何獲取我所顯現(xiàn)出來(lái)的dataModel中的數(shù)據(jù)。
          偶現(xiàn)在需要做一個(gè)多項(xiàng)刪除,在bean中添加一個(gè)boolean屬性,以判別是否要?jiǎng)h除,雖然可以用getRequestParameterMap來(lái)獲取其相應(yīng)的selectBooleanCheck信息,但最好還是通過(guò)datamodel中的Bean對(duì)象來(lái)判斷該值是否為true,現(xiàn)在就是不知要如何獲得datamodel的bean對(duì)象信息。

          請(qǐng)解惑?謝謝

            回復(fù)  更多評(píng)論
            
          # re: 在JSF中實(shí)現(xiàn)分頁(yè)(二) 2007-11-09 16:19 各個(gè)
          我用的是workshop for weblogic 的IDE ,用myfaces的標(biāo)簽 就是不能翻頁(yè) 是怎么回事 就是點(diǎn)擊下一頁(yè)的時(shí)候 沒(méi)有什么反映 有能人幫助一下  回復(fù)  更多評(píng)論
            
          # re: 在JSF中實(shí)現(xiàn)分頁(yè)(二) 2007-12-12 13:30 cenjun
          做分頁(yè)二遇到的問(wèn)題:
          在點(diǎn)上頁(yè)和下頁(yè)的時(shí)候沒(méi)有規(guī)律跳的問(wèn)題,其他地方?jīng)]有改
          bean中代碼
          private DataModel pagedDataModel;

          private TableListBean listBean;

          /**
          *
          */
          public PagedTableListBean() {

          }

          /**
          * @return the itemList
          */
          public DataModel getItemList() {
          if (pagedDataModel == null) {
          pagedDataModel = new LocalDataModel(15);
          }

          return pagedDataModel;
          }

          /**
          * @return the pagedDataModel
          */
          public DataModel getPagedDataModel() {
          return pagedDataModel;
          }

          /**
          * @param pagedDataModel
          * the pagedDataModel to set
          */
          public void setPagedDataModel(DataModel pagedDataModel) {
          this.pagedDataModel = pagedDataModel;
          }

          /**
          * @return the listBean
          */
          public TableListBean getListBean() {
          return listBean;
          }

          /**
          * @param listBean
          * the listBean to set
          */
          public void setListBean(TableListBean listBean) {
          this.listBean = listBean;
          }

          // local class
          private class LocalDataModel extends PagedListDataModel {
          public LocalDataModel(int pageSize) {
          super(pageSize);
          }

          public DataPage fetchPage(int startRow, int pageSize) {
          // call enclosing managed bean method to fetch the data
          return getDataPage(startRow, pageSize);
          }
          }

          // get datePage from DAO
          private DataPage getDataPage(int startRow, int pageSize) {
          // access database here, or call EJB to do so
          TableListBean listBean = new TableListBean();
          List subList = listBean.getTableList(startRow, pageSize);
          DataPage dataPage = new DataPage(104, startRow, subList);
          return dataPage;
          }   回復(fù)  更多評(píng)論
            
          # re: 在JSF中實(shí)現(xiàn)分頁(yè)(二) 2007-12-12 13:34 cenjun
          listBean.getTableList(startRow, pageSize)
          中sql語(yǔ)句拼出來(lái)的代碼
          select * from (select rownum num, a.* from (select * from tb_wo_page_item) a) where num >=startRow and num <startRow+pageSize


          jsp中代碼:

          <rich:dataTable id="dataTableId" value="#{pagedTableListBean.itemList}" var="dT" cellpadding="5px" border="1" rows="15">
          <f:facet name="header">

          <rich:columnGroup>
          <h:column>
          </h:column>
          <h:column>
          <h:outputText value="表 名" />
          </h:column>
          <h:column>
          <h:outputText value="數(shù) 量" />
          </h:column>
          </rich:columnGroup>
          </f:facet>


          <h:column>
          <h:outputText value="#{dT.tbCode}" />
          </h:column>
          <h:column>
          <h:outputText value="#{dT.num}" />
          </h:column>
          <f:facet name="footer">
          <rich:datascroller id="aa" for="dataTableId" />
          </f:facet>

          </rich:dataTable>

          請(qǐng)問(wèn)這是怎么回事啊???   回復(fù)  更多評(píng)論
            
          # re: 在JSF中實(shí)現(xiàn)分頁(yè)(二) 2007-12-12 13:37 cenjun
          更正jsp中代碼
          <rich:datascroller id="aa" fastControls ="hidden" for="dataTableId" >
          <f:facet name="previous">

          <h:outputText value="上頁(yè)"/>

          </f:facet>
          <f:facet name="pages">
          <h:outputText value=""></h:outputText>
          </f:facet>
          <f:facet name="next">

          <h:outputText value="下頁(yè)"/>

          </f:facet>
          </rich:datascroller>  回復(fù)  更多評(píng)論
            
          # re: 在JSF中實(shí)現(xiàn)分頁(yè)(二) 2009-03-27 16:44 jsfbegainner
          @小偉

          你現(xiàn)在這個(gè)問(wèn)題解決了么?  回復(fù)  更多評(píng)論
            
          # re: 在JSF中實(shí)現(xiàn)分頁(yè)(二) 2009-06-15 09:40 Gerry
          放在BackBeanBase中導(dǎo)致一個(gè)頁(yè)面上只能有一個(gè)分頁(yè),如果我想有兩個(gè)呢?  回復(fù)  更多評(píng)論
            
          # re: 在JSF中實(shí)現(xiàn)分頁(yè)(二) 2010-05-24 21:29 mikeyuan
          單純的分頁(yè)能做,單純的按字段排序也能做,
          我花費(fèi)了很長(zhǎng)時(shí)間,想做一個(gè)既能排序又能分頁(yè)的DataTable,就是不行,郁悶.
          又:<JSF in Action>的例子講了這個(gè)問(wèn)題,但是有Bug
          我把<JSF核心編程>的分頁(yè)和排序的兩個(gè)例子合在一起,總有問(wèn)題.

          大俠解決一下  回復(fù)  更多評(píng)論
            
          # re: 在JSF中實(shí)現(xiàn)分頁(yè)(二) 2010-11-17 09:21 Wind Wood
          你好,最新我初學(xué)了一點(diǎn)JSF,準(zhǔn)備來(lái)做一個(gè)項(xiàng)目。但是在項(xiàng)目中遇到一個(gè)基礎(chǔ)的問(wèn)題:后臺(tái)支撐bean里有List的成員屬性,其通過(guò)dataTable顯示后,我點(diǎn)擊Form里的Action按鈕進(jìn)入重建視圖應(yīng)用請(qǐng)求值的時(shí)候,原先的List屬性并沒(méi)有帶過(guò)來(lái),導(dǎo)致第二個(gè)頁(yè)面就為空了。我把List改為DataModel也還是一樣,傳不了值回來(lái),這個(gè)問(wèn)題已經(jīng)卡了幾天了,通宵了兩晚都搞不出來(lái)。不知道你們是如何處理這樣的問(wèn)題的,如果可以,希望能盡快收到您的回信。萬(wàn)分感謝!!!  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 娄底市| 郯城县| 莱芜市| 德昌县| 忻城县| 抚州市| 望城县| 宣化县| 珲春市| 安仁县| 黄陵县| 北京市| 张北县| 房山区| 错那县| 德格县| 盐源县| 南澳县| 柳河县| 白城市| 吴忠市| 岳普湖县| 民丰县| 西安市| 崇仁县| 安泽县| 中山市| 明水县| 两当县| 磐安县| 雅江县| 五原县| 宜黄县| 芦山县| 农安县| 浙江省| 正定县| 来宾市| 乃东县| 金沙县| 湘潭市|