2011-03-31 4 views
0

데이터베이스 테이블에 바인드 된 데이터 테이블이 있습니다. 각 행에서 현재 행 ID를 기반으로 다른 테이블의 데이터를 표시하려고합니다 (그럴 것입니다). 어떻게해야합니까? 예를 들어 사용자의 테이블이있는 경우 각 테이블 행에 모든 사용자 그룹을 표시하고 싶습니다. 각 테이블 행에서 호출되는 메서드를 만들려면 어떻게해야합니까?다른 DB 테이블의 데이터를 h : JSF의 dataTable에 표시하는 방법은 무엇입니까?

+0

실제로 "commandLink"에서 "action"과 같은 것을 찾으려고합니다. 각 행마다 작업이 필요하므로 내 자신의 사용자 지정 열 데이터를 표시 할 수 있습니다. – wasimbhalli

답변

0

처음부터 필요한 모든 데이터를 자신의 데이터 모델에로드하거나 자신의 목록을 구현하여 데이터 테이블에 사용할 수 있습니다. List는 기준에 따라 행 데이터를로드 할 수 있습니다. 예 :

public class MyList extends AbstractList<MyPageEntry> { 
    public static Logger log = Logger.getLogger(MyList.class.getName()); 

    private int total = 0; 
    private int pageSize = 100; 

    private int pageNumber = 0; 
    private List<MyPage> pages = new ArrayList<MyPage>(); 
    private final DBConnection connection; 

    public PageableDebugList(SpiderConnection connection, String sourcename, String debugFilterValue) { 
     super(); 
     this.connection = connection; 
     fetchPage(0); 
    } 

    private synchronized void fetchPage(int pageNumber) { 
     int start = pageNumber * pageSize; 
     try { 
          // possibly add other criteria here 
      MyPage page = connection.getPage(start, pageSize,...); 
      while (pages.size() < pageNumber + 1) { 
       pages.add(null); 
      } 
      pages.set(pageNumber, page); 

      total = page.getTotalSize();  

      if (false) { 
       preFetchNext(pageNumber + 1, 1); 
      } 
      log.fine(page.getSize() + " " + total); 
     } catch (Exception ex) { 
      log.warning("Error fetching page - " + ex); 
     } 
    } 

    public void reset() { 
     pages = new ArrayList<Page>(); 
    } 

    private boolean hasPage() { 
     return pages.size() >= pageNumber + 1 && pages.get(pageNumber) != null; 
    } 

    public boolean isRowAvailable(int rowIndex) { 
     if (!hasPage()) 
      return false; 
     if (total > rowIndex && rowIndex >= 0) 
      return true; 
     else 
      return false; 
    } 

    @Override 
    public synchronized MyPageEntry get(int index) { 
     pageNumber = index/pageSize; 
     if (!hasPage()) { 
      try { 
       fetchPage(Math.abs(pageNumber)); 
      } catch (Exception e) { 
       log.warning(e.toString()); 
      } 
     } 
     int localIndex = index % pageSize; 
     if (isRowAvailable(index)) { 
      List<PageEntry> resultList = pages.get(pageNumber).getEntries(); 
      if (localIndex < resultList.size()) { 
       MyPageEntry result = resultList.get(localIndex); 
       return result; 
      } else { 
       return null; 
      } 
     } else { 
      return null; 
     } 
    } 

    @Override 
    public int size() { 
     return total; 
    } 

    private void preFetchNext(final int start, final int count) { 
     Thread t = new Thread() { 
      @Override 
       public void run() { 
       for (int i = start; i < start + count; i++) { 
        try { 
         sleep(1000); 
        } catch (InterruptedException e) { 
         log.warning(e.toString()); 
        }  

        try { 
         fetchPage(i); 
        } catch (Exception e) { 
         log.warning(e.toString()); 
        } 
       } 
      } 
     }; 
    } 

    public int getPageNumber() { 
     return pageNumber; 
    } 

    public List<DebugLinkPage> getPages() { 
     return pages; 
    } 

    public void setPageSize(int pageSize) { 
     this.pageSize = pageSize; 
    } 

    public int getPageSize() { 
     return pageSize; 
    } 

} 

이 경우 한 번에 전체 페이지가로드됩니다. 그러나 get() 메소드에서도 가져 오기를 수행하고 액세스 할 때 각 행을로드 할 수 있습니다.

관련 문제