在页面加载时动态加载ListBox内容

时间:2014-05-02 11:51:49

标签: gwt listbox

我目前正致力于一个简单的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是相关的。

2 个答案:

答案 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)

通常的程序如下:

  1. 为要在客户端和服务器之间传输的数据创建bean类。我们称之为MyBean
  2. MyBean放入项目的shared包中。
  3. 此类必须实现SerializableIsSerializable,否则GWT会抱怨它不知道如何传输它。
  4. 创建包含您要用于从服务器传输RemoteService的方法的MyBean
  5. 使用AsyncCallbackRemoteService在客户端上获取数据后,请使用您的bean填充ListBox,例如致电MyBean#getName()MyBean#toString()
  6. 成功!