我目前正致力于一个简单的GWT项目。我想做的一件事是,当页面加载时,我可以根据某些标准动态填充ListBox的内容。我实际上没有看到ListBox的任何处理程序来处理初始渲染事件,但我看到了更改处理程序。
如何使用GWT在pageload上使用服务器端的数据填充ListBox内容?
现在我有一个实现具有
的EntryPoint的类final ListBox fooList = new ListBox();
我也有一组bean但我也有一个实现RemoteService的类。因为我似乎无法直接在EntryPoint中直接调用我的用户定义的包(这是有意义的)如何在初始页面加载时使用服务器端内容填充ListBox?现在我正在使用List但我想如果我不能让它工作我可以得到一个DB工作...
我在EntryPoint中尝试过像:
for (String name : FOOS) {
fooList.addItem(name, name);
}
然而,FOOS将来自服务器端数据,并且EntryPoint应该更大程度上限于可以编译为JS的内容!我无法在该方面识别用户定义的类,因为该字符串是一组用户定义的类的结果。
我还尝试在实现RemoteService的类中创建一个返回ListBox的方法。当我试图调用这个方法时,这也没有编译。也许我不完全了解如何在实现类的RemoteService服务中调用方法。
我经常搜索,但我无法找到能够清楚解释基本原理的任何内容。我的背景是更多的ASP.NET和JSP,所以也许我错过了一些东西。
我使用GWT 2.6是相关的。
答案 0 :(得分:1)
我将我的示例基于GWT示例项目(我将其命名为示例),只需替换类,它应该可以工作:
public class Example implements EntryPoint {
/**
* Create a remote service proxy to talk to the server-side Greeting
* service.
*/
private final GreetingServiceAsync greetingService = GWT
.create(GreetingService.class);
/**
* This is the entry point method.
*/
public void onModuleLoad() {
final ListBox listBox = new ListBox();
RootPanel.get("sendButtonContainer").add(listBox);
greetingService.getSomeEntries(new AsyncCallback<String[]>() {
@Override
public void onSuccess(String[] result) {
for (int i = 0; i < result.length; i++) {
listBox.addItem(result[i]);
}
}
@Override
public void onFailure(Throwable caught) {
}
});
}
}
这是我们的EntryPoint,它创建一个列表框并使用AsyncCallback调用服务器以获取一些动态数据。如果调用成功(onSuccess),则数据将写入列表框。
GreetingService接口定义了同步方法,它在GreetingServiceImpl类中实现:
@RemoteServiceRelativePath("greet")
public interface GreetingService extends RemoteService {
String[] getSomeEntries() ;
}
异步对应的是GreetingServiceAsync接口,我们之前使用它来调用服务器:
public interface GreetingServiceAsync {
void getSomeEntries(AsyncCallback<String[]> callback) ;
}
GreetingServiceImpl类位于服务器上。在这里你可以调用一个数据库:
@SuppressWarnings("serial")
public class GreetingServiceImpl extends RemoteServiceServlet implements
GreetingService {
@Override
public String[] getSomeEntries() {
String[] entries = { "Entry 1","Entry 2","Entry 3" };
return entries;
}
}
现在,如果要在服务器和客户端之间使用一些Bean / Pojo,请将每个类/接口中的String []替换为对象名称,将该类放在共享包中,并认为它实现了Serializable / IsSerializable。
答案 1 :(得分:1)
通常的程序如下:
MyBean
。MyBean
放入项目的shared
包中。Serializable
或IsSerializable
,否则GWT会抱怨它不知道如何传输它。RemoteService
的方法的MyBean
。AsyncCallback
和RemoteService
在客户端上获取数据后,请使用您的bean填充ListBox
,例如致电MyBean#getName()
或MyBean#toString()
。