<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 170  文章 - 536  trackbacks - 0
    <2005年12月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

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

    隨筆分類(lèi)(103)

    搜索

    •  

    積分與排名

    • 積分 - 414123
    • 排名 - 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)題展開(kāi)了一系列的討論,最后有人總結(jié)了討論中提出的比較好的方法,提出了以下的分頁(yè)方法,也是目前實(shí)現(xiàn)的最為優(yōu)雅的方法,也就是不對(duì)dataTabledataScrollor做任何修改,僅僅通過(guò)擴(kuò)展DataModel來(lái)實(shí)現(xiàn)分頁(yè)。

    ???? DataModel 是一個(gè)抽象類(lèi),用于封裝各種類(lèi)型的數(shù)據(jù)源和數(shù)據(jù)對(duì)象的訪問(wèn),JSFdataTable中綁定的數(shù)據(jù)實(shí)際上被包裝成了一個(gè)DataModel,以消除各種不同數(shù)據(jù)源和數(shù)據(jù)類(lèi)型的復(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è)類(lèi)表示了我們需要的一頁(yè)的數(shù)據(jù),里面包含有三個(gè)元素:datasetSizestartRow,和一個(gè)用于表示具體數(shù)據(jù)的ListdatasetSize表示了這個(gè)記錄集的總條數(shù),查詢(xún)數(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類(lèi)和getDataPage方法抽到BasePagedBackingBean中,把getDataPage方法改成:

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

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

    ?

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

    ???? 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查詢(xún)的話,只要加上:

    ???? criteria.setFirstResult(startRow);

    ???? criteria.setMaxResults(pageSize);

    使用Query查詢(xún)的話,只要加上

    ???? query.setFirstResult(startRow);

    ???? query.setMaxResults(pageSize);

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

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

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

    里面最重要的是 PagedListDataModel fetchPage 這個(gè)方法,當(dāng)滿(mǎn)足取數(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ù)滿(mǎn)足需求的話,就不再請(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è)方法一開(kāi)始發(fā)布在MyfacesWiki中,http://wiki.apache.org/myfaces/WorkingWithLargeTables,那里很少有人關(guān)注到,大家有興趣可以看看原文,本文只是對(duì)這種方法做一些簡(jiǎn)單的介紹,并非自創(chuàng),希望大家能夠多多關(guān)注開(kāi)源社區(qū),因?yàn)槟抢镉凶钚伦詈玫臇|西。

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

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

    FeedBack:
    # re: 在JSF中實(shí)現(xiàn)分頁(yè)(二) 2006-08-29 14:30 你好
    你好,我看了你寫(xiě)的這個(gè)分頁(yè).我覺(jué)得不錯(cuò).可以發(fā)一份源代碼給我嗎?  回復(fù)  更多評(píng)論
      
    # re: 在JSF中實(shí)現(xiàn)分頁(yè)(二) 2006-10-25 13:48 figo
    寫(xiě)的亂七八糟 還不如自己用TAG和存儲(chǔ)過(guò)程來(lái)寫(xiě)  回復(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)寫(xiě)呢  回復(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 魚(yú)腸劍
    有幾個(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)論
      
    主站蜘蛛池模板: 午夜亚洲国产精品福利| 国产精品成人啪精品视频免费| 亚洲?V乱码久久精品蜜桃| 91免费国产精品| 韩国免费a级作爱片无码| 在线视频亚洲一区| 亚洲免费黄色网址| 亚洲va在线va天堂va不卡下载| 亚洲Av无码国产情品久久| 成人毛片手机版免费看| 久久ww精品w免费人成| 四虎永久免费网站免费观看| 老司机精品免费视频| 黄色免费网站在线看| 国产综合成人亚洲区| 亚洲欧美中文日韩视频| 亚洲AV成人噜噜无码网站| 久久精品国产亚洲av影院| 亚洲色大18成人网站WWW在线播放 亚洲色大成WWW亚洲女子 | 亚洲1区1区3区4区产品乱码芒果| 亚洲国产精品嫩草影院在线观看 | 亚洲精品无码高潮喷水A片软| 亚洲精品在线电影| 97av免费视频| 无码囯产精品一区二区免费| 国产在线观看免费av站| 黄桃AV无码免费一区二区三区| 一区二区免费电影| 99视频在线免费观看| 男女一进一出抽搐免费视频| 一级毛片a女人刺激视频免费| 激情吃奶吻胸免费视频xxxx| 国产成人亚洲精品91专区高清| 精品久久久久久亚洲中文字幕| 亚洲av无码成人精品区一本二本| 亚洲国产高清国产拍精品| 色偷偷亚洲第一综合网| 瑟瑟网站免费网站入口| 羞羞视频在线观看免费| 国产精品免费久久久久电影网| 国产午夜精品理论片免费观看|