2013-01-07 27 views
5

मैं यह समझने की कोशिश कर रहा हूं कि रिचफैसेस डेटास्क्रोलर के साथ सही अंकन कैसे करें।रिचफैसेस 3 डेटास्क्रोलर को सही पेजिंग बनाने के लिए कैसे करें

वर्तमान में मेरी क्वेरी तालिका से सभी डेटा खींचती है और मुझे यह चाहिए कि जब आप डेटास्क्रोलर के अगले बटन पर क्लिक करें, तो यह अगले 20 पंक्तियों के लिए डीबी से पूछेगा।

मैं समझता हूं कि पंक्तियों को सीमित करने के लिए क्वेरी कैसे लिखनी है, लेकिन मुझे यकीन नहीं है कि एक विशिष्ट विधि को कॉल करने के लिए डेटास्क्रोलर का अगला बटन कैसे प्राप्त करें।

मुझे लगता है कि संभावित समाधान वाले Richfaces मंचों पर पोस्ट करने वाले बहुत से लोग हैं, लेकिन वे सभी डेटा मॉडल का उपयोग करते हैं। चूंकि मैं ओआरएम का उपयोग नहीं कर रहा हूं, इसलिए मुझे यकीन नहीं है कि मैं अपने समाधान के लिए इन समाधानों को कैसे फिट कर सकता हूं।

किसी भी मदद की सराहना की जाती है।

<rich:extendedDataTable id="resultsTable" value="#{tableBacking.results}" var="results" sortMode="single" rowKeyVar="row"> 
    <rich:columns value="#{tableBacking.columns == null ? '' : tableBacking.columns}" var="columns" index="ind" id="column#{ind}" sortBy="#{results[ind].data}" rendered="#{tableBacking.columns != null}"> 
     <f:facet name="header"> 
      <h:outputText value="#{columns.columnDescription}" /> 
     </f:facet> 

     <h:outputText value="#{results[ind].data}" /> 

    </rich:columns> 

</rich:extendedDataTable> 

<rich:datascroller for="resultsTable" page="#{tableBacking.page}" renderIfSinglePage="false" /> 

लिया जा रहा है सेम

public class TableBacking { 
    private List<List<TableData>> results = null; 
    private int page = 0; 

    public int getPage() { 
    return page; 
    } 
    public void setPage(int page) { 
    this.page = page; 
    } 
    public List<List<TableData>> getResults() throws Exception { 
    return results; 
    } 
    public void setResults(List<List<TableData>> results) { 
    this.results = results; 
    } 

    private void getData(String whereClause) { 

    try { 
    DataDao dd = new DataDao(); 
    results = dd.getData(); // dd.getData just runs a query on a table and puts the results in a List of lists. 
    } catch (Exception e) {} 
} 

उत्तर

0

आप अपने rich:extendedDataTable अपने समर्थन की फलियों में एक विशेषता के लिए बाध्य करने की जरूरत है।

जावा

private HtmlExtendedDataTable Table; 
//Getter and setter 

उसके बाद आप अपने दृश्य को बाँध

एक्सएचटीएमएल

<rich:extendedDataTable id="resultsTable" value="#{tableBacking.results}" var="results" sortMode="single" rowKeyVar="row" binding="#{tableBacking.Table}">

Richfaces HtmlExtendedDataTable कितने पंक्तियों प्रति पृष्ठ प्रदर्शित कर रहे हैं की जाँच करने के लिए एक विधि है ,कहा जाता है। जब बीन प्रारंभ होता है तो पहले पृष्ठ मानों को लोड करें, इसके अनुसार (आप केवल शेष पृष्ठों पर तत्वों के आईडी को लोड कर सकते हैं और बाद में जब आप पेज को एक्सेस करने जा रहे हैं तो उन्हें आईडी के आधार पर लोड करें)।

<rich:datascroller/> भी एक घटना है जो जब एक पृष्ठ बटन क्लिक किया जाता है और आप इस तरह से अपने समर्थन की फलियों से कि प्राप्त कर सकते हैं निकाल दिया जाता है:

एक्सएचटीएमएल

<f:facet name="footer"> 
<rich:datascroller id="ds" 
       scrollerListener="#{tableBacking.actionOnPageChange}" /> 
</f:facet> 

जावा

public String actionOnPageChange(DataScrollerEvent event)

यह DataScrollerEvent में उपयोगकर्ता द्वारा कौन सा पृष्ठ क्लिक किया गया है, जिसमें आप getNewScrolVal() का उपयोग कर सकते हैं। जब ऐसा होता है तो बस अपनी तालिका में संबंधित पृष्ठ के मान लोड करें और यही वह है।

+0

समस्या मैं इस समाधान के साथ आ रही हैं कि datascroller प्रस्तुत नहीं हो रही है क्योंकि मैं अपने DataTable पंक्तियों है 20 पर सेट करें और जब पृष्ठ लोड होता है, तो यह केवल 20 पंक्तियां प्राप्त करता है। क्या आप जानते हैं कि इस के आसपास कैसे जाना है? क्या डेटास्क्रॉलर को अधिकतम पंक्तियों को बताने का कोई तरीका है, इसलिए यह जानता है कि कितने पेज की गणना की जाती है? – Catfish

+0

मुझे यकीन नहीं है कि मैं समझता हूं कि "" आप केवल बाकी पृष्ठों पर तत्वों के आईडी को लोड कर सकते हैं और बाद में जब आप पेज को एक्सेस करने जा रहे हैं तो उन्हें आईडी ' – Catfish

+0

पर आधारित करें ने कहा कि आप एक ओआरएम का उपयोग नहीं कर रहे हैं। मैंने इस समाधान का उपयोग हाइबरनेट के साथ किया है, पूरे डेटा को लोड कर रहा है लेकिन आलसी लोडिंग में कुछ विशेषताओं, इसके साथ, जब मैं कुछ पेज का अनुरोध करता हूं तो मैं उन वस्तुओं को लोड कर सकता हूं और आलसी लोड अपवादों को रोक सकता हूं। आपके मामले में मुझे लगता है कि आप गैर-दृश्यमान पृष्ठों में * नकली * ऑब्जेक्ट्स (जिसमें केवल आईडी विशेषता असाइन की जाएगी) स्टोर कर सकते हैं। इसे कैसे प्राप्त करें? शुरुआत से पूरी आईडी सूची लोड हो रही है और केवल आवश्यकता होने पर सापेक्ष जानकारी लेना। मुझे नहीं पता कि आपका मॉडल कैसे काम करता है, मैं बस एक विचार देता हूं। –

2

कोशिश यह करने के लिए:

JSF सामग्री:

<rich:dataTable id="listTable" var="record" rows="10" value="#{personBean.data}"> 
    .... 
    <f:facet name="footer"> 
     <rich:column colspan="8"> 
     <rich:dataScroller page="#{personBean.page}" for="listTable" 
       scrollListener="#{personBean.scrollPage}" render="listTable" /> 
     </rich:column> 
     Records : #{personBean.data.size()} 
    </f:facet> 
</rich:dataTable> 

जावा BackBean सामग्री:

public class PersonBean { 
    // List of Persons 
    private PagedList<Person> data; 

    // Current page 
    private Integer page; 

    // Default rows to display 
    private Integer rows = 10; 

    // Persistence layer 
    private DaoService daoService; 

    @PostConstruct 
    public void init(){ 
     page= 1; 
    } 

    // Event trigger on scroll page 
    public void scrollPage(DataScrollEvent ev) { 
     log.debug("Scroll event"); 
     reset(); 

     // getPersons execute 2 queries : the first query is the count(*) and the result is set in TotalElements 
     // the second query gets the 'n' records defined in rows , something like this : 
     // select * from Persons LIMIT page*rows, (page*rows) + rows and the result is set in Content 
     Page<Person> pageResult = this.daoService.getPersons(filter, page - 1, rows); 

     // Now create a pagedList with the constructor 
     this.data = new PagedList<Person>(pageResult.getContent(), (int) pageResult.getTotalElements(), this.pageSize); 
    } 
} 

जावा PagedList

public final class PagedList<E> extends AbstractList<E> { 

    private final List<E> lista; 
    private final int total; 
    private final int pageSize; 

    public PagedList(List<E> lista, int total, int pageSize) { 
     this.lista = lista; 
     this.total = total; 
     this.pageSize = pageSize; 
    } 

    public int size() { 
     return total; 
    } 

    public E get(int i) { 
     i = i % this.pageSize; 
     return lista.get(i); 
    } 
} 

यह चाल डेटाबेस में dataTable की गिनती के साथ PagedList कक्षा की कुल संपत्ति सेट करने के लिए है और केवल PageList की सूची में पेज किए गए तत्व सेट करें।

के लिए मेरा बुरा अंग्रेजी क्षमा करें: पी

0

सबसे अच्छा समाधान मैंने पाया "मूल्य" एक org.richfaces.model.ExtendedTableDataModelproperty को DataTable की विशेषता मैपिंग कर रहा है। फिर आप org.richfaces.model.DataProvider के उदाहरण के साथ एक्सटेंडेडटेबलडेटा मॉडल को प्रारंभ करें। नमूना:

ध्यान में रखते हुए:

<rich:dataTable id="table" value="#{bean.model}" rows="#{bean.rows}"> 
    <!-- columns --> 
    <f:facet name="footer"> 
     <rich:dataScroller for="table"/> 
    </f:facet> 
</rich:dataTable> 

सेम में:

@ManagedBean 
public class Bean { 
    private int rows = 15; // the ammount of rows per page. 
    private org.richfaces.model.ExtendedTableDataModel model = new org.richfaces.model.ExtendedTableDataModel(
     new org.richfaces.model.DataProvider(
     public int getRowCount() { 
      // count your rows. 
     } 

     public List<T> getItemsByRange(int first, int quantity) { 
      // fetch the page's rows. 
     } 

     public T getItemByKey(Object o) { 
      return null; // no need to implement this. 
     } 

     public Object getKey(T t) { 
      return null; // no need to implement this. 
     ) 
    ); 

    public int getRows() { return rows; } 
    public ExtendedTableDataModel getModel() { return model; } 

}