Альтернатива Vaadin для сильно загруженного интерфейса - PullRequest
6 голосов
/ 05 января 2012

В настоящее время я программирую веб-приложение на основе Vaadin . Я очень доволен циклом обучения и тем, как легко можно создать пользовательский интерфейс.

В целом плюсы Vaadin:

  • «Нативное» программирование пользовательского интерфейса для пользователей Java (иерархия компонентов / прослушиватели событий / перетаскивание и удаление / проверка).
  • Отличная коллекция компонентов (дерево / таблица / список / ...).

Минусы:

  • Большой и сложный вывод HTML. Это замедляет время отклика браузера (также упоминается здесь и там ) и приводит к некоторым особенностям рендеринга от браузера к браузеру.
  • Сложности в обработке большого количества компонентов (см. Может ли CustomLayout обрабатывать 5000 компонентов? ).
  • Необходимость перекомпиляции набора виджетов при использовании сторонних компонентов.

Мой вопрос к сообществу:

Какой веб-фреймворк наилучшим образом соответствует следующим требованиям :

  • Разделение презентации с обработчиками событий / действий.
  • Общие компоненты из коробки (с расширенными функциями, такими как перетаскивание столбцов таблицы, отложенная загрузка).
  • Поддержка макетов (без головной боли с заполнением и выравниванием компонентов).
  • Распространение событий на сервер и обработка событий на стороне сервера.
  • Возможность генерировать ваш HTML (если фреймворк не основан на HTML), а также записывать события для него (например, щелчки мышью).
  • Возможность зарегистрировать обратные вызовы при нажатии клавиш (например, Ctrl-S) является плюсом.
  • Краткий курс обучения для Java-разработчиков - плюс.

Также подойдет разумное сочетание подходов. Пожалуйста, предоставьте ссылку на приложение «Hello World», реализованное на основе предложенной вами платформы. Я рассматриваю Apache Wicket / Echo2 / Гобелен / Нажмите / GWT , но трудно сделать выбор без игры в течение пары месяцев (надеюсь, без глубокого разочарования).

Ответы [ 3 ]

3 голосов
/ 06 января 2012

Вы можете использовать Vaadin Table для решения исходной проблемы, более или менее подобной этой. Хитрость заключается в том, чтобы создать контейнер Vaadin и поместить в него компоненты как данные. На стороне текста оберните метку в VerticalLayout, затем добавьте прослушиватель щелчков. Это дает возможность отображать «абзацы» текста XHTML, обнаруживать клики по ним с относительным местоположением и при этом иметь возможность обрабатывать большое количество абзацев.

Возможно, вам потребуется изменить файл styles.css, чтобы разрешить перенос текста в строку таблицы, чтобы получить неровные строки.

package com.soletta.clickytable;

import com.vaadin.Application;
import com.vaadin.data.util.IndexedContainer;
import com.vaadin.event.LayoutEvents.LayoutClickEvent;
import com.vaadin.event.LayoutEvents.LayoutClickListener;
import com.vaadin.terminal.Sizeable;
import com.vaadin.terminal.gwt.server.WebApplicationContext;
import com.vaadin.ui.Button;
import com.vaadin.ui.Label;
import com.vaadin.ui.Table;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;
import com.vaadin.ui.Window.CloseEvent;
import com.vaadin.ui.Window.CloseListener;

public class ClickytableApplication extends Application {
    @Override
    public void init() {
        Window mainWindow = new Window("Clickytable 2 Application");
        setMainWindow(mainWindow);
        mainWindow.addListener(new CloseListener(){
            public void windowClose(CloseEvent e) {
                WebApplicationContext context = (WebApplicationContext) getContext();
                context.getHttpSession().invalidate();
                close();
            }});

        IndexedContainer container = new IndexedContainer();
        container.addContainerProperty("text", VerticalLayout.class, new VerticalLayout());
        container.addContainerProperty("edit", Button.class, new Button("Edit"));

        for (int i = 0; i < 10; i++) {
            final int index = i;
            Object item = container.addItem();
            Label lbl = new Label("Text Content " + i);
            VerticalLayout vl = new VerticalLayout();
            vl.setWidth(100, Sizeable.UNITS_PERCENTAGE);
            vl.addComponent(lbl);
            vl.addListener(new LayoutClickListener() {
                public void layoutClick(LayoutClickEvent event) {
                    System.out.println(String.format("Clicked on text %,d at client(%,d,%,d), relative(%,d %,d)\n", index, event.getClientX(), event.getClientY(), event.getRelativeX(), event.getRelativeY()));
                }
            });

            container.getItem(item).getItemProperty("text").setValue(vl);
            container.getItem(item).getItemProperty("edit").setValue(new Button("Button " + i));
        }

        Table table = new Table("ClickyTable 2", container);
        table.setColumnExpandRatio("text", 1);
                table.setColumnExpandRatio("edit", 0);
        table.setSizeFull();

        VerticalLayout fl = new VerticalLayout();
        fl.setSizeFull();
        fl.addComponent(table);

        mainWindow.setContent(fl);
    }
}

С некоторыми изменениями стиля результат может выглядеть примерно так:

Снимок экрана ClickTable http://www.soletta.com/images/ClickyTable.PNG

3 голосов
/ 05 января 2012

Я полностью согласен со всеми упомянутыми вами минусами и не могу особо сказать против.Поскольку я довольно новичок в GWT, я могу поделиться своим небольшим опытом, который я получил за последние 2 месяца.

  • Разделение презентации с обработчиками событий / действий.

Я думаю, что UiBinder с аннотацией @UiHandler ("closeButton") @UiField в GWT 2.0 и более поздних версиях предназначен именно для разделения кода формы HTML и обработчиков.Также шаблон MVP с шиной событий - отличный ответ от команды GWT.

  • Короткая кривая обучения для Java-разработчика является плюсом.

Я не наивен и не думаю, что возможно получитькачественный результат только со знанием Java без понимания WEB-технологий.

Большинство каркасов пользовательского интерфейса GWT, о которых я читал и читал, создают больше проблем, чем решений.Они каким-то образом управляют одним или несколькими преимуществами и ограничивают вас от других функций, которые появятся в новых выпусках GWT.Я решил не использовать vaadin, потому что чувствовал, что это заставит меня заниматься разработкой веб-приложений по-своему, что, я согласен, быстро легко понять, но каким-то образом ограничено.Мне нравится иметь некоторую свободу, выбирая классический GWT без причудливого управления.

Также я чувствую, что компоненты пользовательского интерфейса GWT ограничены и качественных альтернатив нет.Что-то здесь не так.Я думаю, что команда Google должна сделать что-то в этой части.

С уважением RemisB

1 голос
/ 07 января 2012

Если вы когда-нибудь разместите сотни компонентов на веб-странице в Vaadin, вам, вероятно, следует пересмотреть структуру своего приложения.Почему бы не реализовать пользовательский виджет для той части интерфейса, которая требует такого огромного количества виджетов?Это просто GWT и, следовательно, довольно легко.Тогда вы сможете получить лучшее из обоих миров - простоту Vaadin с полным контролем над HTML5 на стороне клиента.

...