GWT или нет для корпоративных приложений

Я работаю над инструментом для создания приложений уровня предприятия на движке приложений. Это должно быть кросс-браузерным (включая IE8), работать на мобильных устройствах, а в более поздний момент времени также поддерживать настольные клиенты через (Qt4/GTK/и т. д.)

Проблема, с которой я постоянно сталкиваюсь, заключается в следующем: для моего веб-приложения следует ли мне использовать GWT (GoogleWebToolkit) или нет?

Я довольно хорошо использую «EXT-JS», но это не мой выбор из-за его политики открытого исходного кода. Существует еще один фреймворк «SmartClient», который имеет лучшую лицензию с открытым исходным кодом — он довольно зрелый и лучше, чем EXT-JS (на основе некоторых POC), но его документация — отстой! Мне нужно много времени, чтобы сделать что-то правильно. SmartClient и EXT-JS довольно хороши для приложений корпоративного уровня (при правильном использовании) — я испытал это с Ext-JS и очень уверен, что и со SmartClient.

Тогда есть эта комбинация «JQuery, надстройки и HTML5». Мне нравится более быстрый, чистый и компактный JS по сравнению с вышеуказанными библиотеками. Я скептически отношусь к HTML5, так как это развивающийся стандарт.

Что мне действительно нравится в GWT, так это его преимущества в производительности. По крайней мере, примеры работают отлично. Что мне не нравится в этом, так это Java, и я неплохо разбираюсь в javascript. Для моего серверного приложения в движке приложения я использую не Java, а Python. поэтому rpc будет основан только на json. У нас еще нет мобильной версии на планшете, но она снова очень понадобится позже, и мы можем использовать Sencha-touch для этого позже.

Я сделал POC для всех этих приложений, и развертывание GWT кажется быстрым и гладким по сравнению с extjs или smartclient. И есть много вещей, которые GWT делает для меня автоматически. Также мне нравится "чистый html", созданный gwt. Я тоже довольно хорошо использую javascript и очень хорошо знаю о «ошибках», которые там случаются, что приводит к аду javascript.

(Я не жду ExtGWT или SmartGWT)

Любые предложения о том, следует ли мне перейти на GWT или это хорошо для приложений корпоративного уровня?

Или, если кто-то сталкивался с созданием больших приложений с использованием GWT, каковы были минусы (и плюсы)?


person anups    schedule 10.07.2012    source источник
comment
Итак, вы хорошо разбираетесь в JS, но вам не нравится Java? И вы не будете использовать Java на стороне сервера, поэтому вы даже не сможете воспользоваться преимуществами GWT-RPC или RequestFactory? Короче говоря, вы не хотите использовать GWT, так зачем спрашивать, если нужно?   -  person Thomas Broyer    schedule 10.07.2012
comment
Хороший вопрос, Томас. Я должен был упомянуть причину, по которой я спрашиваю - о производительности (и обслуживании). Я начал со SmartClient (и Javascript) — серверная часть привязана к Python — к сожалению, SmartClient меня не устраивал из-за времени, потраченного на поиск решений и сканирование документации. Я не против перехода на Java, если это упрощает и ускоряет работу для меня (раньше большую часть времени я работал с С# и немного с Java)   -  person anups    schedule 10.07.2012
comment
Я изначально спрашивал об этом более 2 лет назад. Тогда я полагаю, что выбор был в значительной степени ExtJS (или что-то эквивалентно зрелое) ... или jQuery и слишком много инструментов вокруг него. Сегодня я бы использовал AngularJS с Bootstrap и инструменты тестирования/развертывания вокруг javascript. Даже ReactJS выглядит довольно многообещающе. В качестве ответа на мой вопрос - я бы сказал, что следует избегать всего, что не является javascript, скомпилированным в javascript, если у вас нет очень веской причины идти по этому пути. Я перестал использовать EXTJS или подобное (даже сейчас есть несколько хороших применений) ... И мне в основном не требуется jQuery   -  person anups    schedule 23.02.2015


Ответы (3)


Тому, у кого уже есть обширный опыт работы с JSP/JEE и HTML/Javascript, на понимание GWT потребуется всего полдня. Но на освоение у вас уйдет два месяца.

Вот рекомендация по сочетанию технологий с GWT, которая, как я считаю, сделает ваши приложения корпоративного уровня успешными. Я думаю, вам следует использовать GWT из-за его отладки. Но отладка имеет свою цену. Для отладки GWT требуется как минимум четырехъядерный компьютер с 8 ГБ памяти. Если вы считаете, что это не так, возможно, это потому, что вы нашли способ сделать свой пользовательский интерфейс GWT маленьким и простым.

Eclipse зависает при отладке приложения GWT

RequiresResize, ProvidesResize и макеты

Первое, что вам нужно освоить в GWT, — это простая концепция макетов, которые диктуются интерфейсами RequiresResize, ProvidesResize. Вам необходимо убедиться, что цепочка RequiresResize/ProvidesResize от RootLayoutPanel до виджетов с изменяемым размером должна быть непрерывной. И вам нужно освоить архитектуру потока RequiresResize/ProvidesResize в вашем пользовательском интерфейсе. В противном случае при изменении размера браузера вы увидите один или два странных висящих фрукта, размер которых не изменится.

Я думаю, что любой ценой следует избегать написания запланированных изменений размера для каждого виджета, а не в зависимости от Google RequiresResize/ProvidesResize. В противном случае не забудьте отменить изменение размера за несколько итераций. Слишком много проб/ошибок, чтобы усовершенствовать изменение размера.

Асинхронный Асинхронный Асинхронный

Следующая концепция, которую вам нужно принять... Я не сказал «вам нужно учиться», но «вам нужно принять» — это асинхронное поведение Javascript и, следовательно, GWT Java. Неважно, использовали вы GWT или нет. Вы должны привыкнуть к инверсии управления, предоставленного вызываемому объекту, чтобы контролировать успешный ответ вызывающего объекта.

Вы не можете писать

List<Persons> persons = server.getData(personId);

Вы должны уступить делать

server.getData(personId, new Callback<Persons>(){
  @override public void onSuccess(Person person){ ..... }
  @override public void onFailure(Exception ex){ ..... }
});

Вы не можете писать

boolean doOrNot = ConfirmDialogBox();

Вы должны написать

ConfirmDialogBox(new CloseHandler(){
  public void onAccept(Person person){ ...}
  public void onCancel(){ ... }
});

GWT — это Java, но не Java

Меня забавляет постоянное существование людей, которые продолжают пытаться использовать банки байт-кода apache для компиляции с клиентом GWT, клиент GWT - это Javascript, написанный на Java.

Двоичные данные и GWT

Визуальный клиент GWT

Лучшее сочетание, которое я нахожу, это GWT 2.4.0 с Sencha gxt 2.2.5.

Я избегаю использования проекта GXT-Uibinder, поскольку считаю, что он накладывает неудобные ограничения на другие комбинации сторонних GWT-фреймворков. Особенно те фреймворки, которые сильно зависят от генератора GWT.create(). GXT-Uibinder — это проект за пределами Sencha.

GXT 2.2 и ниже требует, чтобы я написал обертки, чтобы сделать его пригодным для использования с uibinder, из-за моего отказа использовать неуклюжий проект GXT-uibinder. Обертки нужны из-за одного глупого перекоса. Любой класс, используемый в качестве родительского узла виджета в uibinder, должен реализовывать GWT HasWidgets, что требует реализации метода, возвращающего iterator<Widget>. К сожалению, GXT 2.2 уже реализует метод iterator(), который возвращает неверный обобщенный итератор.

GXT 3 решает эту проблему. Я думаю, что GXT 3 включает в себя GXT-uibinder, но вам не обязательно его использовать. Вам не нужно писать много обёрток с GXT 3 (без использования GXT-uibinder), чтобы использовать его с uibinder. Но я считаю, что GXT 3 все еще имеет некоторые причудливые ошибки, и попытка решить эти причуды просто не стоит моего времени. Поэтому я придерживаюсь GXT 2.2.5, пока GXT 3 не стабилизируется.

Я основал проект кода Google для упаковки SmartGWT (uibinding-smartgwt). SmartGWT — очень эгоистичный фреймворк. Мои усилия часто заканчиваются катастрофой, если я пытаюсь смешать его с ванилью GWT. Это связано с некоторой Z-индексацией между виджетами SmartClient и GWT.

Если вы решите использовать SmartGWT из-за проблем с лицензированием, вы должны убедиться, что используете только SmartGWT, а не с каким-либо другим поставщиком виджетов. Даже не ваниль GWT. И вам, скорее всего, понадобится мой проект uibinding-smartgwt. Я пытаюсь улучшить его, чтобы использовать некоторые новые функции uibinder и переопределить невизуальные элементы, чтобы они не были виджетами, но мое текущее использование GXT просто слишком сложно, и одновременная мысль о двух фреймворках смущает меня. Потому что они ведут себя по-разному.

В то время как GXT 3, похоже, полностью соответствует GWT, SmartGWT не продемонстрировал никаких усилий для этого. Полное согласование стороннего поставщика виджетов с GWT, чтобы он плавно реализовывал интерфейсы GWT, абсолютно необходимо, чтобы не тратить много времени на написание кладжей за кладжами для решения некоторых незначительных визуальных проблем. Да, особенно архитектура ProvidesResize/RequiresResize.

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

Взаимодействие между клиентом и сервером

Не используйте GWT-RPC. НЕ НАДО. За исключением удобства изучения GWT.

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

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

Меня очень привлекает использование JAX-RS REST-RPC через RestGWT на стороне клиента GWT и RestEasy на стороне сервера. Я использую JAX-B в сочетании с реализацией RestEasy обработки Jackson JSON. Вместо Resteasy вы можете попробовать использовать Jersey.

Таким образом, я мог бы использовать клиент FireFox REST для тестирования сервера независимо от GWT. Фактически, после запуска вашего проекта с использованием GWT на стороне клиента вы можете расширить свое приложение, чтобы использовать клиентов без GWT, таких как JQuery, в качестве клиентов для служб REST.

REST также упрощает написание прокси-серверов/туннелирующих серверов, что позволяет обойти ограничения безопасности браузеров SLD-SO-P («домен 2-го уровня, тот же источник»). Принимая во внимание, что формат данных GWT-RPC преднамеренно не поддается расшифровке и нестабилен (я не понимаю менталитета инженера Google, стоящего за тем, как это повышает безопасность, поскольку вы все еще можете видеть биты и фрагменты читаемого человеком текста), я не пытался писать прокси для туннелирования сервисов GWT-RPC. Я не знаю, насколько это жизнеспособно.

http://h2g2java.blessedgeek.com/2011/11/gwt-with-jax-rs-aka-rpcrest-part-0.html.

Кстати, script-include для преодоления sld-sop - очень плохая идея. Даже не думай об этом.

Постоянство

Hibernate JPA для не-GAE. Eclipselink JPA для GAE с Google DataNucleus JPA для GAE с хранилищем данных Google.

Сначала я увлекся идеей JDO. Я так старался, а JDO продолжает давать мне конфликты. Я сдался. Сначала казалось, что Google изо всех сил пытается убедить нас, что JDO превосходит JPA. Правда это или нет, но до сих пор мне не удалось приобрести навыки использования персистентности JDO. А поскольку мне приходится программировать и для не-GAE, я не хочу засорять свой разум сложностью JDO.

Причина, по которой я упомянул об этом, заключается в том, что я склонен использовать один и тот же JPA POJO с JAX-RS POJO. Это означает, что я обнаружил, что аннотации JPA, JAX-RS, JAXB и Jackson смешиваются в один и тот же POJO-DTO без конфликтов. У меня часто есть один набор POJO (за некоторыми исключениями), совместно используемый клиентом GWT, сервером JAX_RS и сохраняемостью JPA. Для этого у вас должно быть одно ограничение — все DTO должны быть GWT-сериализуемыми. Не только сериализуемый. По возможности избегайте написания конвертеров dto. Пустая трата времени на три разных набора POJO-DTO, а затем на конвертеры между ними.

Самый ценный игрок

Я считаю, что MVP4G — очень простая в управлении структура MVP. Следующее обсуждение демонстрирует, как я использую MVP4G:

https://groups.google.com/forum/?fromgroups#!searchin/mvp4g/blessedgeek/mvp4g/T6r7egk-3Kk/Jz-dTqZDeMIJ

MVP — очень полезный паттерн. Потому что это помогает мне разделять «проблемы». Когда вы можете разделять проблемы, вы можете тестировать и решать проблемы по отдельности. Это также поможет вам улучшить/расширить ваш проект с минимальным вмешательством/запутанностью, насколько это возможно, со стороны других проблем/модулей вашего лабиринта приложений.

MVP4G также упрощает модульное тестирование, потому что вы можете просто имитировать представление или презентатора или использовать упрощенную шину событий/машину состояний для отладки только тех частей, которые вам нужно отлаживать. И из-за его модульности вы можете легко избежать загрязнения ваших нетестовых классов, чтобы вы могли удалить свои тестовые исходные деревья, не нарушая свои рабочие классы. IOW, вам не нужно изменять свои нетестовые классы, чтобы протестировать их.

person Blessed Geek    schedule 10.07.2012
comment
Вы сказали - Никогда не используйте инкубацию GWT? Что такое инкубация GWT??? и спасибо за подробное объяснение... ...Async такой же, как javascript - с плоскими пользовательскими интерфейсами web 2.0... Persitence - я согласен с частью JDO, которую вы упомянули... в моем приложении постоянство обеспечивается материалом Python с помощью базовый низкоуровневый API - я нахожу те мощные для того, что я создаю ... Клиент-сервер - для меня это в основном основанный на json ... MVP - есть (вроде) для того, что нужно. - person anups; 10.07.2012

Такие вопросы, как использовать X или Y, всегда зависят от вашего опыта работы с этими инструментами и требований. Лучший инструмент/фреймворк ничего не стоит, если вы не знаете, как его использовать, и если у вас нет других требований, кроме «Я хочу создать приложение», я бы посоветовал использовать инструмент, с которым вы чувствуете себя лучше всего.

Плюсы и минусы GWT объясняются довольно часто. Думаю повторяться не обязательно.

Привет, Питер

person Peter    schedule 10.07.2012
comment
Спасибо, Питер... Я не могу создавать свои собственные фреймворки с помощью JS... и я новичок в фреймворках GWT или SmartClient - оба представляют для меня кривую обучения (за исключением того, что я узнал во время POC). К сожалению, документация и примеры SmartClient не дают мне возможности добиться цели. Если бы это был ExtJS, я бы не оглядывался назад. GWT привлекательно проще, но я не знаю, как он будет выглядеть, когда вырастет. Я не против изучения GWT или перехода на Java, если GWT повысит мою продуктивность после обучения. И я хотел бы быть ленивым и не делать того, что GWT сделал бы за меня. - person anups; 10.07.2012

В своих проектах я использую в основном чистый GWT.
Однако вам придется потратить некоторое время на создание пользовательских виджетов и оформление их в соответствии с вашими потребностями.

В дополнение к предложениям, которые вы уже получили, вы также можете проверить Vaadin и Jboss Errai.

Мне очень нравятся шаблоны пользовательского интерфейса Errai, которые вы можете посмотреть в этом скринкасте.

Vaading предоставляет привлекательный набор виджетов, а также собирается использовать GWT в качестве ядра в версии 7.
Оба (JBoss и Vaadin) входят в руководящий комитет по будущим разработкам GWT.

person Ümit    schedule 10.07.2012