понедельник, 25 июля 2011 г.

GWT 2.1 Places

http://www.sidney3172.com/2010/12/gwt-21-places.html

В GWT 2.1 появилось множество нововведений, таких как Places,Data
Presentation Widget и многое другое. В этой статье будет рассмотрено
одно из них - Places.

Что такое Place (место)?
В любом приложении, в частности в web приложении, где редко
используется понятие "окна" (и по-моему все веб разработчики должны
потрудиться над тем, чтобы сделать это "редко" в "никогда"), обычно
описывают то, что сейчас видят как место (Place).

Примером мест может служить: ваш почтовый ящик, результаты поиска
фразы "GWT Places", профиль пользователя и т.д. Идея в том, чтобы
использовать понятие места (place) для того, чтобы выбрасывать события
связанные со сменой этого места.

Здесь PlaceService выступает в роли моста между событиями страницы и
менеджментом истории браузера (этот вопрос заслуживает отдельной
статьи, но в двух словах задача в том, чтобы заставить работать кнопки
"назад" и "вперед" браузера при просмотре отдельной страницы). Поэтому
PlaceService есть и должен оставаться компонентом, который следит за
историей браузера и реагирует на ее изменения.

Развенчание заблуждений
Прежде чем рассматривать детали, давайте проясним несколько вопросов:
places никак не связаны с MVP и понятием application-wide even bus. Вы
можете их использовать вместе или отдельно. Но становится хорошей
практикой всегда и везде использовать их вместе, но каждый из них
выполняет свою роль, отдельно от других. Это так же означает, что вам
необязательно нужно понимать все остальные вещи о которых говорил Ray
Tyan (MVP, event bus, паттерн Command для RPC и т.д.), чтобы понять
Places.

Так как это выглядит в GWT 2.1?
GWT 2.1 воплотил PlacesService в двух уровнях: places и activity
(активность), и выборочная интеграция с другими возможностями GWT
(сейчас это History, а в будущем RequestFactory); все это находится в
пакетах com.google.gwt.place.Place and
com.google.gwt.activity.Activity соответсвенно.

Основа GWT 2.1 places - это PlaceController, который вы должны
использовать для навигации от одного места к другому. Давайте начнем с
рассмотрения как выглядит Place в GWT 2.1 и что он из себя
представляет.

В GWT 2.1, места - это легковесные объекты, которые наследую
абстрактный класс Place. Ониare lightweight objects extending the
Place abstract class. Они throwable и неизменяемые (как String или
Integer в Java). Вы можете объявить столько мест, сколько сочтете
нужным с соответсвующими данными (поисковый запрос, id пользователя и
т.д.) или без них. Чтобы перейти в новое место, нужно будет создать
новый экземпляр соотвествующего класса (каждый раз, при каждом
переходе внутри приложения). Класс Place содержит никаких методов, но
все наследники должны правильно реализовывать Object.equals(Object) и
Object.hashCode().

Введение в PlaceController
PlaceController это объект, который управляет текущим местоположением
и навигацией между местами. Поэтому не следует инстанциировать больше
одного экземпляра этого класса внутри одного приложения.

Чтобы дать возможность приложению реагировать на изменение места
(обновить UI и состояние приложения в соответствии с действием),
PlaceController генерирует событие в event bus. Вам не потребуется
глубокого понимания event bus, преставьте, что вы вместо того чтобы
добавлять handler к объекту PlaceController, вы добавляете его к
другому объекту event bus (который должен быть так же один экземпляр
на одно приложение).
Как только вы инстанциировали PlaceController вы автоматически начнете
получать события от него через EventBus. Entry-Point вашего приложения
должен содержать примерно такой код:


1.
EventBus eventBus = new SimpleEventBus();
2.
PlaceController placeController = new PlaceController(eventBus);


По-умолчанию PlaceController инициализируется со значением текущего
места - Place.NOWHERE (это можно увидеть вызвав метод
placeController.getWhere();). Чтобы перейти в другому месту, вы просто
передаете новый экземпляр Place в метод placeController.goTo():

1.
placeController.goTo(new MyPlace());


Это вызовет смену текущего места и генерацию события PlaceChangeEvent
в event bus. Чтобы поймать эти события нужно добавить соответствующий
handler к event bus:


1.
eventBus.addHandler(PlaceChangeEvent.TYPE, new
PlaceChangeEvent.Handler() {
2.
public void onPlaceChange(PlaceChangeEvent event) {
3.
Place newPlace = event.getNewPlace();
4.
...
5.
}
6.
});


Это был краткий обзов GWT 2.1 Places, в следующих статьях я постараюсь
описать все более детально.

Это вольный перевод статьи GWT Places
Выступление Ray Ryan`а на Google I/O можно увидеть в одной из старых статей

Комментариев нет:

Отправить комментарий