2012-08-13 9 views
6

मुझे पता है कि यहां जेएसएफ पेजिनैटिन के बारे में बहुत सी पोस्ट हैं, लेकिन उनमें से कोई भी मुझे संतुष्ट नहीं करता है।जेएसएफ, रिचफेसेस, पेजिनेशन

पृष्ठों में बहुत बड़े डेटा को विभाजित करने के लिए मैं RichFaces डेटा स्क्रॉलर घटक का उपयोग करने जा रहा था।

यह इसके लिए उपयुक्त प्रतीत होता है, लेकिन ऐसा लगता है कि यह "कृत्रिम" अंकन करता है।

मुझे जो पसंद नहीं है वह यह है कि यह सभी डेटा लोड करता है और फिर केवल इसका हिस्सा प्रदर्शित करता है। कम से कम ऐसा लगता है। यदि मैं गलत हूं तो मुझे सही करों।

रिच चेहरे में अच्छे डेमो हैं, लेकिन किसी कारण से वे बीन परिभाषाओं को छोड़ते हैं- केवल xhtml। मैंने विस्तारितडेटा मॉडल का कुछ उल्लेख देखा, लेकिन मुझे मिला एकमात्र उदाहरण मुझे प्रभावित नहीं करता था। मुझे 5 स्क्रीन कोड होने का अनुमान है, बस डेटा का प्रदर्शन सबसेट करें?

ईमानदारी से जेएसएफ में अंकन के रूप में इतना सरल सवाल हुआ और मुझे वास्तव में क्यों नहीं मिलता है।

तो मेरी प्रश्न हैं: 1. Richfaces में सत्र के लिए भंडारण के बिना डेटा 2. का केवल एक पृष्ठ लोड करने (मेरा मतलब वास्तविक डेटा राज्य वर्तमान पृष्ठ की सूची नहीं, आदि) यह संभव है

मैं के रूप में पहले से ही केवल richfaces lib में दिलचस्पी रखता हूँ मेरी परियोजना में इसका इस्तेमाल करते हैं और जो किसी और चीज़

thanx पर निर्भरता की स्थिति नहीं करना अग्रिम

+0

यह एक दिलचस्प सवाल है लेकिन रिचफेस टीम द्वारा ही इसका उत्तर दिया जाना चाहिए। इसे [रिचफेस डेवलपर फोरम] (https://community.jboss.org/en/richfaces/dev?view=discussions) में पोस्ट करना अच्छा होगा। यदि आपको वहां एक संतोषजनक उत्तर मिलता है, तो इसे यहां पोस्ट करें और इसे उत्तर के रूप में चिह्नित करें। –

उत्तर

4

में RichFaces मंच पर बात करने के बाद आया यह निम्नलिखित समाधान (thanx ब्रेंडन हेली के लिए):

RichLazyDataModel.java

/** 
* Extended data model 
* @author Brendan Healey 
*/ 
public abstract class RichLazyDataModel<T> extends ExtendedDataModel<T> { 

private SequenceRange cachedRange; 
private Integer cachedRowCount; 
private List<T> cachedList; 
private Object rowKey; 

public abstract List<T> getDataList(int firstRow, int numRows); 
public abstract Object getKey(T t); 
public abstract int getTotalCount(); 

@Override 
public void walk(FacesContext ctx, DataVisitor dv, Range range, Object argument) { 

    SequenceRange sr = (SequenceRange) range; 

    if (cachedList == null || !equalRanges(cachedRange, sr)) { 
     cachedList = getDataList(sr.getFirstRow(), sr.getRows()); 
     cachedRange = sr; 
    } 

    for (T t : cachedList) { 
     if (getKey(t) == null) { 
      /* 
      * the 2nd param is used to build the client id of the table 
      * row, i.e. mytable:234:inputname, so don't let it be null. 
      */ 
      throw new IllegalStateException("found null key"); 
     } 
     dv.process(ctx, getKey(t), argument); 
    } 

} 


/* 
* The rowKey is the id from getKey, presumably obtained from 
* dv.process(...). 
*/ 
@Override 
public void setRowKey(Object rowKey) { 
    this.rowKey = rowKey; 
} 

@Override 
public Object getRowKey() { 
    return rowKey; 
} 

@Override 
public boolean isRowAvailable() { 
    return (getRowData() != null); 
} 

@Override 
public int getRowCount() { 
    if (cachedRowCount == null) { 
     cachedRowCount = getTotalCount(); 
    } 
    return cachedRowCount; 
} 

@Override 
public T getRowData() { 
    for (T t : cachedList) { 
     if (getKey(t).equals(this.getRowKey())) { 
      return t; 
     } 
    } 
    return null; 
} 

protected static boolean equalRanges(SequenceRange range1, SequenceRange range2) { 
    if (range1 == null || range2 == null) { 
     return range1 == null && range2 == null; 
    } else { 
     return range1.getFirstRow() == range2.getFirstRow() && range1.getRows() == range2.getRows(); 
    } 
} 



/* 
* get/setRowIndex are used when doing multiple select in an 
* extendedDataTable, apparently. Not tested. Actually, the get method is 
* used when using iterationStatusVar="it" & #{it.index}. 
*/ 
@Override 
public int getRowIndex() { 
    if (cachedList != null) { 
     ListIterator<T> it = cachedList.listIterator(); 
     while (it.hasNext()) { 
      T t = it.next(); 
      if (getKey(t).equals(this.getRowKey())) { 
       return it.previousIndex() + cachedRange.getFirstRow(); 
      } 
     } 
    } 
    return -1; 
} 

@Override 
public void setRowIndex(int rowIndex) { 
    int upperBound = cachedRange.getFirstRow() + cachedRange.getRows(); 
    if (rowIndex >= cachedRange.getFirstRow() && rowIndex < upperBound) { 
     int index = rowIndex % cachedRange.getRows(); 
     T t = cachedList.get(index); 
     setRowKey(getKey(t)); 
    } 
} 

@Override 
public Object getWrappedData() { 
    throw new UnsupportedOperationException("Not supported yet."); 
} 

@Override 
public void setWrappedData(Object data) { 
    throw new UnsupportedOperationException("Not supported yet."); 

} 

public List<T> getCachedList() { 
    return cachedList; 
} 

}

ListState.java

/** 
* Holds list state 
*/ 
public class ListState implements Serializable { 

private int page; 

private Map<String, Serializable> searchCriteria = new HashMap<String, Serializable>(); 

public int getPage() { 
    return page; 
} 

public void setPage(int page) { 
    this.page = page; 
} 

public Map<String,Serializable> getSearchCriteria() { 
    return searchCriteria; 
} 

}

CardsBean.java

@ManagedBean(name="cardsBean") 
public class CardsBean { 

@ManagedProperty("#{cardService}") 
private CardService cardService; 

private ListState state; 

private RichLazyDataModel<Card> cardsModel = new RichLazyDataModel<Card>() { 
    @Override 
    public List<Card> getDataList(int firstRow, int numRows) { 
     MyUserDetails user = SecurityUtils.getCurrentUser(); 
     return cardService.findUserCards(user.getUser(), firstRow, numRows, state.getSearchCriteria()); 
    } 

    @Override 
    public Object getKey(Card card) { 
     return card.getId(); 
    } 

    @Override 
    public int getTotalCount() { 
     MyUserDetails user = SecurityUtils.getCurrentUser(); 
     return cardService.countUserCards(user.getUser(), state.getSearchCriteria()); 
    } 
}; 


public RichLazyDataModel<Card> getCards() { 
    return cardsModel; 
} 

public String getSearchString() { 
    return (String)state.getSearchCriteria().get("searchString"); 
} 

public int getCurrentPage() { 
    return state.getPage(); 
} 

public void setCurrentPage(int page) { 
    state.setPage(page); 
} 

public void setSearchString(String searchString) { 
    state.getSearchCriteria().put("searchString", searchString); 
} 

public void setCardService(CardService cardService) { 
    this.cardService = cardService; 
} 

public boolean isPinned() { 
    return Boolean.TRUE.equals(state.getSearchCriteria().get("pinned")); 
} 

public void setPinned(boolean pinned) { 
    state.getSearchCriteria().put("pinned", pinned); 
} 

public void togglePinned() { 
    setPinned(!isPinned()); 
} 

@PostConstruct 
public void init() { 
    state = getFromSession("cardsList", null); 
    if (state == null) { 
     state = new ListState(); 
     storeInSession("cardsList", state); 
    } 
} 

public <T extends Serializable> T getFromSession(String name, T defaultValue) { 
    T ret = (T) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(name); 
    if (ret == null) { 
     ret = defaultValue; 
    } 
    return ret; 
} 

public void storeInSession(String name, Serializable obj) { 
    FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(name, obj); 
} 
} 

कार्ड.एक्सएचटीएमएल (आंशिक)

... 

<h:form> 

    <rich:dataGrid value="#{cardsBean.cards}" var="card" columns="2" elements="20" first="#{cardsBean.currentPage}" style="margin:0 auto;width:70em" id="cardsTable"> 
     <f:facet name="header"> 
      <h:inputText value="#{cardsBean.searchString}"> 
       <a4j:ajax event="keyup" render="[email protected], [email protected]"> 
       <a4j:attachQueue requestDelay="700" ignoreDupResponses="true" /> 
       </a4j:ajax> 

      </h:inputText> 
     </f:facet> 

     <rich:panel id="cd"> 
      <ui:include src="WEB-INF/parts/card.xhtml"> 
       <ui:param name="card" value="#{card}"/> 
      </ui:include> 


     </rich:panel> 

     <f:facet name="footer"> 
      <rich:dataScroller page="#{cardsBean.currentPage}" /> 
     </f:facet> 

    </rich:dataGrid> 

    </h:form> 
... 
+0

क्या आप मंच पर अपने विचलन का संदर्भ नहीं दे सकते? धन्यवाद। –

+0

https://developer.jboss.org/thread/204005?tstart=0 मूल विषय मिला। – Century