com*_*ses 0 gwt rpc asynchronous arraylist callback
我正在尝试为我的进一步工作制作示例代码.我正在使用gwt vanillia和新的gwt.我的目的是填充一些文本框和网格.从数据库填充文本框,rpc调用没问题.但我不能通过使用RPC调用填充datagrid.我使用Bastian Tenbergen的教程 来填充一些文本框.但是当我尝试使用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;
}
Run Code Online (Sandbox Code Playgroud)
在客户端包中: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);
}}
Run Code Online (Sandbox Code Playgroud)
在客户端包中:DBConnection.java
public interface DBConnection extends RemoteService {
public ArrayList<hastaGrid> callGrid(String name); }
Run Code Online (Sandbox Code Playgroud)
在客户端包中:DBConnectionAsync.java
public interface DBConnectionAsync {
public void callGrid(String name, AsyncCallback<ArrayList<hastaGrid>> callback); }
Run Code Online (Sandbox Code Playgroud)
在客户端包中: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.
Run Code Online (Sandbox Code Playgroud)
我在网上阅读了很多页面,但找不到具体的解决方案.我错了.谢谢你的回复.
首先,你应该确保你的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;
}
}
Run Code Online (Sandbox Code Playgroud)
在您的DataGrid初始化代码中,您放置:
MyProvider pr = new MyProvider();
pr.addDataDisplay(yourDataGrid);
Run Code Online (Sandbox Code Playgroud)
如果您还添加了寻呼机,则此方法效果最佳,因为数据提供者会侦听通过单击寻呼机触发的范围更改.
SimplePager pager = new SimplePager();
pager.setDisplay(yourDataGrid);
//don't forget to add the pager widget to the DOM
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助!