Как реализовать ленивый список с помощью SmartGWT и SQL

Весь вчерашний день я пытался интегрировать базу данных SQL с SmartGWT для ленивого списка, но я просто не мог понять, как это реализовать. (JavaDoc и пример ленивого списка)

Что я хочу сделать, так это создать список из множества «сайтов» по ​​всему миру. Проблема в том, что их, вероятно, будет около миллиона, поэтому я пытаюсь загрузить как можно меньше за раз. У каждого сайта в моей БД есть адрес, поэтому я пытаюсь отсортировать их в древовидной структуре, например (Страна-> Штат-> Город-> Сайты). Каждый раз, когда вы спускаетесь на уровень ниже, в БД будет запрашиваться весь следующий уровень (будь то все города, в которых есть сайты в выбранном штате, или что-то еще).

Любая помощь приветствуется.

ТАКЖЕ: в примере связанные папки и листья являются типом элемента, есть ли способ сохранить папки, папки, а затем листья как отдельный тип объекта?


person Eric Koslow    schedule 14.07.2009    source источник


Ответы (2)


Через некоторое время я, наконец, понял. В итоге я создал свой собственный RPC, который будет обслуживать массив строк, представляющих имена всех TreeNodes для следующего уровня.

Таким образом, точка входа будет:

private NodeServiceAsync nodesRpc; //The RPC that grabs more nodes
private Tree data; //The data structure to hold all of the nodes
private ColumnTree list; //The GUI element that is shown on in the browser
public void onModuleLoad() {
    nodesRpc = (NodeServiceAsync) GWT.create(NodeService.class);
    data = new Tree();
    list = new ColumnTree;

    list.setAutoFetchData(true);
    list.setLoadDataOnDemand(true);

    list.addNodeSelectedHandler(new NodeSelectedHandler () {
        public void onNodeSelected(NodeSelectedEvent event) {
            if(/*Node is folder and hasn't been opened before*/) {
                //Get More Nodes        
                AsyncCallback<String[]> callback = new NodeGetter<String[]>();
                nodesRpc.getData(event.getNode(), callback);
            }

            else if(/*Node is not a folder (at the end) */) {
                //Do something else
            }   
        }
    });
    list.setData(data); //Make the GUI Element Represent The Data Structure
    RootPanel.get().add(list); //Add to screen
}

Серверлет на стороне сервера создает запрос, выполняет, затем переводит ResultSet в массив строк и передает его обратно. Все, что нужно сделать обратному вызову на стороне клиента, — это преобразовать этот массив в массив узлов дерева и присоединить их к исходному узлу, на который был сделан щелчок. Наконец, после всего этого элемент GUI перерисовывается с новыми узлами.

Я был удивлен, что между загрузками узлов было очень мало времени простоя (менее 1 секунды), даже когда иногда отображалось около сотни узлов, которые запрашивались.

person Eric Koslow    schedule 15.07.2009

Обратите внимание, что существует также Pro-версия продукта, которая включает подобное подключение к SQL из коробки (для серверных платформ Java). Витрина здесь:

http://www.smartclient.com/smartgwtee/showcase/

Коннектор SQL в продукте Pro включает в себя загрузку по запросу/разбиение по страницам данных, поиск и все 4 операции CRUD, а также мастеров DataSource, которые могут генерировать работающий SQL DataSource для существующей таблицы базы данных, если вы просто введете настройки JDBC.

Обратите внимание, что для продукта Pro не требуется SQL, это лишь одна из вещей, к которым он может подключаться.

person Charles Kendrick    schedule 24.11.2009