當(dāng)前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
【第二版】RichFaces中使用datatable和datascroller进行分页(使用数据库分页,改良版)(含源码)(JSF 1.2,RichFaces 3.2.1GA)
生活随笔
收集整理的這篇文章主要介紹了
【第二版】RichFaces中使用datatable和datascroller进行分页(使用数据库分页,改良版)(含源码)(JSF 1.2,RichFaces 3.2.1GA)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
之前第一版有個問題,就是如果進(jìn)行了刪除等操作并立即返回列表頁,被刪除的項還在那,但其實數(shù)據(jù)庫已經(jīng)被刪除了,需要做一個刷新列表操作才可以,本版就是修正此問題的。
如果要修正此問題,就需要將分頁的擴(kuò)展代碼也就是第一版中TestBean中的代碼放入業(yè)務(wù)相關(guān)管理Bean中。
頁面代碼(其中testBean已經(jīng)變成業(yè)務(wù)Managed-bean user了):
????????<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(沒有變化):
public?class?DataPage
{
????/**
?????*?將需要的頁的數(shù)據(jù)封裝到一個DataPage中去,?這個類表示了我們需要的一頁的數(shù)據(jù),<br>
?????*?里面包含有三個元素:datasetSize,startRow,和一個用于表示具體數(shù)據(jù)的List。<br>
?????*?datasetSize表示了這個記錄集的總條數(shù),查詢數(shù)據(jù)的時候,使用同樣的條件取count即可,<br>
?????*?startRow表示該頁的起始行在數(shù)據(jù)庫中所有記錄集中的位置
?????*/
????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?分頁所使用的類
?*?@author?<a?href="mailto:tianlu@jsecode.com">TianLu</a>
?*?@version?$Rev$?<br>
?*??????????$Id$
?*/
/*?使用方法:
?*?前臺的功能模塊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)
????????????{
????????????????//查詢分頁函數(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;
????}*/
/*?前臺控件像這樣使用
?*?<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)行刪除等操作后會立即改變列表項并且返回列表頁的,請調(diào)用本類的refresh方法刷新當(dāng)前頁面
?*?使用方法:
?*?????????????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
總結(jié)
以上是生活随笔為你收集整理的【第二版】RichFaces中使用datatable和datascroller进行分页(使用数据库分页,改良版)(含源码)(JSF 1.2,RichFaces 3.2.1GA)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java面试题001
- 下一篇: PowerDesigner使用教程 ——