gwt asyncCallback с ArrayList <SomeClass>завершается неудачно при получении данных - PullRequest
0 голосов
/ 20 марта 2012

Я пытаюсь создать пример кода для моей дальнейшей работы. Я использую gwt vanillia и новичок в gwt. Моя цель состоит в том, чтобы заполнить некоторые текстовые поля и сетку. для заполнения текстовых полей из базы данных, нет проблем с вызовом RPC. Но я не мог заполнить сетку данных с помощью вызова RPC. Я использовал учебник Бастиана Тенбергена для заполнения некоторых текстовых полей. Но когда я попытался заполнить сетку асинхронным обратным вызовом, используя ArrayList, код не удался. Я знаю, что ArrayList также сериализуем, но я не могу решить проблему. Любой совет приветствуется. Вот код для моего квеста. В пакете сервера: SqlDbConnection.java

    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 ( "Джон", обратный вызов); }

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.

Я читаю много страниц в Интернете, но не могу найти конкретного решения. Я могу ошибаться. Спасибо за ответы.

1 Ответ

5 голосов
/ 20 марта 2012

Сначала вы должны убедиться, что ваш 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, который вы указали:

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

Этот подход работает лучше всего, если вы также добавляете пейджер, потому что поставщик данных прослушивает изменения диапазона, вызванныенажав на пейджер.

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

Надеюсь, это поможет!

...