Использование Oracle Berkeley DB Java Edition как менеджера хранения объектов для Google Web Toolkit - Удаленные сервисы, бизнес-сервисы и средства доступа
ОГЛАВЛЕНИЕ
Удаленные сервисы, бизнес-сервисы и средства доступа
Remote Services, Business Services, and Accessors
К данному моменту концептуальные сущности (conceptual entities) созданы и должным образом аннотированы с применением аннотаций DPL в Berkeley DB Java Edition. Методы базисных сервисов должны управлять состояниями транзакций этих сущностей. Следующий шаг - это создание GWT Remote Services. Они будут вызывать код DPL в Berkeley DB Java Edition для хранения данных. Remote Services - это стандартный способ коммуникаций с сервером приложений Java EE со стороны браузера на стороне клиента. Это делается с использованием стандарта Ajax, особенно HTTP POST,. Код на стороне сервера для этого Ajax -вызова находится в "серверном" пакете (" server " package) данного приложения GWT. Этот код выполняется в контейнере сервлета или сервера приложений Java EE (так как мы на стороне сервера, это - Java -код, в то время как код, выполняемый в браузере, - на JavaScript) и именно здесь действия пользователя в браузере встраиваются в бизнес-логику, а DPL в Berkeley DB Java Edition используется для хранения объектов. вызова сгенерированного и управляемого GWT
Реализация RemoteService метода save():
Реализация RemoteService метода save():
...
public void createUser(UserDTO pUserDTO) {
//transform the presentation layer object into a conceptual object
User wUser = new User();
wUser.setUserName(pUserDTO.getUserName());
wUser.setInjury( pUserDTO.getInjury());
UserService userService = new UserService();
userService.createUser(wUser);
}
...
Модельные объекты (Model objects) - это классы бизнес-данных, которые реализуют аспекты управления данными приложения в базе данных. Программист, использующий EJB, может в первом приближении определить UserService как stateless session bean.
Сам по себе класс BaseService не работает с какой-либо логикой. Этот класс управляется с транзакционным состоянием определенной задачи по одному или нескольким объектам в базе данных. Чтобы добавить логику бизнес-процесса сервису, это приложение (его разрабочик) должно расширить класс BaseService. В нашем примере класс UserService будет функционировать в этой роли и управляться со всем доступом к сущности User, обеспечивая реализации для методов, таких как createUser (), saveUser () и getUser ().
Эта реализация размещена в пакете на стороне сервера данного проекта. Она вызывает бизнес-сервис UserService., а модель POJO с аннотациями DPL будет храниться в базе данных Oracle Berkeley DB Java Edition. Вспомните, что эта база данных - это просто набор файлов, размещенных в файловой системе сервера, к которой есть доступ у контейнера сервлета Web -приложения. Именно UserService реализует бизнес-логику для конкретного экземпляра. В нашем примере теперь нужно трансформировать объект UserDTO в объект User
Проверенные подходы проектирования требуют, чтобы в приложении объекты DTO были отделены от бизнес-объектов благодаря уровням (layering) и абстрагированию. Бизнес-сервисы не должны знать о классах DTO, они должны взаимодействовать только с концептуальными моделями объектов. Эти объекты хранятся в базе данных Berkeley DB Java Edition. Классы бизнес-сервисов отвечают за управление концептуальных моделей объектов в хранилище данных. Для соотношения этого с EJB, UserService подобна stateless session bean.
Ниже приведен метод UserService. createUser ():
...
public User createUser( User pUser ) throws DatabaseException, Exception{
UserAccessor wUserAccessor = new UserAccessor();
//check mandatory fields
if ( pUser.getFirstName().equals("") //
pUser.getLastName().equals("") //
pUser.getUserName().equals("") ){
throw new Exception("Missing mandatory fields");
}
open( false, wUserAccessor);
// Start a transaction.
startTransaction();
// Put it in the store. Note that this causes our secondary key
// to be automatically updated for us.
try {
wUserAccessor.userByUserName.put( pUser );
// Commit the transaction. The data is now safely written to the
// store.
commit();
} catch (DatabaseException dbe) {
try {
System.out.println("Error creating a user");
} catch (Exception willNeverOccur) {
}
txn.abort();
throw dbe;
} catch (Exception e) {
txn.abort();
e.printStackTrace();
}
return pUser;
}
...
Этот метод использует унаследованные методы open () и startTransaction (), чтобы установить и использовать Berkeley DB Java Edition как базу данных (aka сущность хранилище), а затем стартует транзакцию. Это разделение (функций) помогает разработчикам не делать ошибок при установке соединений с Berkeley DB Java Edition и позднее транзакций в процессе. Класс UserAccessor class ответственен за установку различных средств доступа интерфейса DPL в Berkeley DB Java Edition,. Ниже приведено содержание класса UserAccessor: особенно индексов, для доступа к данным. Этот класс инкапсулирует индексы, используемые позднее в данном коде для создания, изменения и уничтожения объектов в базе данных Berkeley DB Java Edition
UserAccessor:
...
public class UserAccessor extends DefaultAccessor {
public PrimaryIndex<String, User> userByUserName;
public UserAccessor() {}
public void init() throws DatabaseException{
userByUserName = entityStore.getPrimaryIndex( String.class, User.class );
}
}
...
С установкой этих средств доступа, слой бизнес-сервисов упрощается и согласуется. Задача создания и управления индексами выделена как единое изолированное целое, которое не будет взаимодействовать с вашей бизнес-логикой. Вот пример, в котором используется индекс для выборки экземпляра User по имени.
wUser = wUserAccessor.userByUserName.get(pUser.getUserName());
Иначе, для выборки пользовательского объекта без использования этих методов средств (accessor methods), этот код должен был бы выглядеть примерно так:
PrimaryIndex<String, User> userByUserName;
userByUserName = entityStore.getPrimaryIndex(String.class, User.class);
User wUser = userByUserName.get();
Преимущество этого метода должны быть очевидны: код намного проще в первом случае. Этот подход проектирования надо рассматривать при комбинировании GWT и Berkeley DB Java Edition.