На первый взгляд, Ваадин — и GWT в целом — имеет много общего с DukeScript . Оба ориентированы на предоставление ориентированных на браузер решений для разработчиков Java и имеют хорошую интеграцию с IDE благодаря их собственной поддержке Maven. Тем не менее, эти аспекты действительно все, что у них общего. Vaadin и DukeScript полностью отличаются друг от друга: от модели программирования, от того, как фреймворки обрабатывают код до развертывания приложений.
Чтобы по-настоящему осмыслить эти моменты, давайте начнем с рассмотрения моделей программирования Vaadin и DukeScript. Хотя то, как вы программируете на Java, заметно отличается, у каждого есть действительно хорошая мотивация, которая имеет смысл для соответствующей целевой аудитории разработчиков. В этом смысле в этой истории нет «лучше» или «хуже», просто есть два разных способа дать разработчикам Java доступ к платформам на основе браузера на всех типах устройств.
В Vaadin основной демографической с точки зрения аудитории разработчиков являются разработчики Java Swing, которые хотят перенести свои настольные бизнес-приложения на Java в Интернет и на мобильные устройства. По этой причине Vaadin предоставляет компонентную модель, сравнимую с моделью Swing. Предоставляется ряд компонентов графического интерфейса, таких как «Метка» и «Кнопка», а также кучи более сложных компонентов, включая различные графики и другие впечатляющие функции, связанные с пользовательским интерфейсом, а также «Макеты» и «События», что снова напоминает о Swing.
Вот как выглядит типичный сценарий «Hello World» в Vaadin. Обратите внимание на компоненты GUI, «VerticalLayout» и «ClickEvent»:
Привет Мир в Ваадине
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
import com.vaadin.annotations.Theme; import com.vaadin.annotations.VaadinServletConfiguration; import com.vaadin.annotations.Widgetset; import com.vaadin.server.VaadinRequest; import com.vaadin.server.VaadinServlet; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Label; import com.vaadin.ui.UI; import com.vaadin.ui.VerticalLayout; @Theme ( "mytheme" ) @Widgetset ( "org.hw.vaadin.MyAppWidgetset" ) public class MyUI extends UI { @Override protected void init(VaadinRequest vaadinRequest) { final VerticalLayout layout = new VerticalLayout(); layout.setMargin( true ); setContent(layout); Button button = new Button( "Click Me" ); button.addClickListener( new Button.ClickListener() { @Override public void buttonClick(ClickEvent event) { layout.addComponent( new Label( "Thank you for clicking" )); } }); layout.addComponent(button); } @WebServlet (urlPatterns = "/*" , name = "MyUIServlet" , asyncSupported = true ) @VaadinServletConfiguration (ui = MyUI. class , productionMode = false ) public static class MyUIServlet extends VaadinServlet { } } |
Выше также обратите внимание на аннотации, используемые для функций, связанных с браузером, т. Е. Темы и наборы виджетов, а также аннотации, связанные с Java EE, для интеграции с контейнерами сервлетов, указывая на то, что Vaadin является средой, связанной с клиентом / сервером.
В отличие от внимания Ваадина к Swing-подобной модели разработки, DukeScript имеет модель разработки KnockoutJS , которую группа DukeScript считает более продвинутым и современным подходом. Модель разработки KnockoutJS четко отделяет представление от логики. Логика может быть разработана и протестирована еще до создания представления, как обсуждалось здесь . Хотя приложения Vaadin также можно тестировать модульно, с помощью Vaadin вы тестируете View (например, «clickButton»), в то время как с DukeScript вы тестируете логику (например, «addUser»). Благодаря DukeScript разработчик больше не несет ответственности за макет и аспекты удобства использования приложения — вместо этого это могут делать эксперты.
Так же, как знание Swing полезно, но не обязательно для использования Vaadin, знание KnockoutJS полезно, но не обязательно для использования DukeScript. Однако, поскольку Java-разработчики, вероятно, лучше знакомы с Swing, чем с KnockoutJS, разработчику Java, возможно, придется потратить немного больше времени на ознакомление с KnockoutJS, прежде чем начинать с DukeScript.
С другой стороны, модель программирования DukeScript такова, что разработка внешнего интерфейса приложения может быть делегирована кодировщикам, специфичным для внешнего интерфейса, т. Е. Разработчикам, которые занимаются разработкой внешнего интерфейса с использованием KnockoutJS. Чтобы доказать это, прочитайте эту недавнюю статью о JavaCodeGeeks Антона Эппла из команды DukeScript. С другой стороны, в этом чисто разделенном сценарии сами привязки можно считать частью задач программирования на Java, то есть разработчик Java добавил бы эти привязки к разметке, полученной от внешних разработчиков, которые поместили представление вместе.
Давайте теперь обратимся к типичному сценарию «Hello World» в DukeScript. Как указано выше, представление и бизнес-логика разделены на отдельные файлы, один в HTML, а другой в Java. Вот HTML сторона, которая идентична сценарию «Hello World» от KnockoutJS.com :
Вид «Hello World» в DukeScript
1
2
3
|
< p >First name: < input data-bind = "value: firstName" /></ p > < p >Last name: < input data-bind = "value: lastName" /></ p > < h2 >Hello, < span data-bind = "text: fullName" > </ span >!</ h2 > |
А вот бизнес-логика, обеспечивающая двустороннюю привязку данных указанных выше свойств, которая обычно используется в JavaScript в модели разработки KnockoutJS, хотя, благодаря DukeScript, выражается в Java:
Бизнес-логика «Hello World» в DukeScript
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
|
import net.java.html.json.ComputedProperty; import net.java.html.json.Model; import net.java.html.json.Property; @Model (className = "Data" , targetId = "" , properties = { @Property (name = "firstName" , type = String. class ), @Property (name = "lastName" , type = String. class ) }) final class DataModel { @ComputedProperty static String fullName(String firstName, String lastName) { return firstName + " " + lastName; } private static Data ui; static void onPageLoad() throws Exception { ui = new Data(); ui.setFirstName( "Planet" ); ui.setLastName( "Earth" ); ui.applyBindings(); } } |
Как и в случае с Vaadin, сценарий DukeScript «Hello World» использует аннотации. Эти аннотации генерируют POJO со всеми получателями и установщиками, на которые есть ссылки выше, всякий раз, когда исходный файл Java сохраняется во время разработки.
Оба этих сценария «Hello World» предназначены для браузера. Как они это делают, т. Е. Как приведенный выше код обрабатывается и делается доступным для использования в браузерах, — тема следующей статьи в этой серии. Однако на данный момент, прочитав эту статью, вы должны иметь представление о различиях в модели программирования этих двух сред.
Используя Vaadin, вы получаете доступ к ряду компонентов GUI, выраженных на Java и расположенных в дереве компонентов, сравнимом с Swing. Благодаря DukeScript у вас есть полный доступ ко всему, что экосистема JavaScript обеспечивает для внешнего интерфейса, и ко всей экосистеме Java для бизнес-логики, с особым акцентом на двухсторонние функции привязки данных в KnockoutJS, чтобы связать представление с бизнес-логикой.
Спасибо Матти Тахвонену из Vaadin и Антону Эппле из DukeScript, которые написали и внесли свой вклад в эту статью.