2012-08-13 5 views
6

여기 JSF 페이지 매김에 관한 많은 게시물이 있지만 그 중 누구도 나를 만족시키지 못했습니다.JSF, RichFaces, 페이지 매김

꽤 큰 데이터를 페이지로 분할하기 위해 RichFaces Data 스크롤러 구성 요소를 사용하려고했습니다.

그게 적합하다고 보였지만 "인공적인"페이지 매김처럼 보입니다.

내가 좋아하는 것은 모든 데이터를로드 한 다음 일부만 표시한다는 것입니다. 적어도 그렇게하는 것처럼 보입니다. 틀 렸으면 고쳐줘.

풍부한 얼굴에는 멋진 데모가 있지만 몇 가지 이유로 그들은 bean 정의 - xhtml 만 건너 뜁니다. ExtendedDataModel에 대한 언급을 보았지만 발견 한 유일한 예는 저에게 깊은 인상을 남기지 않았습니다. 왜 화면 코드 5 개를 사용하여 데이터의 하위 집합을 표시해야합니까?

정직하게 JSF에서 페이지 매김과 같은 간단한 질문이 매우 복잡해졌으며 실제로 그 이유를 알지 못합니다.

그래서 제 질문은 다음과 같습니다 1. Richfaces에서 (나는 등, 실제 데이터는 상태 - 현재 페이지를 나열하지 의미) 세션에 저장하지 않고 데이터 2의 한 페이지를로드 할 수

나는 이미에만 richfaces의 lib에 관심이 내 프로젝트에서 사용하고 richFaces 포럼에 이야기 한 후 사전

+0

이것은 흥미로운 질문이지만 RichFaces 팀 자체에서 대답해야합니다. [RichFaces 개발자 포럼] (https://community.jboss.org/ko/richfaces/dev?view=discussions)에 게시하는 것이 좋습니다. 거기에 만족스러운 대답이 있으면 여기에 게시하고 답변으로 표시하십시오. –

답변

4

에 다른 뭔가

고맙습니다에 대한 의존성을 어떻게 소개하지 않는이 솔루션은 다음 (고맙습니다 등장 Brendan Healey에게) :

,515,

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

cards.xhtml (부분)

... 

<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

포럼에서 귀하의 discusiion에 대한 언급을 할 수 없었습니까? 고맙습니다. –

+0

https://developer.jboss.org/thread/204005?tstart=0 원본 주제가 발견되었습니다. – Century

관련 문제