![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
sl_ava |
|
||||||||||||||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 20.1.2007 Репутация: 1 Всего: 3 |
Вариант 1 : создание HIBERNATE mapping файлов. Может напрямую использоваться для простых проектов. Можно модифицировать для более сложных ( скачать ).
Как известно существует 2 метода разработки веб-сервисов : - снизу вверх (bottom-up) от JAVA-классов к SOAP-интерфейсу, т. е. генерирование определений для веб-сервиса (WSDL) на основе JAVA-классов - сверху вниз (top-down) от WSDL к реализации сервиса в JAVA классах. В этом случае наоборот из определений веб-сервиса создаются JAVA классы Каждый метод имеет свою область применения, свои плюсы и минусы. Я использую вариант разработки приложения сверху вниз в случаях построения веб-сервиса с нуля. Создаются 2 файла : XSD - содержащий определения базовой объектной структуры проекта и WSDL, который определяет интерфейс и объекты взаимодействия (запросы и ответы, случай Document/Literal ). Причем XSD включен в WSDL посредством "xsd:import". Эти 2 файла компактно представляют предметную область проекта и связи между базовыми объектами (XSD) а также взаимодействие с внешним миром (WSDL). Затем я пользуюсь стандартными генераторами для создания всех необходимых классов. В случае Axis это Wsdl2java а в случае JbossWS - wsconsume. Остается только добавить логику в приготовленный скелет. Однако есть еще некоторые возможности для облегчения работы программиста в случае разработки проекта сверху-вниз. Поскольку все определения компактно собраны в одном месте и причем в структурированном виде, как XML файл, то можно воспользоваться этим для автоматического создания не только классов но и базы данных а возможно и заготовок для реализации логики проекта. Раньше я автоматически генерировал структуру БД и некоторые вспомогательные классы для работы с БД . С появлением продуктов типа HIBERNATE для реализации уровня управления данными, возникли более простые пути генерирования сущностей для связи с БД. Достаточно просто создать конфигурационные файлы HIBERNATE и мы автоматически получим не только базу данных но и мощный инструмент управления данными. При этом для генерирования нам не нужно ничего кроме ANT ( ant.apache.org ) с расширениями ( ant-contrib.sourceforge.net ). Поскольку речь идет о статическом преобразовании XML (XSD->конфигурационные файлы) то самое разумное - использовать для этого специальный инструмент, разработанный именно для этой цели, т.е. XSL(T). Файлы конфигурации создаются из XSD с помощью задания <xslt> из стандартного набора АНТа и специально приготовленных XSL файлов. Пример. Рассмотрим на примере (исходники примера без библиотек лежат тут ). Файл с техническими деталями readme.txt находится в корневой папке ztest. Нужно сначала все правильно сконфигурировать как написано в readme.txt. Создаем определения будущей системы. XSD представляет предметную область: продукты (ZProduct) и заказы (ZOrder), которые могут содержать продукты:
Для правильной работы с HIBERNATE полезно добавить в каждый объект-элемент его идентификатор- ID. В этом примере предполагается что только объекты с ID должны конфигурироваться для уровня управления данными, т.е. если ID не определен, то HIBERNATE файл не создается WSDL определяет внешний интерфейс :
Генерирование исходников. Запускаем "build.bat generate.source". Выполняется задание org.jboss.wsf.spi.tools.ant.WSConsumeTask из инструментария JbossWS 2.0, которое создает все нужные для самого WS исходники. Созданные WSConsume JAVA классы к сожалению не годятся напрямую для работы с HIBERNATE поскольку для элементов типа List не определен "сеттер" (как например setZOrder(List<ZOrder> ...) ). Поэтому пришлось добавить недостающие методы. Они создаются поочередно для каждого класса с помощью generate.java-addition.xsl и затем добавляются в исходник. Создается также класс *Impl.java как скелет для реализации собственно логики (если он отсутствует). На этом этапе можно уже наполнять этот класс каким-то содержанием - положить что-то в БД, выбрать и т.п. Вообще можно было бы на этом шаге сделать не простой скелет сервера но сразу включить в него автоматически какие-то методы работы с данными в тех методах, где они могут понадобиться. Пока я этого не сделал. Создание конфигурации HIBERNATE Запускаем "build.bat generate.hibernate". Файлы отображения классов в БД создаются по одному для каждого соответствующего класса. Например для класса ZOrder.java будет создан ZOrder.hbm.xml. Затем создается общий конфигурационный файл hibernate.cfg.xml. Запуск Теперь можно выложить приложение на сервер "build.bat deploy". По умолчанию приложение находится по адресу http://localhost/mycontext/zservice?wsdl Чтобы заменить на другой адрес измените в файле ZtestServerImpl.java строку : "@WebContext( contextRoot = "/mycontext" , urlPattern="/zservice" )" Чтобы потестировать приложение запускаем "build.bat testclient". Тест находится тут ztest\src\com\ztest\base\ZtestServerTest.java. Что происходит тут?
Создается объект Zproduct и передается на сохранение серверу. При этом на сервере происходит следующее :
HIBERNATE позаботился о сохранении объекта в БД и при этом присвоил ему ID. Этот ID возвращается клиенту. Также создается объект prod2. Теперь создадим заказ, содержащий 2 уже существующих продукта :
Интересно что при сохранении в БД создается новая запись для zOrder и для связей с уже существующими продуктами prod1 prod2. В следующем примере мы кладем в ДБ заказ с четырьмя продуктами внутри - 2 из них не имеют ID поэтому при сохранении HIBERNATE создает для этих продуктов новые записи в таблице zProduct но естественно не создает записи для уже существующих продуктов. Теперь запросим список заказов с сервера :
На сервере случается вот что :
Здесь делается странная вещь : ((Zorder)i.next()).getZProduct().size(); Смысл в том, что при такой процедуре родительский объект загружает дочерние. Можно настроить HIBERNATE конфигурацию объекта так, чтобы объект добывался сразу с дочерними, но в общем случае это означает много лишней работы, что чаще всего не желательно. Копия этой статьи тут Это сообщение отредактировал(а) sl_ava - 18.8.2007, 17:23 |
||||||||||||||
|
|||||||||||||||
maxterbear |
|
|||
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 11.10.2010 Репутация: нет Всего: нет |
sl_ava, спасибо! а не подскажите чем можно сгенерировать классы для дотнет платформы?
|
|||
|
||||
powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 28 Всего: 159 |
maxterbear, это Вам лучше в разделе по .NET спросить.
|
|||
|
||||
Старовъръ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 491 Регистрация: 8.5.2008 Репутация: 1 Всего: 10 |
sl_ava, скажи, а что ты делаешь, когда нужно добавить что-то новое? Можно, конечно, перегенерировать все сущности, однако тогда все перетирается (мы не можем, например, содержать javadocs в классе в таком случае). Лично я руками все правил/добавлял, но может есть какие-то еще интересные способы?
-------------------- |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |