48951

Прототип программной системы «Гостиница»

Курсовая

Информатика, кибернетика и программирование

Постояльцы проживают в гостиницах по разным целям – это может быть, как и в случае отдыха, так и по работе. Наша цель – подобрать доступную гостиницу из имеющейся на сайте базы данных. Так же вы можете оставлять ваши отзывы и пожелания

Русский

2013-12-17

1.73 MB

25 чел.

Федеральное агентство по образованию

Государственное образовательное учреждение

Владимирский государственный университет

Кафедра информационных систем и информационного менеджмента

КУРСОВОЙ ПРОЕКТ

Прототип программной системы «Гостиница»

Выполнил: студент гр. ИСТ-107

Костышева Е.И.

Принял: ст. преп. Грачев И. В.

Владимир, 2010



Содержание

[0.1] 4.6 Организация управления доступом



1 ВВЕДЕНИЕ

Информационные технологии занимают широкое место в современном обществе. Они играют важную роль во всех сферах жизни человека: в работе, в учебе, в отдыхе. Многие функции сегодня выполняет глобальная сеть Интернет. С помощью различных сайтов мы можем не только найти работу, получить какие-либо курсы, но так же найти необходимое место отдыха, посмотреть всю интересующую информацию об этом и т.д.

Одним из мест не только отдыха, но и работы может быть гостиница. Гостиницы бывают различных типов, могут различаться набором сервисов.

В своей курсовой работе я реализую прототип информационной системы «Гостиница». Система должна предоставить пользователю возможность просмотреть список гостиниц, наличие свободных номеров, забронировать понравившийся номер и сразу же, не выходя из системы, сделать предоплату за заказ.


2 ПОСТАНОВКА ЗАДАЧИ

Целью курсового проекта является освоение следующих технологий EJB (Enterprise Java Beans), JPA (Java Persistence API) и JSF (Java Server Faces).

Задача данной курсового проекта заключается в разработке прототипа программной системы «Гостиница».  

Выполнение работы включает разработку следующих вопросов:

1. Анализ предметной области, функциональная декомпозиция системы;

2. Модель данных, содержащая в себе не менее 6 взаимосвязанных сущностей;

3. Структура программной системы с разделением на бизнес-логику и логику веб-интерфейса;

4. Реализация бизнес-логики и веб-интерфейса с использованием заданных технологий;

5. Обеспечение целостности данных.

Разрабатываемая программная система должна выполнять функцию «бронирование номера гостиницы и предоплата заказа».

Для осуществления данной функции должны быть реализованы следующие возможности:

  •  Просмотр списка гостиниц;
  •  Просмотр свободных номеров;
  •  Добавление личных данных клиента;
  •  Бронирование понравившегося номера;
  •  Внесение предоплаты за бронирование;


3 АНАЛИЗ ЗАДАЧИ И ФУНКЦИОНАЛЬНАЯ ДЕКОМПОЗИЦИЯ СИСТЕМЫ

3.1 Описание предметной области

Гостиница — дом с меблированными комнатами («номерами») для временного проживания путешественников. В зависимости от уровня гостиницы, в них существуют дополнительные услуги: рестораны, дискотеки, казино, бассейны и др.

Так же гостиница – имущественный комплекс (здание, часть здания, оборудование или иное имущество) предназначенный для предоставления услуг размещения туристов.

Постояльцы проживают в гостиницах по разным целям – это может быть, как и в случае отдыха, так и по работе. Наша цель – подобрать доступную гостиницу из имеющейся на сайте базы данных. Так же вы можете оставлять ваши отзывы и пожелания.

Сейчас существует множество гостиниц различного типа - мотель, кемпинг, ротель, флотель, ботель, туристская база, туристский приют.

Гостиницы возникли первоначально как постоялые дворы в пунктах на пути следования важнейших транспортных маршрутов, в крупных городах. Первые гостиницы существовали в странах древнего мира. Увеличение числа путешественников в Новое время (развитие торговых отношений, колонизация) способствовало расширению гостиничной индустрии. Современный тип крупных гостиниц сложился в XIX веке. Сегодня существует множество гостиничных цепей различающихся качеством обслуживания, наличием тех или иных дополнительных услуг, стоимостью. Конечно же, все это зависит от типа гостиницы.

Для того чтобы легче определить уровень гостиницы, была введена звёздная система классификации (от одной до пяти звёзд). В общих чертах такая классификация выглядит следующим образом:

1) Одна звезда — дешёвая гостиница с минимумом услуг (ежедневная уборка номеров не всегда в них входит). Все номера одного типа.

2) Две звезды — малобюджетная гостиница, также с минимумом услуг, но с обязательной ежедневной уборкой номеров. Один-два типа номеров.

3) Три звезды — гостиница среднего класса со стандартным набором услуг: ежедневная уборка номеров, санузел, телевизор, мини-бар или холодильник в каждом номере; на территории гостиницы имеются прачечная для постояльцев, бассейн, тренажёрный зал, бизнес-центр, место для предоставляемого гостиницей завтрака. Некоторые из этих услуг могут отсутствовать, в то же время могут быть другие. Наличие различных типов номеров (одноместные, двухкомнатные, для курящих, не курящих и т. д.).

4) Четыре звезды — гостиница высокого класса, предоставляющие все вышеуказанные услуги, а также специальные (вроде спа, массажей, наличие нескольких баров и ресторанов, конференц-залов). Цены на номера в таких гостиницах значительно выше средних.

5) Пять звёзд — гостиница класса люкс. Отличаются обширным набором услуг, особенно эксклюзивных (напр., наличие частного гольф-клуба, многокомнатных апартаментов с прислугой). Гостю уделяется персональное внимание, способствующее учету всех его пожеланий. Цены на проживание в номерах в таких гостиницах достаточно высокие, равно как и на дополнительные услуги. Как правило, в эту категорию стремятся попасть все известные мировые отельные бренды и курортные отели. Несмотря на различие систем под «пятизвёздочным отелем» всегда понимается гостиница наивысшего сервиса. Некоторые гостиницы претендуют на 6 или даже 7 звёзд, однако пока это не вошло в повсеместную гостиничную практику и является скорее маркетинговым ходом.

В России официальная система классификации гостиниц регламентируется Федеральным Агентством по туризму Российской Федерации.

Стандартная обстановка номера обычно включает в себя кровать, платяной шкаф, небольшой стол и отдельную туалетную комнату с душем и нередко джакузи). Большинство номеров среднего класса гостиниц комплектуются кондиционером, телефоном, телевизором, будильником, утюгом, гладильной доской, феном, кофеваркой. Всё более повсеместным становится наличие доступа к беспроводной скоростной линии Интернета (бесплатно или за отдельную плату). Некоторые номера включают в себя небольшие кухни с плитой.

Апартаменты, как правило, состоят из двух и более комнатных отделов. К апартаментам также относят одну крупную комнату, разделённую на спальню и гостиную. «Президентские апартаменты», пентхаусы и прочие подобные номера класса люкс обеспечиваются максимальным ассортиментом услуг, включая полный бар, личную прислугу, индивидуально приготовленный обед и т. п.

Цены в гостиницах зависят от множества факторов: её уровня, её месторасположения, сезона, дня недели, заполненности гостиницы, типа номера, этажа, вида из окна и др. Кроме того, надо обращать внимание, какие услуги включены в стоимость номера, а какие — предоставляются за дополнительную плату (например,  завтрак, пользование Интернетом, мини-баром и т. п.).

Забронировать индивидуальный номер можно напрямую с гостиницей по телефону или через веб-сайт — её собственный, принадлежащий бренду данной гостиницы или подключенный к одной из систем, осуществляющей онлайн бронирование.

3.2 Сценарий взаимодействия пользователя с системой

Взаимодействие пользователя с информационной системой осуществляется через веб-браузер.

3.3 Приветствие

При входе в систему появляется приветствие и пользователь может ввести название города, чтобы увидеть список гостиниц, удовлетворяющих условию запроса.

Рис 1. Страница приветствия

3.4 Страница отображения списка отелей

При нажатии на кнопку «Выбрать город» осуществляется переход на страницу, где происходит отображение информации в таблице и пользователю предлагается на выбор либо вернуться на страницу выбора города, либо перейти на следующую страницу, где он сможет проверить, занят номер или нет на нужную ему дату.

Рис. 2. Страница списка отелей

3.5 Страница проверки занятости номера

При нажатии на кнопку «Выбрать комнату» осуществляется переход на страницу, где пользователю предлагается ввести дату начала проживания, чтобы проверить наличие свободных номеров на эту дату.

Рис 3. Страница ввода даты

3.6 Поиск свободного номера

При нажатии на кнопку «Ввести дату» осуществляется переход на страницу, где пользователь видит список свободных номеров, удовлетворяющих условиям запроса. Далее пользователю предлагается перейти заново к выбору даты (если ниодин номер не освободился), либо перейти на страницу заполнения анкеты.

Рис. 4. Страница просмотра свободных номеров

3.7 Заполнение личных данных

При нажатии на кнопку «Заполнить анкету» появляется страница с формой, где пользователь должен заполнить все поля. Если по какой-либо причине он этого не сделает, появится ошибка, чтобы он заполнил поля.

Рис.5 Страница заполнения личных данных пользователя

3.8 Оформление бронирования и внесение предоплаты

Последнее действие пользователя – заполнение формы бронирования и предоплата номера. Пользователю предлагается ввести даты начала и окончания проживания, свой логин, номер счета и величину предоплаты, далее нажать на кнопку «Забронировать», после чего появится страница об успешном бронировании и будет предложено воспользоваться услугами еще раз. Результатами данных действий в базе данных фиксируется запись о бронировании номера и осуществляется снятие денег со счета клиента.

Рис.7 Страница оформления бронирования

Рис. 8 Последняя страница


4 СТРУКТУРНАЯ ОРГАНИЗАЦИЯ СИСТЕМЫ

4.1 Общие принципы организации системы

Веб-приложение «HotelBank» построено на базе архитектуры Model-View-Сontroller (MVC). В архитектуре MVC приложение разделяется на три части – модель, представление и контроллер.

Модель представляет данные и бизнес-логику или операции, которые управляют доступом и изменением данных. Модель позволяет представлениям получить доступ к своему состоянию и оповещает их о его изменениях. Модель позволяет контроллеру выполнять функции приложения, инкапсулированные в модели.

Представление отображает содержимое модели. Оно берет данные из модели и определяет, как они будут представлены, а также выполняет обновление при изменении модели. Представление направляет ввод пользователя на контроллер.

Контроллер определяет поведение приложения. Он обрабатывает запросы пользователя и выбирает необходимые представления. Контроллер интерпретирует ввод пользователя и определяет, какое действие должна выполнить модель. Контроллер определяет отображаемое представление по действиям пользователя и результатам операций с моделью.

Модель не зависит ни от вида, ни от контроллера, что позволяет одновременно строить различные интерфейсы пользователя для взаимодействия с одной и той же моделью данных.

В качестве шаблон MVC для веб-приложений выбран JSF. Каркас JSF обеспечивает обработку запросов JavaBeans - компонентов, относящимся к модели приложения. JSF поддерживает на стороне сервера представление интерфейса пользователя в виде дерева компонентов, запоминающих свое состояние между запросами. Определена библиотека стандартных компонентов интерфейса пользователя и имеется возможность разработки дополнительных компонентов. Представление, как правило, разрабатывается в виде JSP-страниц, использующих дополнительную библиотеку действий JSP для вывода компонентов интерфейса пользователя. Связь между представлением и состоянием приложения обеспечивается с помощью особых выражений языка EL.

Технология Java Server Faces включает:

  •  Набор API для представления компонент пользовательского интерфейса (UI) и управления их состоянием, обработкой событий и валидацией вводимой информации, определения навигации, а также поддержку интернационализации и доступности.
  •  Специальная библиотека XHTML-тегов для выражения интерфейса JSF на XHTML странице.

EJB-компоненты предназначены для реализации бизнес-логики приложения. Основная задача EJB-компонентов – обеспечить реализацию процедур обработки данных и бизнес-правил, специфичных для приложения. EJB-компоненты формируют промежуточный слой, который обеспечивает изоляцию клиентских приложений (веб-приложений, веб-сервисов, GUI-приложений) от деталей внутренней организации данных (типа и местоположения БД, используемого для связи с ними API и их внутренней структуры), предоставляя им некоторый прикладной программный интерфейс, ориентированный на решение определенного круга задач для конкретного клиента.

Поскольку задачи, решаемые при разработке промежуточного слоя, различны, существуют и различные типы EJB-компонентов:

– сессионные (Session Beans);

– компоненты-сущности (Entity Beans);

– компоненты, управляемые сообщениями (Message Driven Beans).

Схема построения EE-приложения представлена на рис.9.

Рис.9. Схема построения EE-приложения

4.2 Организация доступа к данным

Для организации доступа к данным используется JPA (Java Persistence API) – набор прикладных интерфейсов Java для объектно-реляционного преобразования на платформах Java SE И Java EE. Структура Java EE-приложения, использующего JPA, представлена на рис. 10.1.

Рис.10.1. Структура Java EE-приложения, использующего JPA

EB (Entity Beans) - EJB-компоненты специального вида, предназначенные для организации компонентного интерфейса доступа к данным источника.

Сущности представляют работу с данными как с системой объектов, при этом состояние объектов, моделируемое их полями, отражает состояние данных в соответствующем источнике. Вызывая методы объектов, клиент изменяет их состояние. Изменение состояния объектов синхронизируется с источником данных автоматически под управлением контейнера или по требованию приложения.

Сущности позволяют моделировать отношения, существующие между элементами данных, при этом контейнер не обеспечивает соблюдение правил целостности.

Модуль персистентности позволяет отобразить управляемые с его помощью классы сущностей на единственную реляционную базу данных, определяя, таким образом, контекст для запросов и связей между сущностями.

Контекст персистентности (persistence context) представляет собой множество экземпляров сущностей одного модуля персистентности, в котором любому постоянному идентификатору сущности соответствует единственный экземпляр сущности. В контексте хранятся экземпляры сущностей, которые были прочитаны из БД и/или которые нужно сохранить в БД.

С контекстом персистентности всегда связан экземпляр менеджера сущностей (объект типа javax.persistence.EntityManager), который  управляет жизненным циклом экземпляров сущностей, находящихся в рамках данного контекста.

Контекст персистентности существует только во время выполнения приложения и имеет ограниченное время жизни: в контексте транзакции или расширенное, охватывающее несколько транзакций.

Разработанная программная система на информационном уровне включает в себя две реляционные базы данных («workandfun» и «bank»), хранящиеся на сервере MySQL.

Диаграммы классов сущностей программной системы представлены на рис.10.2 и рис.10.3.

Рис.10.2. Диаграмма классов сущностей, соответствующих реляционной БД «workandfun»

Рис.10.3. Диаграмма классов сущностей, соответствующих реляционной БД «bank»

4.3 Организация бизнес-логики

Для организации бизнес-логики используются сессионные компоненты.

Сессионные компоненты делятся на два подвида:

1) сессионные компоненты без состояния (stateless session beans);

2) сессионные компоненты с состоянием (stateful session beans).

SSB предназначены для реализации некоторого функционального API приложения. Между вызовами методов компонента внутри него не должна сохраняться никакая информация о состоянии.

SSB предназначены для моделирования процессов или бизнес-операций. Как правило, они реализуют так называемый «фасад» приложения, с которым взаимодействуют клиенты и который скрывает от них внутренние слои middleware-приложения.

SFSB используются для хранения данных в рамках сеанса работы пользователя с приложением и организации работы с этими данными. При этом данные сеанса не требуется сохранять в постоянном хранилище, так как они актуальны и используются исключительно в рамках сеанса. Данные сеанса реализуются в виде полей класса компонента.

Бизнес-методы могут рассчитывать на то, что эти данные будут сохраняться между последовательными вызовами, сделанными в рамках сеанса. Более того, в отличие от SSB вызовы, сделанные клиентом на одном и том же экземпляре компонента, обязательно будут обработаны одним и тем же экземпляром класса SFSB-компонента.

Диаграмма классов сессионных компонентов представлена на рис.11.

Спецификация классов сессионных компонентов:

  1.  HotelDAO – сессионный компонент без состояния. Реализует интерфейс HotelDAOLocal.

Поля: private EntityManager em – менеджер сущностей.

  1.  HotelDAOLocal – локальный интерфейс для работы с сущностями, соответствующими таблицам БД “workandfun”.

Методы: public Collection<Hotel> getHotelByTown(String Town) – возвращает список отелей по городу, в котором они расположены. Параметр: String Town  - город отеля. Возвращает: Collection<Hotel> - список отелей.

public List<Room> getRoomByDate(Date DateOfDeparture) – возвращает список свободных комнат по введенной дате. Параметр: Date DateOfDeparture – дата. Возвращает: List<Room> - список найденных комнат.

public void addClient(Client c) – добавляет информацию о клиенте в базу данных. Параметр: Client с – объект типа клиент.

public Client getIdOfClient(int Passport) – возвращает единственный результат – идентификатор клиента по уникальному полю «Паспорт». Параметр: int Passport – серия и номер паспорта клиента. Вовращает: Client – клиента.

public void Booking(Client c, Booking b, Room r) – осуществляется добавление новой записи в таблицу бронирования. Параметры:  Client с – объект типа клиент, Booking и – объект типа бронирование, Room к – объект типа комната.

public Room getRoomByNumber(int Number) - возвращает единственный результат – комнату по уникальному полю «Номер комнаты». Параметр: int Number – номер комнаты. Вовращает: Room – комната.

  1.  BankDAO – сессионный компонент без состояния. Реализует интерфейс BankDAOLocal.

Поля: private EntityManager em – менеджер сущностей.

  1.  BankDAOLocal - локальный интерфейс для работы с сущностями, соответствующими таблицам БД “bank”.

Метод:

public int takeMoneyFromSchet(String Surname, int SchetNumber, int Money) – обновляет поле таблицы базы данных. Параметры: String Surname – фамилия клиента, int SchetNumber – номер счета, int Money – количество денег на счете. Возвращает: обновляет строку в таблице.

  1.  statefulBean – сессионный компонент с состоянием. Реализует интерфейс statefulBeanLocal.

Поля: private Booking booking – текущее бронирование.

private String surname – фамилия клиента.

private int schetNumber – номер счета клиента.

private int money – количество денег на счете.

private java.util.Date Data – дата начала проживания.

private java.util.Date Data1 – дата окончания проживания.

private HotelDAOLocal hotelDAO – локальный интерфейс для работы с сущностями БД «workandfun».

private BankDAOLocal bankDAO – локальный интерфейс для работы с сущностями БД «bank».

  1.  statefulBeanLocal – локальный интерфейс.

Метод: public void BronAndUpdate() – использует 2 метода из сессионных компонентов без состояния – метод бронирования (HotelDAO) и обновления поля (BankDAO).

Рис.11. Диаграмма классов сессионных компонентов

4.4 Организация веб-интерфейса

В приложении «HotelBank» используется технология XHTML для декларативного модульного описания шаблона страниц.

Приложение «HotelBank» содержит следующие XHTML-страницы:

  1.  Test.xhtml – главная страница приложения, страница ввода города. Содержит форму перехода.
  2.  hotels.xhtml – страница, содержащая таблицу со списком отелей, удовлетворяющих критериям поиска. Также содержит 2 кнопки перехода.
  3.  data.xhtml – страница, предлагающая пользователю ввести дату начала проживания. Так же содержит форму перехода.
  4.  rooms.xhtml – страница, содержащая список комнат, удовлетворяющих условию поиска. Список страниц выводится в таблицу, в которой пользователь может выбрать нужный номер и с помощю кнопок перехода осуществить перемещение на другие страницы.
  5.  index.xhtml – страница, содержащая поля ввода данных, для заполнения личной информации о клиенте. Содержит также кнопку перехода на другую страницу.
  6.  bron.xhml – страница заполнения формы бронирования и внесения предоплаты за номер. Содержит поля ввода данных и кнопки перехода.
  7.  end.xhtml – последняя страница. Содержит сообщение и кнопку перехода на главную страницу приложения.

4.5 Взаимодействие веб-компонентов и EJB-компонентов для бронирования и внесения предоплаты за номер.

Диаграммы последовательностей, иллюстрирующие взаимодействие частей системы для выполнения заданной функции представлены на рис.12.

Рис.12. Диаграмма взаимодействия: бронирование номера и предоплата.

4.6 Организация управления доступом

Данная система является открытой для всех пользователей. Они могут осуществлять добавление личных данных в БД, бронирование. Все остальные действия с данными в БД может осуществлять только администратор приложения (либо человек, имеющий все права дотупа к данным).


5 РЕАЛИЗАЦИЯ КОМПОНЕНТОВ СИСТЕМЫ

5.1 EJB-компоненты

5.1.1 EJB-модуль Hotel

Модуль персистентности определен в EJB-модуле Hotel с помощью файла persistence.xml.

Диаграмма классов сущностей, содержащихся в EJB-модуле Hotel представлена на рис.10.2

Спецификация классов сущностей:

1) public class Hotel - содержит информацию об отелях.

Атрибуты класса:

private int id_h – идентификатор отеля;

private String Name – название отеля;

private int Phone – номер телефона отеля;

private String Town – город, в котором находится отель;

private String Type – тип отеля (количество звезд).

Методы класса: set- и get-методы полей. Переопределенные методы класса Object hashCode(), equals(Object object), toString().

2) public class Client - содержит информацию о клиентах гостиницы.

Атрибуты класса:

private int id_с – идентификатор клиента;

private String FIO – ФИО клиента;

private int Passport – серия и номер паспорта клиента;

private String Cl_Town – город клиента.

Методы класса: set- и get-методы полей. Переопределенные методы класса Object hashCode(), equals(Object object), toString().

3) public class Room - содержит информацию о комнатах в отелях.

Атрибуты класса:

private int id_r – идентификатор комнаты;

private int Number – номер комнаты;

private int Places – количество спальных мест;

private int Floor – этаж;

private int Price – цена комнаты;

private int id_hot – внешний ключ, связь с сущностью Hotel.

Методы класса: set- и get-методы полей. Переопределенные методы класса Object hashCode(), equals(Object object), toString().

4) public class Booking - содержит информацию о бронировании клиентами номера.

Атрибуты класса:

private int id_b – идентификатор позиции бронирования;

private int id_cl – внешний ключ, связь с сущностью Client;

private int id_ro – внешний ключ, связь с сущностью Room;

private Date DateOfArrival – дата начала проживания;

private Date DateOfDeparture – дата окончания проживания;

Методы класса: set- и get-методы полей. Переопределенные методы класса Object hashCode(), equals(Object object), toString().

Все классы сущностей отмечены аннотацией Entity.

Классы сущностей реализуют интерфейс Serializable, что является необходимым при передаче экземпляра сущности по значению как отсоединённый объект, например, через удалённый интерфейс.

Для идентификаторов используется генерация ключей:

@GeneratedValue(strategy = GenerationType.IDENTITY)

Для работы с сущностями реализован компонент без состояния (HotelDAO) и его локальный интерфейс (HotelDAOLocal). Менеджер сущностей получают с помощью аннотации PersistenceContext, элементы которой позволяют указать имя модуля персистентности (unitName) и время жизни контекста (type).

@PersistenceContext(unitName = "HotelPU")

5.1.2 EJB-модуль Bank

Модуль персистентности определен в EJB-модуле Bank с помощью файла persistence.xml.

Диаграмма классов сущностей, содержащихся в EJB-модуле EJBBooklife представлена на рис.10.3.

Спецификация классов сущностей:

1) public class Personinfo - содержит информацию о клиентах банков.

Атрибуты класса:

private int id_p – идентификатор клиента банка;

private String Surname – фамилия (логин) клиента;

private int SchetNumber – номер счета клиента;

private int Money – количество денег на счете.

Методы класса: set- и get-методы полей. Переопределенные методы класса Object hashCode(), equals(Object object), toString().

2) public class Bankinfo - содержит информацию o банках.

Атрибуты класса:

private int id_b – идентификатор банка;

private String BName – название банка;

private int id_pe – внешний ключ, связь с таблицей Personinfo.

Методы класса: set- и get-методы полей. Переопределенные методы класса Object hashCode(), equals(Object object), toString().

Для работы с сущностями реализован компонент без состояния (BankDAO) и его локальный интерфейс (BankDAOLocal). Менеджер сущностей получают с помощью аннотации PersistenceContext.

@PersistenceContext (unitName=”BankPU”)

5.2 Веб-компоненты

В данной  работе мы используем каркас JSF 2.0 – каркас серверных компонентов пользовательского интерфейса для веб-приложений, построенных на технологии Java™.  Поэтому на XHTML странице вставляем следующие директивы:

xmlns:h="http://java.sun.com/jsf/html"

xmlns:f="http://java.sun.com/jsf/core"

Компоненты JSF могут использоваться  на XHTML странице только в том случае, если они находятся внутри корневого элемента <h: form> </h: form>.

Так же в данной работе мы используем библиотеку компонентов PrimeFaces 2.0.1. Для этого на странички устанавливаем следующую директиву:

xmlns:p="http://primefaces.prime.com.tr/ui"

5.2.1 Классы управляемых бинов

В приложении один класс управляемых бинов – HotelBean.

Спецификация класса управляемого бина HotelBean:

Поля класса:

private HotelDAOLocal hotelDAO – локальный интерфейс сессионного компонента HotelDAO;

private BankDAOLocal bankDAO – локальный интерфейс сессионного компонента BankDAO;

private statefulBeanLocal sfsb – локальный интерфейс сессионного компонента statefulBean;

private Client client – информация о клиенте;

private Room room – информация о комнате;

private java.util.Date Data – дата начала проживания;

private java.util.Date Data1 – дата окончания проживания;

private java.util.Date Data2 – дата, вводимая для поиска нужной комнаты;

private String fio – ФИО клиента;

private int passport – серия и номер паспорта клиента;

private String clTown – город клиента;

private String town – город, в котором расположен отель;

private int number – номер комнаты;

private Collection<Hotel> hotCollection – найденные отели;

private List<Room> roomsList – найденные комнаты;

private Room select – переменная, хранящая в себе объекты типа Room;

private String surname – фамилия (логин) клиента банка;

private int schetNumber – номер счета клиента банка;

private int money;количество денег на счете;

Конструктор класса: public HotelBean().

Методы класса:

public String getHotelsList() – возвращает список отелей;

public String getProverka() – возвращает список свободных номеров;

public String getNumberRoom() - возвращает комнату по ее номеру;

public String AddClientInDB() – добавляет данные о клиенте в БД;

public String getPassportClient() – возвращает идентификатор только что добавленного клиента.

public String BronUpd() – добавляет данные о бронировании в одну БД и обновляет поле Money в другой БД.

Так же здесь находятся set- и get-методы полей.

5.2.2 XHTML-страница rooms.xhtml

На данной странице происходит отображение списка найденных номеров по введенной дате.  

<?xml version='1.0' encoding='UTF-8' ?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"

     xmlns:ui="http://java.sun.com/jsf/facelets"

     xmlns:h="http://java.sun.com/jsf/html"

     xmlns:f="http://java.sun.com/jsf/core"

     xmlns:c="http://java.sun.com/jsp/jstl/core"

     xmlns:p="http://primefaces.prime.com.tr/ui">

   <h:head>

       <title>Найденные номера</title>

   </h:head>

   <h:body>

       <body background="img/heart48.jpg">

           <h:form>

               <center>

                   <font FACE ="Comic Sans MS" color="midnightblue">

                       <br/><h3>Найденные номера:</h3><br/>

                       <p:dataTable  var="rc" value="#{HotelBean.roomsList}"

                                     selection="#{HotelBean.select}" selectionMode="single">

                           <p:column>

                               <f:facet name="header">

                                   <h:outputText value="ID"/>

                               </f:facet>

                               <h:outputText value="#{rc.idR}"/>

                           </p:column>

                           <p:column>

                               <f:facet name="header">

                                   <h:outputText value="Номер"/>

                               </f:facet>

                               <h:outputText value="#{rc.number}"/>

                           </p:column>

                           <p:column>

                               <f:facet name="header">

                                   <h:outputText value="Этаж"/>

                               </f:facet>

                               <h:outputText value="#{rc.floor}"/>

                           </p:column>

                           <p:column>

                               <f:facet name="header">

                                   <h:outputText value="Количество мест"/>

                               </f:facet>

                               <h:outputText value="#{rc.places}"/>

                           </p:column>

                           <p:column>

                               <f:facet name="header">

                                   <h:outputText value="Цена"/>

                               </f:facet>

                               <h:outputText value="#{rc.price}"/>

                           </p:column>

                       </p:dataTable>

                       <br/>

                       <h:commandLink action="/data.xhtml" value="Вернуться и поменять дату"/><br/>

                       <h:commandLink action="#{HotelBean.getNumberRoom}" value="Перейти к добавлению личных данных"/><br/>

                   </font>

               </center>

           </h:form>

       </body>

   </h:body>

</html>

5.2.3 XHTML-страница bron.xhtml

На данной странице происходит заполнение полей бронирорования и снятие денег со счета.

<?xml version='1.0' encoding='UTF-8' ?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"

     xmlns:h="http://java.sun.com/jsf/html"

     xmlns:p="http://primefaces.prime.com.tr/ui">

   <h:head>

       <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>

       <title>Бронирование</title>

   </h:head>

   <h:body>

       <body background="img/heart48.jpg">

           <h:form>

               <center>

                   <font FACE ="Comic Sans MS" color="midnightblue">

                       <tr></tr>

                       <br/><h2>Заполните пожалуйста поля для бронирования номера.</h2>

                       <table>

                           <tr>

                               <td>

                                   Дата начала проживания:

                               </td>

                               <td>

                                   <p:calendar pattern="yyyy-MM-dd" value="#{HotelBean.data}" />

                               </td>

                           </tr>

                           <tr>

                               <td>

                                   Дата окончания проживания:

                               </td>

                               <td>

                                   <p:calendar pattern="yyyy-MM-dd" value="#{HotelBean.data1}" />

                               </td>

                           </tr>

                       </table>

                       <br/>!!!Стоимость номера:

                       <h:outputText value="#{HotelBean.select.price}"/><br/>

                       Вы можете оплатить полную стоимость номера или 50%<br/>

                       как минимум!!!

                       <br/> <h3>Введите свои данные:</h3>

                       <table>

                           <tr>

                               <td>

                                   Фамилия:

                               </td>

                               <td>

                                   <h:inputText value="#{HotelBean.surname}" />

                               </td>

                           </tr>

                           <tr>

                               <td>

                                   Номер счета:

                               </td>

                               <td>

                                   <h:inputText value="#{HotelBean.schetNumber}"/>

                               </td>

                           </tr>

                           <tr>

                               <td>

                                   Сумма:

                               </td>

                               <td>

                                   <h:inputText value="#{HotelBean.money}"/>

                               </td>

                           </tr>

                       </table>

                       <br/>

                       <h:commandButton action="#{HotelBean.BronUpd}" value="Забронировать и оплатить номер"/>

                   </font>

               </center>

           </h:form>

       </body>

   </h:body>

</html>

5.2.4 Конфигурирование JSF-приложения

В предыдущий версиях JSF сущесвовал файл faces-config.xml, в котором прописывались все равила навигации, устанавливались параметры приложения, объявлялись управляемые бины.

В новой версии JSF (JSF 2.0) пользователь может воспользоваться так называемой неявной навигацией для перехода между страницами. Это могут быть сами кнопки, параметрами которых являются страницы, либо страницы могут указываться в возвращаемых переменных методов управляемых бинов, говоря иначе, при успешном выполнении метода осуществляется переход на нужную страницу.

Представим, как бы выглядела диаграмма переходов для моего приложения.

5.3 Физическая структура баз данных

5.3.1 База данных workandfun

База данных «workandfun» реализована в MySQL Query Browser. Она содержит 4 связанных между собой таблиц.

Таблица Hotel

Рис.13. Описание полей таблицы Hotel

Внешних ключей нет.

Таблица Client 

Рис. 14. Описание полей таблицы Client

Внешних ключей нет.

Таблица Room

Рис. 15. Описание полей таблицы Room.

Внешний ключ – id_hot для установления связи с таблицей Hotel.

Таблица Booking

Рис. 16. Описание полей таблицы Booking.

.

Внешние ключи – id_cl  для установки связи с таблицей Client и id_ro для установления связи с таблицей Room.

Скрипт создания БД «workandfun» представлен в приложении В.

5.3.2 База данных bank

База данных «bank» реализована в MySQL Query Browser. Она содержит 3 связанных между собой таблицы.

Таблица Personinfo

Рис.17. Описание полей таблицы Personifo

Внешних ключей в таблице нет.

Таблица Bankinfo

Рис.18. Описание полей таблицы Bankinfo

Внешние ключи: id_pe для установления связи с таблицей Personinfo.

Скрипт создания БД «bank» представлен в приложении В.

5.4 Обеспечение целостности данных

5.4.1 Ограничения целостности

Таблица обычно имеет столбец или комбинацию столбцов, значения которых уникально идентифицируют каждую строку в таблице. Этот столбец (или столбцы) называется первичным ключом таблицы и нужен для обеспечения ее целостности.

Таблица может иметь только одно ограничение PRIMARY KEY, причем ни один из включенных в первичный ключ столбцов не может принимать значение NULL. При попытке использовать в качестве первичного ключа столбец (или группу столбцов), для которого ограничения первичного ключа не выполняются, первичный ключ создан не будет, а система выдаст сообщение об ошибке.

Ограничения целостности сущности обеспечивают целостность сущности самой по себе. Наиболее важным в ограничении целостности сущности является то, что каждая сущность должна быть уникально идентифицируемой. Это ограничение реализуется путем задания первичного ключа для таблицы.

5.4.2 Организация распределенных транзакций

В приложении используется декларативное управление транзакциями, то есть транзакция инициируется представлением EJB–компонента. Последовательность действий приведена на рис. 19.

Рис.19. Декларативное управление транзакциями

Если транзакциями управляет контейнер, то разработчик компонента не может непосредственно управлять началом и завершением транзакции, но может повлиять на этот процесс с помощью транзакционного атрибута. В данном приложении для каждого метода сессионного компонента установлено значение транзакционного атрибута REQUIRED с помощью аннотации @TransactionAttribute.

Атрибут REQUIRED указывает, что бизнес-метод компонента всегда будет выполняться в контексте транзакции: клиентской (если транзакция была начата клиентом), либо автоматически запущенной новой транзакции (если клиент сделал вызов вне контекста какой-либо транзакции).

Наример, в методе BronAndUpdate, в котором происходит создание и изменение сущностей в обеих БД, при откате транзакции в сессионном фасаде для одной из БД инициирует откат глобальной транзакции, то есть все изменения в обеих БД отменяются.

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)

   public void BronAndUpdate() throws SQLException {

       Booking mybooking = new Booking();

       mybooking.setDateOfArrival(new java.sql.Date(Data.getTime()));

       mybooking.setDateOfDeparture(new java.sql.Date(Data1.getTime()));

       hotelDAO.Booking(hotelDAO.getCli(), mybooking, hotelDAO.getRoo());

       bankDAO.takeMoneyFromSchet(surname, schetNumber, money);

   }

Чтобы СУБД могла принимать участие в распределенной транзакции, для установки соединения с ней следует использовать особый тип источника данных – javax.sql.XADataSource. При работе в рамках сервера приложений компонент получает не тот объект источника данных (типа DataSource, XADataSource, либо ConnectionPoolDataSource), который был создан при конфигурировании сервера приложений, а обертку над ним, реализующую интерфейс DataSource.

Таким образом, с одной стороны, код компонента не зависит от типа выполняемой транзакции (локальная или глобальная). В свойствах пула для первой БД «workandfun» установлены значения по умолчанию (javax.sql.DataSource), а для второй БД «bank» – установлены тип ресурса javax.sql.XADataSource, имя класса источника данных com.mysql.jdbc.jdbc2.optional.MysqlXADataSource.


6 ИНСТРУКЦИЯ ПО УСТАНОВКЕ ПРИЛОЖЕНИЯ

При установке приложения необходимо выполнить следующие операции:

1) Выполнить скрипты баз данных workandfun и bank;

2) Открыть приложения HotelBank, Hotel и Bank в среде NetBeans;

3) Для каждого компонента Hotel и Bank произвести настройку соединения к БД, пулов соединений так, чтобы происходило соединение к БД.

4) В контекстном меню проекта HotelBank выбрать пункт Deploy Project, после успешного завершения установки приложения запустить проект, выбрав в контекстном меню – Run Project.


7 ЗАКЛЮЧЕНИЕ

В результате выполнения курсового проекта был создан прототип программной системы «Гостиница» на основе платформы Java Enterprise Edition (J2EE),  технологий EJB (Enterprise Java Beans), JPA (Java Persistence API), JSF (Java Server Faces), XHTML.  В качестве СУБД использовалась MySQL Server 5.1.

Так как язык Java является кроссплатформенным, то данное приложение сможет работать на любом компьютере и под управлением любой операционной системы, необходимо только добавить библиотеку primefaces-2-0-1.jar. Так же необходимо наличие используемых в приложении БД. Если их нет, воспользуйтесь скриптами. Подключение к БД и пулы соединений рекомендуется настроить в соответствии с пунктом 6 данного проекта.

Для осуществления функции «бронирование и предоплата номера» были реализованы следующие возможности:

  •  Просмотр списка гостиниц;
  •  Просмотр свободных номеров;
  •  Добавление личных данных клиента;
  •  Бронирование понравившегося номера;
  •  Внесение предоплаты за бронирование;

Возможно добавление в систему функций авторизации и регистрации пользователей, отмены внесенных изменений пользователями, получения более подробной информации об услугах.


8 СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

  1.  Будилов В. А. Интернет-программирование на Java/ В.А. Будилов – СПб.: БХВ-Петербург, 2003
  2.  Вершинин М. М. Java 2 Enterprise Edition. Технологии проектирования и разработки. – СПб.: БХВ-Петербург, 2003
  3.  Дейтел Х. М., Дейтел П. Дж., Сантри С. И. Технологии программирования на Java 2. – М.: ООО "Бином-Пресс", 2003
  4.  Гери Д.М. JavaServer Faces: Библиотека профессионала: Вильямс, 2008
  5.  ГОСТ 2.105-95 Общие требования к текстовым документам
  6.  СТП 71.3-04 Дипломное проектирование. Обозначения в документах выпускных квалификационных работ
  7.  Sun Microsystems, Inc. Java Platform, Enterprise Edition (Java EE) Specification, v5, April 28, 2006
  8.  Sun Microsystems, Inc. Java Servlet Specification, v2.5, May 8, 2006
  9.  Sun Microsystems, Inc. JavaServer Pages Specification, v2.1, May 8, 2006
  10.  Sun Microsystems, Inc. JavaServer Faces Specification, v1.2, May 8, 2006
  11.  Sun Microsystems, Inc. JDBC Specification, v3.0, December 1, 2001


ПРИЛОЖЕНИЕ А
Листинг компонентов системы

Класс управляемого бина HotelBean.java

package hotelbank.bean;

import bank.bankdao.BankDAOLocal;

import hotel.entity.Booking;

import hotel.entity.Client;

import hotel.entity.Hotel;

import hotel.entity.Room;

import hotel.hoteldao.HotelDAOLocal;

import hotelbank.stateful.statefulBeanLocal;

import java.io.Serializable;

import java.util.Date;

import java.sql.SQLException;

import java.util.Collection;

import java.util.List;

import javax.ejb.EJB;

import javax.faces.bean.ManagedBean;

import javax.faces.bean.ManagedProperty;

import javax.faces.bean.SessionScoped;

/**

*

* @author Roxy

*/

@ManagedBean(name = "HotelBean")

@SessionScoped

public class HotelBean implements Serializable {

   @EJB

   private HotelDAOLocal hotelDAO;

   @EJB

   private BankDAOLocal bankDAO;

   @EJB

   private statefulBeanLocal sfsb;

   private Client client = new Client();

   private Room room;

   private java.util.Date Data;

   private java.util.Date Data1;

   private java.util.Date Data2;

   @ManagedProperty(value = "")

   private String fio;

   @ManagedProperty(value = "")

   private int passport;

   @ManagedProperty(value = "")

   private String clTown;

   @ManagedProperty(value = "")

   private String town;

   @ManagedProperty(value = "")

   private int number;

   private Collection<Hotel> hotCollection;

   private List<Room> roomsList;

   private Room select;

   @ManagedProperty(value = "")

   private String surname;

   @ManagedProperty(value = "")

   private int schetNumber;

   @ManagedProperty(value = "")

   private int money;

   private HotelBean mbean;

   public HotelBean() {

   }

   //поиск отелей по названию города

   public String getHotelsList() throws SQLException {

       setHotCollection(hotelDAO.getHotelByTown(getTown()));

       return "/hotels.xhtml";

   }

   //поиск комнат по дате

   public String getProverka() throws SQLException {

       setRoomsList(hotelDAO.getRoomByDate(new java.sql.Date(Data2.getTime())));

       hotelDAO.setRoo(getSelect());

       return "/rooms.xhtml";

   }

   //извлечение id комнаты

   public String getNumberRoom() throws Exception {

       Room r = new Room();

       r = getSelect();

       hotelDAO.setRoo(r);

       return "/index.xhtml";

   }

   //добавление клиента в БД

   public String AddClientInDB() throws SQLException {

       Client cl = new Client();

       cl.setFio(getFio());

       cl.setPassport(getPassport());

       cl.setClTown(getClTown());

       hotelDAO.addClient(cl);

       cl = hotelDAO.getIdOfClient(getPassport());

       hotelDAO.setCli(cl);

       return "/bron.xhtml";

   }

   //извлечение id клиента

   public String getPassportClient() throws Exception {

       Client r = new Client();

       r = hotelDAO.getIdOfClient(getPassport());

       hotelDAO.setCli(r);

       return "/bron.xhtml";

   }

   //бронирование и обновление записи

   public String BronUpd() throws SQLException {

       try {

           sfsb.BronAndUpdate();

       } catch (Exception e) {

           return e.getMessage();

       }

       return "/end.xhtml";

   }

   public String getSurname() {

       return sfsb.getSurname();

       //return surname;

   }

   public void setSurname(String surname) {

       sfsb.setSurname(surname);

       this.surname = surname;

   }

   public int getSchetNumber() {

       return sfsb.getSchetNumber();

       //return schetNumber;

   }

   public void setSchetNumber(int schetNumber) {

       sfsb.setSchetNumber(schetNumber);

       this.schetNumber = schetNumber;

   }

   public HotelBean getMbean() {

       return mbean;

   }

   public void setMbean(HotelBean mbean) {

       this.mbean = mbean;

   }

   public int getMoney() {

       return sfsb.getMoney();

       //return money;

   }

   public void setMoney(int money) {

       sfsb.setMoney(money);

       this.money = money;

   }

   public Date getDate() {

       Date date = new Date();

       return date;

   }

   public String getFio() {

       return fio;

   }

   public void setFio(String fio) {

       this.fio = fio;

   }

   public int getPassport() {

       return passport;

   }

   public void setPassport(int passport) {

       this.passport = passport;

   }

   public String getClTown() {

       return clTown;

   }

   public void setClTown(String clTown) {

       this.clTown = clTown;

   }

   public Collection<Hotel> getHotCollection() {

       return hotCollection;

   }

   public void setHotCollection(Collection<Hotel> hotCollection) {

       this.hotCollection = hotCollection;

   }

   public String getTown() {

       return town;

   }

   public void setTown(String town) {

       this.town = town;

   }

   public Client getClient() {

       return client;

   }

   public void setClient(Client client) {

       this.client = client;

   }

   public Room getRoom() {

       return room;

   }

   public void setRoom(Room room) {

       this.room = room;

   }

   public java.util.Date getData() {

       return sfsb.getData();

       //return Data;

   }

   public void setData(java.util.Date Data) {

       sfsb.setData(Data);

       this.Data = Data;

   }

   public java.util.Date getData1() {

       return sfsb.getData1();

       //return Data1;

   }

   public void setData1(java.util.Date Data1) {

       sfsb.setData1(Data1);

       this.Data1 = Data1;

   }

   public java.util.Date getData2() {

       return Data2;

   }

   public void setData2(java.util.Date Data2) {

       this.Data2 = Data2;

   }

   public Room getSelect() {

       return select;

   }

   public void setSelect(Room select) {

       this.select = select;

   }

   public List<Room> getRoomsList() {

       return roomsList;

   }

   public void setRoomsList(List<Room> roomsList) {

       this.roomsList = roomsList;

   }

   public void setNumber(int number) {

       this.number = number;

   }

   public int getNumber() {

       return number;

   }

}

Класс сессионного компонента с состоянием statefulBean.java

package hotelbank.stateful;

import bank.bankdao.BankDAOLocal;

import hotel.entity.Booking;

import hotel.hoteldao.HotelDAOLocal;

import java.sql.SQLException;

import javax.ejb.EJB;

import javax.ejb.Stateful;

import javax.ejb.TransactionAttribute;

import javax.ejb.TransactionAttributeType;

import java.util.Date;

/**

*

* @author Roxy

*/

@Stateful

public class statefulBean implements statefulBeanLocal {

   @EJB

   private BankDAOLocal bankDAO;

   @EJB

   private HotelDAOLocal hotelDAO;

   private Booking booking;

   private String surname;

   private int schetNumber;

   private int money;

   private java.util.Date Data;

   private java.util.Date Data1;

   @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)

   public void BronAndUpdate() throws SQLException {

       Booking mybooking = new Booking();

       mybooking.setDateOfArrival(new java.sql.Date(Data.getTime()));

       mybooking.setDateOfDeparture(new java.sql.Date(Data1.getTime()));

       hotelDAO.Booking(hotelDAO.getCli(), mybooking, hotelDAO.getRoo());

       bankDAO.takeMoneyFromSchet(surname, schetNumber, money);

   }

   @TransactionAttribute(TransactionAttributeType.REQUIRED)

   public BankDAOLocal getBankDAO() {

       return bankDAO;

   }

   @TransactionAttribute(TransactionAttributeType.REQUIRED)

   public void setBankDAO(BankDAOLocal bankDAO) {

       this.bankDAO = bankDAO;

   }

   @TransactionAttribute(TransactionAttributeType.REQUIRED)

   public HotelDAOLocal getHotelDAO() {

       return hotelDAO;

   }

   @TransactionAttribute(TransactionAttributeType.REQUIRED)

   public void setHotelDAO(HotelDAOLocal hotelDAO) {

       this.hotelDAO = hotelDAO;

   }

   @TransactionAttribute(TransactionAttributeType.REQUIRED)

   public Booking getBooking() {

       return booking;

   }

   @TransactionAttribute(TransactionAttributeType.REQUIRED)

   public void setBooking(Booking booking) {

       this.booking = booking;

   }

   @TransactionAttribute(TransactionAttributeType.REQUIRED)

   public String getSurname() {

       return surname;

   }

   @TransactionAttribute(TransactionAttributeType.REQUIRED)

   public void setSurname(String surname) {

       this.surname = surname;

   }

   @TransactionAttribute(TransactionAttributeType.REQUIRED)

   public int getSchetNumber() {

       return schetNumber;

   }

   @TransactionAttribute(TransactionAttributeType.REQUIRED)

   public void setSchetNumber(int schetNumber) {

       this.schetNumber = schetNumber;

   }

   @TransactionAttribute(TransactionAttributeType.REQUIRED)

   public int getMoney() {

       return money;

   }

   @TransactionAttribute(TransactionAttributeType.REQUIRED)

   public void setMoney(int money) {

       this.money = money;

   }

   public java.util.Date getData() {

       return Data;

   }

   public void setData(java.util.Date Data) {

       this.Data = Data;

   }

   public java.util.Date getData1() {

       return Data1;

   }

   public void setData1(java.util.Date Data1) {

       this.Data1 = Data1;

   }

}

Класс сессионного компонента без состояния HotelDAO.java

package hotel.hoteldao;

import hotel.entity.Booking;

import hotel.entity.Client;

import hotel.entity.Hotel;

import hotel.entity.Room;

import java.sql.Date;

import java.sql.SQLException;

import java.util.Collection;

import java.util.List;

import javax.ejb.Stateless;

import javax.persistence.EntityManager;

import javax.persistence.NoResultException;

import javax.persistence.PersistenceContext;

import javax.persistence.Query;

/**

*

* @author Roxy

*/

@Stateless

public class HotelDAO implements HotelDAOLocal {

   @PersistenceContext(unitName = "HotelPU")

   private EntityManager em;

   private Client cli;

   private Room roo;

   public Collection<Hotel> getHotelByTown(String Town) {

       try {

           Query query = em.createNamedQuery("Hotel.findByTown");

           query.setParameter("town", Town);

           return query.getResultList();

       } catch (NoResultException e) {

           return null;

       }

   }

   public List<Room> getRoomByDate(Date DateOfDeparture) {

       try {

           String sql = "SELECT DISTINCT r from Room r, Booking b where b.dateOfDeparture < :dateOfDeparture AND r.idR=b.idRo.idR";

           Query query = em.createQuery(sql);

           query.setParameter("dateOfDeparture", DateOfDeparture);

           return query.getResultList();

       } catch (NoResultException e) {

           return null;

       }

   }

   public void addClient(Client c) throws SQLException {

       Client client = new Client();

       client.setFio(c.getFio());

       client.setPassport(c.getPassport());

       client.setClTown(c.getClTown());

       em.persist(client);

       em.flush();

   }

   public Client getIdOfClient(int Passport) throws SQLException {

       try {

           Query query = em.createNamedQuery("Client.findByPassport");

           query.setParameter("passport", Passport);

           return (Client) query.getSingleResult();

       } catch (NoResultException e) {

           return null;

       }

   }

   public void Booking(Client c, Booking b, Room r) throws SQLException {

       Booking book = new Booking();

       book.setIdCl(c);

       book.setIdRo(r);

       book.setDateOfArrival(b.getDateOfArrival());

       book.setDateOfDeparture(b.getDateOfDeparture());

       em.persist(book);

   }

   public Room getRoomByNumber(int Number) throws Exception {

       try {

           Query query = em.createNamedQuery("Room.findByNumber");

           query.setParameter("number", Number);

           return (Room) query.getSingleResult();

       } catch (NoResultException e) {

           return null;

       }

   }

   public void persist(Object object) {

       em.persist(object);

   }

   

   public Client getCli() {

       return cli;

   }

   public void setCli(Client cli) {

       this.cli = cli;

   }

   public Room getRoo() {

       return roo;

   }

   public void setRoo(Room roo) {

       this.roo = roo;

   }   

}

Класс сущности  Booking.java

package hotel.entity;

import java.io.Serializable;

import java.util.Date;

import javax.persistence.Basic;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.GenerationType;

import javax.persistence.Id;

import javax.persistence.JoinColumn;

import javax.persistence.ManyToOne;

import javax.persistence.NamedQueries;

import javax.persistence.NamedQuery;

import javax.persistence.Table;

import javax.persistence.Temporal;

import javax.persistence.TemporalType;

/**

*

* @author Roxy

*/

@Entity

@Table(name = "booking")

@NamedQueries({

   @NamedQuery(name = "Booking.findAll", query = "SELECT b FROM Booking b"),

   @NamedQuery(name = "Booking.findByIdB", query = "SELECT b FROM Booking b WHERE b.idB = :idB"),

   @NamedQuery(name = "Booking.findByDateOfArrival", query = "SELECT b FROM Booking b WHERE b.dateOfArrival = :dateOfArrival"),

   @NamedQuery(name = "Booking.findByDateOfDeparture", query = "SELECT b FROM Booking b WHERE b.dateOfDeparture = :dateOfDeparture")})

public class Booking implements Serializable {

   private static final long serialVersionUID = 1L;

   @Id

   @GeneratedValue(strategy = GenerationType.IDENTITY)

   @Basic(optional = false)

   @Column(name = "id_b")

   private Integer idB;

   @Basic(optional = false)

   @Column(name = "DateOfArrival")

   @Temporal(TemporalType.DATE)

   private Date dateOfArrival;

   @Basic(optional = false)

   @Column(name = "DateOfDeparture")

   @Temporal(TemporalType.DATE)

   private Date dateOfDeparture;

   @JoinColumn(name = "id_cl", referencedColumnName = "id_c")

   @ManyToOne

   private Client idCl;

   @JoinColumn(name = "id_ro", referencedColumnName = "id_r")

   @ManyToOne

   private Room idRo;

   public Booking() {

   }

   public Booking(Integer idB) {

       this.idB = idB;

   }

   public Booking(Integer idB, Date dateOfArrival, Date dateOfDeparture, Client idCl, Room idRo) {

       this.idB = idB;

       this.dateOfArrival = dateOfArrival;

       this.dateOfDeparture = dateOfDeparture;

       this.idCl = idCl;

       this.idRo = idRo;

   }

   

   public Booking(Integer idB, Date dateOfArrival, Date dateOfDeparture) {

       this.idB = idB;

       this.dateOfArrival = dateOfArrival;

       this.dateOfDeparture = dateOfDeparture;

   }

   public Integer getIdB() {

       return idB;

   }

   public void setIdB(Integer idB) {

       this.idB = idB;

   }

   public Date getDateOfArrival() {

       return dateOfArrival;

   }

   public void setDateOfArrival(Date dateOfArrival) {

       this.dateOfArrival = dateOfArrival;

   }

   public Date getDateOfDeparture() {

       return dateOfDeparture;

   }

   public void setDateOfDeparture(Date dateOfDeparture) {

       this.dateOfDeparture = dateOfDeparture;

   }

   public Client getIdCl() {

       return idCl;

   }

   public void setIdCl(Client idCl) {

       this.idCl = idCl;

   }

   public Room getIdRo() {

       return idRo;

   }

   public void setIdRo(Room idRo) {

       this.idRo = idRo;

   }

   @Override

   public int hashCode() {

       int hash = 0;

       hash += (idB != null ? idB.hashCode() : 0);

       return hash;

   }

   @Override

   public boolean equals(Object object) {

       // TODO: Warning - this method won't work in the case the id fields are not set

       if (!(object instanceof Booking)) {

           return false;

       }

       Booking other = (Booking) object;

       if ((this.idB == null && other.idB != null) || (this.idB != null && !this.idB.equals(other.idB))) {

           return false;

       }

       return true;

   }

   @Override

   public String toString() {

       return "hotel.entity.Booking[idB=" + idB + "]";

   }

}


ПРИЛОЖЕНИЕ Б
Скрипты создания баз данных

1. Скрипт БД «workandfun»

-- MySQL dump 10.13  Distrib 5.1.30, for Win32 (ia32)

--

-- Host: localhost    Database: workandfun

-- ------------------------------------------------------

-- Server version 5.1.30-community

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;

/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;

/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;

/*!40101 SET NAMES utf8 */;

/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;

/*!40103 SET TIME_ZONE='+00:00' */;

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;

/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;

/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;

/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--

-- Table structure for table `booking`

--

DROP TABLE IF EXISTS `booking`;

SET @saved_cs_client     = @@character_set_client;

SET character_set_client = utf8;

CREATE TABLE `booking` (

 `id_b` int(10) unsigned NOT NULL AUTO_INCREMENT,

 `id_cl` int(10) unsigned NOT NULL DEFAULT '0',

 `id_ro` int(10) unsigned NOT NULL DEFAULT '0',

 `DateOfArrival` date NOT NULL DEFAULT '0000-00-00',

 `DateOfDeparture` date NOT NULL DEFAULT '0000-00-00',

 PRIMARY KEY (`id_b`),

 KEY `FK_Booking_1` (`id_cl`),

 KEY `FK_booking_2` (`id_ro`),

 CONSTRAINT `FK_booking_id_cl` FOREIGN KEY (`id_cl`) REFERENCES `client` (`id_c`),

 CONSTRAINT `FK_booking_id_ro` FOREIGN KEY (`id_ro`) REFERENCES `room` (`id_r`)

) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;

SET character_set_client = @saved_cs_client;

--

-- Dumping data for table `booking`

--

LOCK TABLES `booking` WRITE;

/*!40000 ALTER TABLE `booking` DISABLE KEYS */;

INSERT INTO `booking` VALUES (1,1,2,'2010-04-10','2010-04-16'),(2,3,1,'2010-03-05','2010-03-10'),(3,4,4,'2010-04-29','2010-04-30'),(4,2,3,'2010-02-14','2010-03-01'),(5,5,5,'2010-04-20','2010-04-25'),(6,6,6,'2010-03-12','2010-03-17'),(7,7,3,'2010-04-05','2010-04-07');

/*!40000 ALTER TABLE `booking` ENABLE KEYS */;

UNLOCK TABLES;

--

-- Table structure for table `client`

--

DROP TABLE IF EXISTS `client`;

SET @saved_cs_client     = @@character_set_client;

SET character_set_client = utf8;

CREATE TABLE `client` (

 `id_c` int(10) unsigned NOT NULL AUTO_INCREMENT,

 `FIO` varchar(45) NOT NULL DEFAULT '',

 `Passport` int(10) unsigned NOT NULL DEFAULT '0',

 `Cl_Town` varchar(45) NOT NULL DEFAULT '',

 PRIMARY KEY (`id_c`)

) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;

SET character_set_client = @saved_cs_client;

--

-- Dumping data for table `client`

--

LOCK TABLES `client` WRITE;

/*!40000 ALTER TABLE `client` DISABLE KEYS */;

INSERT INTO `client` VALUES (1,'Ivanov',1704555333,'Vladimir'),(2,'Bakiev',1704111222,'Vladimir'),(3,'Runov',1506775665,'St-Petersburg'),(4,'Maheeva',1705777245,'St-Petersburg'),(5,'Tankeeva',1208999885,'Moscow'),(6,'Nikonov',1307099887,'Moscow'),(7,'Ivanov',1704552345,'Vladimir');

/*!40000 ALTER TABLE `client` ENABLE KEYS */;

UNLOCK TABLES;

--

-- Table structure for table `hotel`

--

DROP TABLE IF EXISTS `hotel`;

SET @saved_cs_client     = @@character_set_client;

SET character_set_client = utf8;

CREATE TABLE `hotel` (

 `id_h` int(10) unsigned NOT NULL AUTO_INCREMENT,

 `Name` varchar(45) NOT NULL DEFAULT '',

 `Town` varchar(45) NOT NULL DEFAULT '',

 `Type` varchar(45) NOT NULL DEFAULT '',

 `Phone` int(10) unsigned NOT NULL DEFAULT '0',

 PRIMARY KEY (`id_h`)

) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;

SET character_set_client = @saved_cs_client;

--

-- Dumping data for table `hotel`

--

LOCK TABLES `hotel` WRITE;

/*!40000 ALTER TABLE `hotel` DISABLE KEYS */;

INSERT INTO `hotel` VALUES (1,'Olimp','Moscow','*****',7773377),(2,'Piramida','Moscow','***',3334455),(3,'Mini','St-Petersburg','***',1116755),(4,'Morskaya','St-Petersburg','****',6687755),(5,'Brit','Vladimir','***',421252),(6,'Monomah','Vladimir','****',433433),(7,'Riviera','Moscow','*****',8773433);

/*!40000 ALTER TABLE `hotel` ENABLE KEYS */;

UNLOCK TABLES;

--

-- Table structure for table `room`

--

DROP TABLE IF EXISTS `room`;

SET @saved_cs_client     = @@character_set_client;

SET character_set_client = utf8;

CREATE TABLE `room` (

 `id_r` int(10) unsigned NOT NULL AUTO_INCREMENT,

 `Number` int(10) unsigned NOT NULL DEFAULT '0',

 `Floor` int(10) unsigned NOT NULL DEFAULT '0',

 `Places` int(10) unsigned NOT NULL DEFAULT '0',

 `Price` int(10) unsigned NOT NULL DEFAULT '0',

 `id_hot` int(10) unsigned NOT NULL DEFAULT '0',

 PRIMARY KEY (`id_r`),

 KEY `FK_Room_1` (`id_hot`),

 CONSTRAINT `FK_room_id_hot` FOREIGN KEY (`id_hot`) REFERENCES `hotel` (`id_h`)

) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

SET character_set_client = @saved_cs_client;

--

-- Dumping data for table `room`

--

LOCK TABLES `room` WRITE;

/*!40000 ALTER TABLE `room` DISABLE KEYS */;

INSERT INTO `room` VALUES (1,110,1,3,100,1),(2,120,1,2,150,2),(3,330,3,4,250,4),(4,220,2,3,200,3),(5,550,5,2,180,5),(6,404,4,3,220,2);

/*!40000 ALTER TABLE `room` ENABLE KEYS */;

UNLOCK TABLES;

/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;

/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;

/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;

/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;

/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2010-12-13  2:14:18

 

2. Скрипт БД «bank»

-- MySQL dump 10.13  Distrib 5.1.30, for Win32 (ia32)

--

-- Host: localhost    Database: bank

-- ------------------------------------------------------

-- Server version 5.1.30-community

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;

/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;

/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;

/*!40101 SET NAMES utf8 */;

/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;

/*!40103 SET TIME_ZONE='+00:00' */;

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;

/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;

/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;

/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--

-- Table structure for table `bankinfo`

--

DROP TABLE IF EXISTS `bankinfo`;

SET @saved_cs_client     = @@character_set_client;

SET character_set_client = utf8;

CREATE TABLE `bankinfo` (

 `id_b` int(10) unsigned NOT NULL AUTO_INCREMENT,

 `BName` varchar(25) NOT NULL DEFAULT '',

 `BAddress` varchar(45) NOT NULL DEFAULT '',

 `id_pe` int(10) unsigned NOT NULL DEFAULT '0',

 PRIMARY KEY (`id_b`),

 KEY `FK_bankinfo_id_pe` (`id_pe`),

 CONSTRAINT `FK_bankinfo_1` FOREIGN KEY (`id_pe`) REFERENCES `personinfo` (`id_p`),

 CONSTRAINT `FK_bankinfo_id_pe` FOREIGN KEY (`id_pe`) REFERENCES `personinfo` (`id_p`)

) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;

SET character_set_client = @saved_cs_client;

--

-- Dumping data for table `bankinfo`

--

LOCK TABLES `bankinfo` WRITE;

/*!40000 ALTER TABLE `bankinfo` DISABLE KEYS */;

INSERT INTO `bankinfo` VALUES (1,'Sberbank','Lenina 45',3),(2,'Sberbank','Lenina 45',1),(3,'Uralsib','Gorkogo 11',2);

/*!40000 ALTER TABLE `bankinfo` ENABLE KEYS */;

UNLOCK TABLES;

--

-- Table structure for table `personinfo`

--

DROP TABLE IF EXISTS `personinfo`;

SET @saved_cs_client     = @@character_set_client;

SET character_set_client = utf8;

CREATE TABLE `personinfo` (

 `id_p` int(10) unsigned NOT NULL AUTO_INCREMENT,

 `Surname` varchar(45) NOT NULL DEFAULT '',

 `SchetNumber` int(10) unsigned NOT NULL DEFAULT '0',

 `Money` int(10) unsigned NOT NULL DEFAULT '0',

 PRIMARY KEY (`id_p`)

) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;

SET character_set_client = @saved_cs_client;

--

-- Dumping data for table `personinfo`

--

LOCK TABLES `personinfo` WRITE;

/*!40000 ALTER TABLE `personinfo` DISABLE KEYS */;

INSERT INTO `personinfo` VALUES (1,'Ivanov',12345,38600),(2,'Bakiev',12346,20000),(3,'Runov',123456,10000),(4,'Shilov',123456789,23000);

/*!40000 ALTER TABLE `personinfo` ENABLE KEYS */;

UNLOCK TABLES;

/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;

/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;

/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;

/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;

/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2010-12-13  2:14:43

50

Entity

EJB

Business Layer (SB)

Persistence Layer (EB)

инициализация

Database

     ejb-

контейнер

перенаправление

ответ

запрос

Servlet

(Контроллер)

xhtml (Представление)

     web-

контейнер

Web-браузер

Managed Bean

(Модель)

Session

Bean

Entity

Class

Managed Bean

JSF components

DB


 

А также другие работы, которые могут Вас заинтересовать

75109. Functional Stylistics 238 KB
  The subject of stylistics has so far not been definitely outlined. This is due to a number of reasons. First of all there is confusion between the terms style and stylistics. The first concept is so broad that it is hardly possible to regard it as a term.
75110. Лидерство и власть. Управление поведением: подкрепление, наказание, гашение 19.12 KB
  Лидерство и власть. Власть означает способность возможность влиять на поведение других людей людей с целью подчинить их своей воле. Власть позволяет руководителю распоряжаться действиями подчиненных направлять их в русло интересов организации побуждать сотрудников и более эффективной работе предотвращать возникающие в коллективе конфликты. Определение власти как организационного процесса подразумевает следующее: Власть существует у того кто может ее использовать потенциально т.
75111. Цели и миссии организации 14.55 KB
  В условиях административного управления цели организации во многом задавались вышестоящими уровнями управления например по управлению объёмами производства затратами: в виде заданий по снижению себестоимости товарной продукции и др. Цели это: желаемый будущий результат будущее состояние объекта модель желаемого будущего которые стремится достичь организация и на достижение которых направлена её деятельность в ближайшей перспективе; некоторая область значений отдельных характеристик организации в пространстве возможных состояний...
75112. Конкурентная стратегия 15.62 KB
  Конкурентная стратегия организации нацелена на достижение конкурентных преимуществ рис. Стратегия лидерства по издержкам низких издержек производство продукции сравнимого товара с минимальными издержками с затратами меньшими чем у конкурентов при осуществлении ценовой конкуренции. Конкурентные базовые стратегии Стратегия наиболее успешна если: на рынке доминирует ценовая конкуренция покупателей много конкурентная борьба на рынке идет в основном вокруг цены; производимый товар стандартен недифференцирован его использование...
75114. Основные части и движущие силы организации 59.28 KB
  В стратегическую вершину входят все управляющие звенья компании. Основная цель – управление стратегией и развитием компании управление границами компании. Производственное ядро профессионалы цеха люди выполняющие основную деятельность по профилю компании...
75115. Традиционные модели организационных структур: звёздчатая, линейно-функциональная, дивизиональная, холдинговая, ТНК 2.46 MB
  Под организационной структурой управления понимается совокупность подразделений и уровней управления обеспечивающих развитие компании и ее конкурентоспособность. Оргструктура имеет определенные элементы: структурные подразделения выполняющие определенные функции управления; уровни управления как совокупность подразделений и руководителей занимающих определенную иерархическую ступень; горизонтальные и вертикальные связи обеспечивающие взаимодействие всех подразделений и руководителей; полномочия – право руководителей использовать...
75116. Стратегические партнёрства. Управление проектами 46.52 KB
  Управление проектами. Управление проектами заключается в осуществлении и доведении проекта до логического завершения путем организации и управления людьми временем издержками и ресурсами. Функциональная структура управления проектами включает в себя девять разделов: Управление координацией Project Integrtion Mngement. Управление целями Project Scope Mngement.
75117. Бизнес-планирование. Содержание и цель бизнес-плана 21.64 KB
  Бизнес-план краткое точное доступное и понятное описание предполагаемого бизнеса важнейший инструмент при рассмотрении большого количества различных ситуаций позволяющий выбрать наиболее перспективный желаемый результат и определить средства для его достижения. Бизнес-план является документом позволяющим управлять бизнесом поэтому его можно представить как неотъемлемый элемент стратегического планирования и как руководство для исполнения и контроля.