2012-03-20 71 views
0

我想爲我的進一步工作做一個示例代碼。我使用gwt vanillia和gwt新的。我的目的是填充一些文本框和網格。用於從數據庫填充文本框,rpc調用沒有問題。但我不能通過使用RPC調用填充數據網格。我使用Bastian Tenbergen's tutorial 來填充一些文本框。但是當我試圖使用ArrayList填充異步回調的網格時,代碼失敗。我知道ArrayList也是可序列化的,但我無法解決問題。 任何意見表示讚賞。 這是我的questin的一些代碼。 在服務器軟件包:SqlDbConnection.javagwt與ArrayList asyncCallback <SomeClass>失敗時檢索數據

public ArrayList<hastaGrid> callGrid(String something){ 
    ArrayList<hastaGrid> list = new ArrayList<hastaGrid>(); 
    hastagrid hastaGrid = null;  
    try { 
     Statement st = conn.createStatement(); 
     ResultSet result = st.executeQuery("select name from TEST where name = '"+ something +"'"); 

     while(result.next()) { 
      hastagrid = new hastaGrid(result.getString(1), result.getString(2),result.getNString(2),result.getString(3)); 
      list.add(hastaGrid); 
      System.out.println("result: " +hastagrid.getLogin().toString()+" " + hastagrid.getPassword() +" "+ hastagrid.getName() +" " + hastagrid.getSurname()); 
     } 
     result.close(); 
     st.close();     
    } catch (Exception e) { 
     e.printStackTrace(); 
    }  
    return list; 
} 

在客戶包:hastaGrid.java //類也有getter和setter方法。

public class hastaGrid implements IsSerializable { 

private String name; 
private String surname; 
private String login; 
private String password; 

public hastaGrid(String name,String surname, String login, String password){ 
    this.setName(name); 
    this.setSurname(surname); 
    this.setLogin(login); 
    this.setPassword(password); 
}} 

在客戶包:DBConnection.java

public interface DBConnection extends RemoteService { 
public ArrayList<hastaGrid> callGrid(String name); } 

在客戶包:DBConnectionAsync.java

public interface DBConnectionAsync {  
public void callGrid(String name, AsyncCallback<ArrayList<hastaGrid>> callback); } 

在客戶包:userDetail.java

onModuleLoad(){ AsyncCallback> callback = new AuthenticationHandler1(); rpc.gridGetir(「John」,callback); }

private class AuthenticationHandler<T> implements AsyncCallback<ArrayList<hastaGrid>> { 
    public void onFailure(Throwable ex) { 
    RootPanel.get().add(new HTML("RPC call failed")); 
    } 
    public void onSuccess(ArrayList<hastaGrid> result) {   
    result.get(0).getName(); } } // I just want to reach some result here when debugging. 

我在網上看了很多頁面,但找不到具體的解決方案。我可能是錯的。感謝您的回覆。

回答

5

首先,你應該確保你的RPC返回hastaGrid對象的適當列表 - 並且請不要大寫類名:) 我使用AsyncDataProvider模型頗多各種DataGrid實現,有點創建一個實現類,如以下:

public class MyProvider extends AsyncDataProvider<MyModelObject> implements AsyncCallback<List<MyModelObject>> { 
    static int PAGESIZE = 50; 
    List<MyModelObject> cache = new ArrayList<MyModelObject>(); 

    @Override 
    protected void onRangeChanged(HasData<MyModelObject> display) { 
     final Range range = display.getVisibleRange();   
     int start = range.getStart(); 
     int end = start + range.getLength(); 
     if (start >= cache.size() - 1) { 
      lastVisible = cache.size() - 1; 
      gwtService.fetchRowsFromDbase(this);     
      return; 
     } 
     List<MyModelObject> dataInRange = cache.isEmpty() ? new ArrayList<MyModelObject>() : cache.subList(start, 
       end >= cache.size() ? (cache.size()) : end); 
     updateRowData(start, dataInRange); 
    } 

    public void onFailure(Throwable caught) { 
     Window.alert(caught.getMessage()); 
    } 

    public void onSuccess(List<MyModelObject> result) { 
     if (result.isEmpty()) { 
      //display a warning 
      return; 
     } 
     for (MyModelObject a : result) { 
      if (cache.indexOf(a) == -1) 
       cache.add(a); 
     } 
     updateRowData(cache.indexOf(result.get(0)), result); 
     updateRowCount(cache.size(), result.size() < PAGESIZE); 
     tab.setPageSize(PAGESIZE); 
     tab.setPageStart(lastVisible); 
     MyModelObject last = cache.get(cache.size() - 1); 
     orderOffset = last.getId();   
    } 

    public List<MyModelObject> getCache() { 
     return cache; 
    } 
} 

在你的DataGrid initalization代碼,你把:

MyProvider pr = new MyProvider(); 
pr.addDataDisplay(yourDataGrid); 

這種方法效果最好,如果您還添加了一個尋呼機,BEC ause數據提供者監聽範圍變化,通過點擊尋呼機觸發。

SimplePager pager = new SimplePager(); 
pager.setDisplay(yourDataGrid); 
//don't forget to add the pager widget to the DOM 

希望這有助於!

+1

感謝您的建議。我只是照你所說的去做了。然後volia ..也感謝代碼示例。我會盡力實施這種方式。而對於類名,我同意你:) – comitatenses 2012-03-20 10:01:46

+0

@Jasper變量orderOffset的用法是什麼? – Prince 2013-05-09 16:32:56

+0

orderOffset是我從這個例子中得到這個例子的類中的一個字段,只是爲了跟蹤最後獲取的Id。 – 2013-05-10 12:58:03