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

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

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

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

    常用鏈接

    我參與的團隊

    隨筆分類(103)

    搜索

    •  

    積分與排名

    • 積分 - 413988
    • 排名 - 135

    最新評論

    閱讀排行榜

    ???? 前面一篇直接使用了Myfaces中的兩個Component完成了一個簡單的分頁,這里將會介紹一種On-demand loading的方法來進行分頁,僅僅在需要數據的時候加載。

    ???? 先來說一些題外話,為了實現這種方式的分頁,公司里大約5-6個人做了半個多月的工作,擴展了dataTable,修改了dataScrollor,以及各種其他的方法,但是都不是很優雅。在上個月底的時候,在MyfacesMail List中也針對這個問題展開了一系列的討論,最后有人總結了討論中提出的比較好的方法,提出了以下的分頁方法,也是目前實現的最為優雅的方法,也就是不對dataTabledataScrollor做任何修改,僅僅通過擴展DataModel來實現分頁。

    ???? DataModel 是一個抽象類,用于封裝各種類型的數據源和數據對象的訪問,JSFdataTable中綁定的數據實際上被包裝成了一個DataModel,以消除各種不同數據源和數據類型的復雜性,在前面一篇中我們訪問數據庫并拿到了一個List,交給dataTable,這時候,JSF會將這個List包裝成 ListDataModel dataTable訪問數據都是通過這個DataModel進行的,而不是直接使用List

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

    /**
    ?*?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;
    ????}

    }

    ???? 接下來,我們要對DataModel進行封裝,達到我們分頁的要求。該DataModel僅僅持有了一頁的數據DataPage,并在適當的時候加載數據,讀取我們需要頁的數據。


    /**
    ?*?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中加一些東西,調用業務邏輯,并將數據交給PagedListDataModel,來幫我們完成最后的分頁工作。

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

    }


    這里面有一個getDataPage的方法,只需要把所有業務邏輯的調用放在這里就可以了,最后業務邏輯調用的結果返回一個List,總條數返回一個int型的count放到DataPage中去就可以了。

    為了實現復用,把上面第三段的代碼中的LocalDataModel類和getDataPage方法抽到BasePagedBackingBean中,把getDataPage方法改成:

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

    這樣我們把所有需要分頁的Backing Bean繼承自這個抽象類,并實現getDataPage方法即可很容易的實現分頁。

    ?

    ???在具體應用中可以這么寫:

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


    在數據訪問中,我們只需要取出我們需要行數的記錄就可以了,這在hibernate中非常容易實現。

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

    ???? criteria.setFirstResult(startRow);

    ???? criteria.setMaxResults(pageSize);

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

    ???? query.setFirstResult(startRow);

    ???? query.setMaxResults(pageSize);

    并把兩個參數傳入即可。

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

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

    里面最重要的是 PagedListDataModel fetchPage 這個方法,當滿足取數據的條件時,都會調用它取數據,因為業務邏輯不同,不便于將業務邏輯的調用放在里面實現,于是將其作為抽象方法,將具體的實現放到具體的Backing Bean中進行,在BaseBackingBean中,實現了這個方法,調用了getDataPage(startRow, pageSize)這個方法,而在BaseBackingBean中,這個方法又推遲到更具體的頁面中實現,這樣,我們在具體的頁面中只需要實現一個getDataPage(startRow, pageSize)這個方法訪問業務邏輯。

    大功告成,這個實現把前面遇到的兩個問題都解決了, On-demand loading 是沒有問題了,因為只有在首次讀取和換頁的時候DataModel才會向數據庫請求數據,雖然在JSF的生命周期中多次調用與dataTable綁定的方法,但是因為每次業務邏輯請求以后,數據都會存放在DataPage中,如果里面的數據滿足需求的話,就不再請求訪問數據庫,這樣多次訪問數據庫的問題也解決了。

    雖然這樣的話,dataScrollorTag使用起來還是很復雜,通常在同一個項目中,我們只會使用一種樣式的分頁導航,不過沒關系,我們只需要修改以下DataScrollorRender Kit,把一些可以定義的值固定下來,再定義一個TLD文件,就可以在項目中使用簡化版的Tag了。

    這個方法一開始發布在MyfacesWiki中,http://wiki.apache.org/myfaces/WorkingWithLargeTables,那里很少有人關注到,大家有興趣可以看看原文,本文只是對這種方法做一些簡單的介紹,并非自創,希望大家能夠多多關注開源社區,因為那里有最新最好的東西。

    Nightly Build服務器中拿到的12.27Myfaces包,發現里面擴充了很多新的Component,只是并沒有正式發布,大家有興趣的話可以研究研究。

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

    FeedBack:
    # re: 在JSF中實現分頁(二) 2006-08-29 14:30 你好
    你好,我看了你寫的這個分頁.我覺得不錯.可以發一份源代碼給我嗎?  回復  更多評論
      
    # re: 在JSF中實現分頁(二) 2006-10-25 13:48 figo
    寫的亂七八糟 還不如自己用TAG和存儲過程來寫  回復  更多評論
      
    # re: 在JSF中實現分頁(二) 2006-10-25 15:34 figo
    我估計你自己都不會 亂把人家東西拿來  回復  更多評論
      
    # re: 在JSF中實現分頁(二) 2006-10-25 15:40 steady
    該方法被很多人應用過了,非常簡單,稍微懂一點的人都可以正常的調試出來。  回復  更多評論
      
    # re: 在JSF中實現分頁(二) 2006-10-25 15:53 figo
    呵呵多有得罪 才學JSF 你加我QQ352292867 我給你看看我的分頁 何必用JSF來寫呢  回復  更多評論
      
    # re: 在JSF中實現分頁(二) 2006-10-25 15:54 figo
    兄弟別介意 我這個人脾氣不好向來看東西很急 加我QQ 352292867 一起研究研究 我也有一個很不錯的分頁   回復  更多評論
      
    # re: 在JSF中實現分頁(二) 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,取一頁調用了三次,而你的代碼只調一次,我不太明白他這樣做的意圖。  回復  更多評論
      
    # re: 在JSF中實現分頁(二) 2007-01-07 11:49 魚腸劍
    有幾個地方不明白:
    public Object getRowData(){

    }
    這個方法應該是取一行數據吧?就是一個model的實例?

    fetchPage(rowIndex, pageSize)這個方法應該是取得一頁的數據吧?

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

    二問:應用了這個分頁,在我的backing bean里面偶不知要如何獲取我所顯現出來的dataModel中的數據。
    偶現在需要做一個多項刪除,在bean中添加一個boolean屬性,以判別是否要刪除,雖然可以用getRequestParameterMap來獲取其相應的selectBooleanCheck信息,但最好還是通過datamodel中的Bean對象來判斷該值是否為true,現在就是不知要如何獲得datamodel的bean對象信息。

    請解惑?謝謝

      回復  更多評論
      
    # re: 在JSF中實現分頁(二) 2007-11-09 16:19 各個
    我用的是workshop for weblogic 的IDE ,用myfaces的標簽 就是不能翻頁 是怎么回事 就是點擊下一頁的時候 沒有什么反映 有能人幫助一下  回復  更多評論
      
    # re: 在JSF中實現分頁(二) 2007-12-12 13:30 cenjun
    做分頁二遇到的問題:
    在點上頁和下頁的時候沒有規律跳的問題,其他地方沒有改
    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;
    }   回復  更多評論
      
    # re: 在JSF中實現分頁(二) 2007-12-12 13:34 cenjun
    listBean.getTableList(startRow, pageSize)
    中sql語句拼出來的代碼
    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="數 量" />
    </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>

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

    <h:outputText value="上頁"/>

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

    <h:outputText value="下頁"/>

    </f:facet>
    </rich:datascroller>  回復  更多評論
      
    # re: 在JSF中實現分頁(二) 2009-03-27 16:44 jsfbegainner
    @小偉

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

    大俠解決一下  回復  更多評論
      
    # re: 在JSF中實現分頁(二) 2010-11-17 09:21 Wind Wood
    你好,最新我初學了一點JSF,準備來做一個項目。但是在項目中遇到一個基礎的問題:后臺支撐bean里有List的成員屬性,其通過dataTable顯示后,我點擊Form里的Action按鈕進入重建視圖應用請求值的時候,原先的List屬性并沒有帶過來,導致第二個頁面就為空了。我把List改為DataModel也還是一樣,傳不了值回來,這個問題已經卡了幾天了,通宵了兩晚都搞不出來。不知道你們是如何處理這樣的問題的,如果可以,希望能盡快收到您的回信。萬分感謝!!!  回復  更多評論
      
    主站蜘蛛池模板: yy一级毛片免费视频| 国产18禁黄网站免费观看| www在线观看免费视频| 亚洲一卡2卡三卡4卡无卡下载 | 亚洲国产中文在线视频| AV在线亚洲男人的天堂| 日韩在线a视频免费播放| 国产成人免费高清激情明星| 成人A片产无码免费视频在线观看| 美景之屋4在线未删减免费| 国产精品亚洲精品青青青| yy一级毛片免费视频| 国产精品亚洲专区无码牛牛| 亚洲乱码一二三四区乱码| 亚洲毛片免费视频| 亚洲国产一区在线| 亚洲αv久久久噜噜噜噜噜| 自拍偷自拍亚洲精品被多人伦好爽 | 国语成本人片免费av无码| 最近中文字幕免费完整| 国产精品99精品久久免费| 丁香花在线视频观看免费| aa在线免费观看| 国内精品99亚洲免费高清| 成人午夜免费视频| 亚洲国产一区在线| 亚洲AV永久无码精品一百度影院| 亚洲欧洲自拍拍偷午夜色无码| 亚洲裸男gv网站| 最近中文字幕免费完整| 91免费福利精品国产| 97久久免费视频| 2021在线永久免费视频| 黄在线观看www免费看| 国产情侣激情在线视频免费看| 亚洲小说图区综合在线| 国产成人精品亚洲日本在线| 亚洲国产精品免费观看 | 无码国产精品一区二区免费| 免费观看AV片在线播放| 无码国产精品一区二区免费I6|