Download pptx - Gwt jug basic

Transcript
Page 1: Gwt jug basic

Google Web Toolkit

Введение в средство разработки пользовательского WEB интерфейса

Anton Antonov

[email protected]

2011

Page 2: Gwt jug basic

Содержание

Трудности

GWT решение

Как работает GWT?

Возможности GWT

Паттерны и библиотеки

Page 3: Gwt jug basic

WEB приложение: трудности

Page 4: Gwt jug basic

GWT решение

Дружественная для разработчиков

– Совместимость с IDE, отладка, рефакторинг, строгая типизация…

Не зависит от реализации и платформы сервера

– Java (Tomcat, Jboss, и т.д.)– PHP/CGI (Apache)– .Net (IIS)

Page 5: Gwt jug basic

GWT: основной принцип

Пишем код на Java

Компилируем Java код в JavaScript

JavaScript выполняется в браузере

Page 6: Gwt jug basic

GWT: HelloWorld

public class HelloWorld implements EntryPoint { public void onModuleLoad() { RootPanel panel = RootPanel.get(); Label message = new Label("Hello World!!!"); panel.add(message); Button button = new Button("Click ME"); panel.add(button); button.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { Window.alert("Hello World!"); } }); }}

Page 7: Gwt jug basic

Более полезные приложения

Google Wave– https://wave.google.com

Google AdWords– https://adwords.google.com

А так же много других– http://gwtgallery.appspot.com

Page 8: Gwt jug basic

GWT Архитектура

http://www.slideshare.net/dgirard/introduction-to-google-web-toolkit

Page 9: Gwt jug basic

Виджеты

http://gwt.google.com/samples/Showcase/Showcase.html

Page 10: Gwt jug basic

Поддержка истории (back button)

Одностраничный интерфейс с поддержкой истории

GWT ShowCase - как пример

History.addValueChangeHandler(new ValueChangeHandler<String>() {

public void onValueChange(ValueChangeEvent<String> stringValueChangeEvent) {

//do something on history change

}

});

Page 11: Gwt jug basic

Декларативный интерфейс (UiBinder)

Разделение Вида от Поведения

XML вместо Java кода

Шаблонизация виджетов и их взаимного расположения

Интеграция с внешними ресурсами (CSS, картинки)

Page 12: Gwt jug basic

AJAX: RPC это просто

private void getData() { DataServiceAsync rpc = (DataServiceAsync) GWT.create(DataService.class); rpc.getDataModel(5, 6, new AsyncCallback<DataModel>() { public void onFailure(Throwable throwable) { Window.alert("Unable get data from server" + throwable); } public void onSuccess(DataModel dataModel) { Window.alert("Server response: \n" + dataModel.getDataString() + dataModel.getDataInt()); } }); }

Page 13: Gwt jug basic

Сериализуемые типы

java.io.Serializable совместимая*– Наследник java.io.Serializable– Конструктор без аргументов (или без конструктора) любой видимости– Все non-final и non-transient поля должны быть сериализуемы

Page 14: Gwt jug basic

Мост из Java в JavaScript (JSNI)

Возможность вызова JS методов из GWT Java кода

private native void someJSFunction(Date value) /*-{

$wnd.someJSFunction(value);

}-*/;

Возможность вызова GWT методов из JS кода– Код на следующем слайде

Существует множество обверток над существующими JS библиотеками (Google Charts, JQuery и т.д.)

Можно легко писать свои обвертки

Page 15: Gwt jug basic

JavaScript Overlay типы

private native void registerGWTFunction() / *-{ var _ this = this; $wnd.registeredGWTFunction = function (v) { _ [email protected] SNI ::j sAccessibleFunction (Lcom/ sigmaukraine/ jug/ jsni/ client/ overlay/ J SOverlay;) (v); }; }-*/ ; private void jsAccessibleFunction(J SOverlay overlay) { Window.alert("I 'm GWT:\nstr:" + overlay.getStr() + "\nvalue:" + overlay.getValue()); }

Page 16: Gwt jug basic
Page 17: Gwt jug basic

Оптимизация

Page 18: Gwt jug basic

Cross-browser поддержка

Скомпилированный JavaScript оптимизирован

Только необходимое API грузится браузером (пермутация)– IE грузит JS только для IE, FireFox – JS только для FF– Неиспользуемое API исключается из скомпилированного JS

Page 19: Gwt jug basic

Сборка ресурсов

1 запрос вместо 12

ClientBundle– CSSResource– ImageResource– TextResource– И т.д. (

http://code.google.com/webtoolkit/doc/latest/DevGuideClientBundle.html#ClientBundle )

Page 20: Gwt jug basic

Разделение кода

Отдельные части большого приложения загружаются по требованию

GWT.runAsync(new RunAsyncCallback() { public void onFailure(Throwable reason) { Window.alert("Can't load script part"); }  public void onSuccess() { //The following code will be loaded on demand root.add(new HelloWorldPanel(textCell.getValue())); }});

Page 21: Gwt jug basic
Page 22: Gwt jug basic

Отладка

Page 23: Gwt jug basic

Отладка скомпилированного JS

Это возможно!

Достаточно изменить один параметр компилятора– -style pretty

Зачастую в этом нет необходимости*– * это пока единственный способ отладки JSNI методов

Page 24: Gwt jug basic

JUnit тестирование

Возможность тестирование не «родного» кода непосредственно с помощью JUnit

GWTTestCase в противном случае– Позволяет тестировать логику виджетов, которые используют DOM модель,

DeferredBinding или JSNI.

Интеграция с IDE

Page 25: Gwt jug basic
Page 26: Gwt jug basic

MVP (GWT pattern)

Model– Модель данных, бизнес модель

View– Отображение данных (UiBinder widget, GWT plain widget, etc.)

Presenter– Поведение или логика

Page 27: Gwt jug basic

Activities & Places (GWT pattern)

Место (Place)– Состояние UI конвертируемое в/из URL hash (#...)

Активность (Activity)– Инкапсуляция действия пользователя

• Wake up• Set up• Show up

– Обычно приводит к смене «места»

Page 28: Gwt jug basic

GWT паттерны и библиотеки

MVP (Model View Presenter) GWT-Platform– http://code.google.com/webtoolkit/articles/mvp-architecture.html– http://code.google.com/p/gwt-platform/

Activities & Places– http://code.google.com/webtoolkit/doc/latest/DevGuideMvpActivitiesAndPlaces.html

Gin (Dependency injection for GWT, based on Guice)– http://code.google.com/p/google-gin/

Spring MVC RPC integration (gwt-widget SL)– http://gwt-widget.sourceforge.net/gwt-sl/reference-1.0/index.html

Page 29: Gwt jug basic

Q&A