Создание приложения CRUD JavaServer Faces 2.0 из базы данных
В этом руководстве используется среда IDE NetBeans для создания веб-приложения, взаимодействующего с серверной базой данных. Приложение предоставляет возможность просмотра и изменения данных, содержащихся в базе данных, другими словами – функциональные возможности CRUD (Create, Read, Update, Delete – создание, чтение, обновление, удаление). Разрабатываемое приложение основывается на следующих технологиях:
JavaServer Faces (JSF) 2.0 для веб-страниц внешнего интерфейса, обработки проверки и управления циклом "запрос-ответ".
Интерфейс API сохранения состояния Java (Java Persistence API, JPA) 2.0 с использованием EclipseLink для создания классов сущностей из базы данных и управления транзакциями. (EclipseLink является образцовой реализацией JPA и поставщиком сохранения состояния для сервера GlassFish по умолчанию).
Enterprise JavaBeans (EJB) 3.1 – предоставление компонентов EJB без сохранения состояния, которые имеют доступ к классам сущностей и содержат бизнес-логику для приложения.
В среде IDE предоставляются два мастера для создания всех строк кода приложения. Первый – мастер создания классов сущностей из базы данных, позволяющий создавать классы сущностей из предоставленной базы данных. После создания классов сущностей используйте мастер создания страниц JSF из классов сущностей для создания управляемых компонентов JSF и компонентов EJB для классов сущностей, а также набор страниц Facelets для обработки представления данных классов сущностей. Последний раздел руководства Анализ приложения является дополнительным. В него включено множество упражнений, помогающих лучше понять приложение и ознакомиться со средой IDE.
В целях этого руководства используется база данных консультационного агентства с именем consult. Эта база данных не входит в устанавливаемую среду IDE, поэтому перед изучением этого руководства необходимо создать базу данных.
База данных consult разработана для демонстрации области поддержки среды IDE для обработки различных структур баз данных. Таким образом, эта база данных не предназначена для использования в качестве рекомендуемого примера разработки базы данных или в качестве практической рекомендации. Тем не менее, в нее включено множество возможностей, которые потенциально требуются при разработке базы данных. Например, база данных consult содержит все возможные типы отношений, составные первичные ключи и многие другие типы данных. Подробный обзор структуры базы данных приведен в таблице ниже.
Примечания.
В данном учебном курсе используется сервер базы данных MySQL, однако для работы с этим учебным руководством можно также использовать сервер базы данных JavaDB. Чтобы создать базу данных в JavaDB, загрузите и извлеките архив javadb-consult.zip. Архив содержит сценарии SQL для создания, удаления и заполнения базы данных consult.
При использовании сервера баз данных MySQL и вместе с ним GlassFish версии 3 или Open Source Edition версии 3.0.1 необходимо убедиться, что база данных защищена паролем. (Дополнительную информацию можно получить в описании Issue 12221 (проблема 12221) сервера GlassFish.) При использовании учетной записи MySQL root по умолчанию с пустым паролем с помощью командной строки можно установить другой пароль.
К примеру, чтобы установить пароль к nbuser, необходимо в командную строку ввести следующие команды.
shell> mysql -u root
mysql> UPDATE mysql.user SET Password = PASSWORD('nbuser') WHERE User = 'root';
mysql> FLUSH PRIVILEGES;
Если в ответ получена ошибка "mysql: command not found" (mysql: не найдена команда), это означает, что команда mysql не была добавлена в переменную среды PATH. Вместо этого команду можно вызвать, выбрав полный путь к установочному каталогу MySQL bin. Например, если команда mysql находится на компьютере по пути /usr/local/mysql/bin, выберите следующее:
shell> /usr/local/mysql/bin/mysql -u root
Дополнительную информацию можно получить из справочного руководства MySQL.
Для создания базы данных и подключения к ней из среды IDE выполните следующие действия.
Загрузите mysql-consult.zip и извлеките архив в локальную систему. В результате извлечения архива появятся сценарии SQL для создания и заполнения базы данных. Архив также содержит сценарии для перетаскивания таблиц.
В окне "Службы" разверните узел "Базы данных", правой кнопкой мыши щелкните узел MySQL и выберите "Запустить сервер".
Правой кнопкой мыши щелкните узел "Сервер MySQL" и выберите команду "Создать базу данных".
В диалоговом окне "Создание базы данных MySQL" введите consult в поле "Имя базы данных". Нажмите кнопку "ОК". Под узлом "Базы данных" появится новый узел (jdbc:mysql://localhost:3306/consult [корень в схеме по умолчанию]).
Правой кнопкой мыши щелкните новый узел и выберите "Подключить".
В основном меню выберите "Файл > Открыть файл" и перейдите к извлеченному файлу mysql_create_.sql. Нажмите кнопку "Открыть". Файл автоматически откроется в редакторе SQL.
Убедитесь в том, что в раскрывающемся списке "Подключение" в панели инструментов редактора SQL выбрана база данных consult, затем нажмите кнопку "Запустить SQL" ().
После нажатия кнопки "Запустить SQL" в окне вывода появятся следующие выходные данные.
Изучение структуры базы данных
Чтобы убедиться в том, что таблицы созданы правильно, разверните узел "Таблицы" под узлом подключения к базе данных. В развернутом узле таблицы можно посмотреть столбцы, индексы и внешние ключи. Для просмотра дополнительных сведений о столбце щелкните правой кнопкой мыши столбец и выберите "Свойства".
Примечание. Если под узлом "Таблицы" таблицы не отображаются, щелкните правой кнопкой мыши узел "Таблицы" и выберите команду "Обновить".
Анализ структуры базы данных consult позволяет установить, что база данных содержит таблицы с множеством отношений и различными типами полей. При создании классов сущностей в базе данных в среде IDE автоматически создается соответствующий код для различных типов полей.
В следующей таблице представлено описание таблиц, обнаруженных в базе данных consult.
Таблица базы данных
Описание
Функции разработки
CLIENT
Клиент консультационного агентства
Несгенерированный составной первичный ключ (поля которого не являются частью внешнего ключа)
CONSULTANT
Сотрудник консультационного агентства, которого могут нанять клиенты на контрактной основе.
Включает в себя поле резюме типа LONG VARCHAR.
CONSULTANT_STATUS
Состояние консультанта в консультационном агентстве (пример возможных состояний: "Активно" и "Неактивно").
Несгенерированный первичный ключ типа CHAR.
RECRUITER
Сотрудник консультационного агентства, ответственный за установление связи между клиентами и консультантами.
PROJECT
Проект, под который клиент укомплектовывает штат консультантами консультационного агентства.
Несгенерированный составной первичный ключ, который содержит два поля, составляющие внешний ключ для таблицы CLIENT.
BILLABLE
Количество часов, отработанных консультантом над проектом, которые консультационное агентство выставляет в счете на оплату соответствующему клиенту.
Перекрестные ссылки PROJECT и CONSULTANT, при этом последней соответствует составной первичный ключ.
База данных consult имеет множество отношений. При создании классов сущностей из базы данных в среде IDE автоматически создаются свойства соответствующего типа Java на основе типа SQL столбцов. Следующая таблица описывает отношения сущностей для базы данных consult (обратные отношения не отображаются).
Сущность
Связанная сущность
Информация об отношениях
Описание
CLIENT
RECRUITER
нулевое, "один к одному", с правкой вручную; нулевое, "один ко многим", если без правки.
CLIENT соответствует несколько RECRUITER, а RECRUITER соответствует нуль или один CLIENT (если без правки вручную).
CLIENT
ADDRESS
ненулевое, "один к одному".
CLIENT соответствует один ADDRESS, а ADDRESS соответствует нуль или один CLIENT.
CLIENT
PROJECT
ненулевое, "один ко многим"; в сущности "Проект" значение поля клиента является частью первичного ключа проекта.
CLIENT соответствует несколько PROJECT, а PROJECT соответствует один CLIENT.
CONSULTANT
PROJECT
"многие ко многим".
CONSULTANT соответствует несколько PROJECT, а PROJECT соответствует несколько CONSULTANT.
CONSULTANT
BILLABLE
ненулевое, "один ко многим".
CONSULTANT соответствует несколько BILLABLE, а BILLABLE соответствует один CONSULTANT.
CONSULTANT_STATUS
CONSULTANT
ненулевое, "один ко многим".
CONSULTANT_STATUS соответствует несколько CONSULTANT, а CONSULTANT соответствует один CONSULTANT_STATUS.
CONSULTANT
RECRUITER
нулевое, "один ко многим".
CONSULTANT соответствует нуль или одного RECRUITER, а RECRUITER соответствует несколько CONSULTANT.
BILLABLE
PROJECT
ненулевое, "один ко многим".
BILLABLE соответствует один PROJECT, а PROJECT соответствует несколько BILLABLE.
Теперь, после создания базы данных, можно создать веб-приложение и использовать мастер создания классов сущностей из базы данных для создания классов сущностей на основе таблиц баз данных.
Создание проекта веб-приложения
В этом упражнении будет создан веб-проект и добавлена платформа JavaServer Faces к проекту. При создании проекта выбираем JavaServer Faces на панели "Платформы" мастера создания проекта.
Выберите "Файл > Новый проект" (CTRL+SHIFT+N; ⌘+SHIFT+N в Mac ОС) в главном меню.
Выберите "Веб-приложение" в категории "Java Web". Нажмите кнопку "Далее".
Введите ConsultingAgency в качестве имени проекта и укажите местоположение проекта. Нажмите кнопку "Далее".
Укажите GlassFish в качестве сервера и Java 6 Web в качестве версии Java EE. Нажмите кнопку "Далее".
На панели "Платформы" выберите параметр JavaServer Faces. Нажмите кнопку "Готово".
При нажатии кнопки "Готово" в среде IDE будет создан проект веб-приложения и открыт index.xhtml в редакторе.
Создание классов сущностей из базы данных
После подключения к базе данных в среде IDE можно использовать мастер создания классов сущностей из базы данных для быстрого создания классов сущностей на основе таблиц в базе данных. В среде IDE можно создавать классы сущностей для каждой выбранной таблицы, а также создавать любые классы сущностей для соответствующих таблиц.
В окне "Проекты" щелкните правой кнопкой мыши узел проекта ConsultingAgency и выберите команду "Создать" > "Классы сущностей из базы данных". Если данная команда отсутствует, выберите пункт "Прочие". После этого в мастере создания файла выберите категорию "Сохранение состояния", а затем - пункт "Классы сущностей из базы данных".
Для открытия диалогового окна "Создание источника данных" в раскрывающемся списке "Источник данных" выберите "Новый источник данных".
В поле "Имя JNDI" введите jdbc/consult и выберите jdbc:mysql://localhost:3306/consult [корень на схеме по умолчанию] в качестве подключения к базе данных.
Нажмите кнопку "ОК" для закрытия диалогового окна и возврата в мастер. Таблицы базы данных consult выводятся в окне списка "Доступные таблицы".
Для выбора всех таблиц, имеющихся в базе данных, нажмите кнопку "Добавить все". Нажмите кнопку "Далее".
Введите jpa.entities в качестве имени пакета.
Убедитесь, что установлены оба флажка — и создания именованных запросов, и создания блоков сохранения состояния.
Примечание для среды IDE NetBeans, версия 6.8
Нажмите кнопку "Создать блок сохранения состояния", чтобы открыть диалоговое окно "Создать единицу блок состояния", и используйте значения по умолчанию.
Нажмите кнопку "Готово".
При нажатии кнопки "Готово" среда IDE создает классы сущностей в пакете проекта jpa.entities.
При использовании мастера создания классов сущностей из базы данных в среде IDE проверяются отношения между таблицами базы данных. В окне "Проекты" при развертывании узла пакета jpa.entities можно увидеть, что в среде IDE создан класс сущностей для каждой таблицы, за исключением таблицы PROJECT_CONSULTANT. В среде IDE класс сущностей для таблицы PROJECT_CONSULTANT не создан, так как она является таблицей перекрестных ссылок.
В среде IDE также создано два дополнительных класса для таблиц с составными первичными ключами: CLIENT и PROJECT. К именам классов первичных ключей для этих таблиц (ClientPK.java и ProjectPK.java) добавлено PK.
При просмотре созданного кода для классов сущностей можно отметить, что мастером добавлены аннотации @GeneratedValue к автоматически созданным полям ID и аннотации @Basic(optional = "false") к полям в классах сущностей. На основе аннотаций @Basic(optional = "false") мастер создания страниц JSF из классов сущностей способен создавать код с блоками проверок для предотвращения нарушений в ненулевых столбцах для этих полей.
Создание страниц JSF из классов сущностей
Теперь, после создания классов сущностей, можно создать веб-интерфейс для отображения и изменения данных. Для создания страниц JavaServer Faces используется страницы JSF мастера создания классов сущностей. Код, созданный мастером, основан на аннотациях сохранения состояния, содержащихся в классах сущностей.
Для каждого класса сущностей мастером создается следующее:
сеансовый компонент без состояния;
Примечание. В среде IDE NetBeans, версий 7.0 и 7.1 создается также файл AbstractFacade.java, в котором содержится бизнес-логика создания, получения, изменения и удаления сущности, и каждый сеансовый компонент служит для расширения AbstractFacade.java
управляемый компонент JSF в контексте сеанса;
каталог, содержащий четыре файла Facelets возможностей CRUD (Create.xhtml, Edit.xhtml, List.xhtml и View.xhtml);
набор свойств для локализованных сообщений и соответствующая запись в файле настройки Faces проекта (создается файл faces-config.xml, если он на данный момент отсутствует);
вспомогательные веб-файлы, включая стандартную таблицу стилей для отображения компонентов и файл шаблона Facelets.
Чтобы создать страницу JSF, выполните следующие действия:
Для открытия мастера в окне "Проекты" щелкните правой кнопкой мыши узел проекта и выберите команду "Создать" > "Страницы JSF из классов сущностей". (Если данная команда отсутствует, выберите "Другие". После этого в мастере создания файла выберите категорию "JavaServer Faces", затем "Страницы JSF из классов сущностей".)
В окне "Доступные классы сущностей" выводится список из семи классов сущностей, имеющихся в этом проекте. В окне не выводятся встраиваемые классы (ClientPK.java и ProjectPK.java).
Нажмите кнопку "Добавить все" для переноса всех классов в окно "Выбранные классы сущностей".
Нажмите кнопку "Далее".
На третьем экране мастера "Создание страниц JSF и классов" в поле "Пакет сеансного компонента JPA" введите jpa.session.
В поле "Пакет классов JSF" введите jsf.
В поле "Имя набора локализаций" введите "/resources/Bundle". Будет создан пакет с именем resources, в который входит файл Bundle.properties. (Если поле оставить пустым, набор свойств будет создан в пакете проекта по умолчанию.)
Для оптимизации правил проекта в среде IDE настройте файлы, созданные в мастере. Для изменения шаблонов, используемых в мастере, щелкните ссылку "Настройка шаблона".
В целом, для вызова и изменения всех шаблонов, поддерживаемых в среде IDE, используйте диспетчер шаблонов ("Сервис" > "Шаблоны").
Нажмите кнопку "Готово". В среде IDE создаются сеансные компоненты без сохранения состояния в пакете jpa.session и управляемые компоненты JSF в контексте сеанса в пакете jsf. Каждый сеансный компонент без сохранения состояния обрабатывает операции для соответствующего класса сущностей, включая создание, правку и удаление экземпляров класса сущностей, с помощью интерфейса Java Persistence API. Каждый управляемый компонент JSF реализует интерфейс javax.faces.convert.Converter и играет роль экземпляров преобразования соответствующего класса сущностей в объекты String и наоборот.
При развертывании узла "Веб-страницы" можно отметить, что в среде IDE была создана папка для каждого класса сущностей. Каждая папка содержит файлы Create.xhtml, Edit.xhtml, List.xhtml и View.xhtml. В среде IDE также изменен файл index.xhtml посредством вставки ссылок на каждую из страниц List.xhtml.
Каждый управляемый компонент JSF относится к четырем соответствующим файлам Facelets и содержит код, вызывающий методы в соответствующем сеансном компоненте.
Разверните узел папки resources для поиска таблицы стилей по умолчанию jsfcrud.css, созданной в мастере. При открытии страницы приветствия приложения (index.xhtml) или файла шаблона Facelets (template.xhtml) в редакторе отобразится ссылка на таблицу стилей.
<h:outputStylesheet name="css/jsfcrud.css"/>
Файл шаблона Facelets используется в каждом из четырех файлов Facelets для каждого класса сущностей.
При развертывании узла "Пакеты с исходными файлами" отображаются сеансные компоненты, управляемые компоненты JSF, служебные классы и набор свойств, созданные мастером.
Также мастером был создан файл настройки Faces (faces-config.xml) для регистрации местоположения набора свойств. При развертывании узла "Файлы настройки" и открытии faces-config.xml в редакторе XML отобразится следующая запись.
Кроме того, при развертывании нового пакета resources отображается файл Bundle.properties, содержащий сообщения для языка клиента по умолчанию. Сообщения произведены из свойств класса сущностей.
Для добавления нового набора свойств щелкните правой кнопкой мыши файл Bundle.properties и выберите команду "Настроить". В диалоговом окне "Средство настройки" можно добавить к приложению новые языки.
Анализ приложения
Теперь, при наличии в проекте классов сущностей, сеансных компонентов EJB для управления классами сущностей и внешнего интерфейса на основе JSF для отображения и изменения базы данных, попробуйте выполнить проект и посмотрите результаты.
Ниже приведены несколько коротких дополнительных упражнений, которые помогут лучше узнать приложение, а также возможности и функции среды IDE.
Для выполнения проекта щелкните правой кнопкой мыши узел проекта в окне "Проекты" и выберите команду "Выполнить" или в главной панели инструментов нажмите кнопку "Выполнить проект" ().
При отображении страницы приветствия приложения выводится список ссылок, позволяющих просмотреть записи, которые включены в каждую таблицу базы данных.
После завершения выполнения всех шагов мастера создания страниц JSF из классов сущностей ссылки добавлены на страницу приветствия (index.xhtml). Они представлены в качестве точек входа на страницы Facelets, обеспечивающие функциональность CRUD в базе данных "Консультационное агентство".
<h:body>
Hello from Facelets
<h:form>
<h:commandLink action="/address/List" value="Show All Address Items"/>
</h:form>
<h:form>
<h:commandLink action="/billable/List" value="Show All Billable Items"/>
</h:form>
<h:form>
<h:commandLink action="/client/List" value="Show All Client Items"/>
</h:form>
<h:form>
<h:commandLink action="/consultant/List" value="Show All Consultant Items"/>
</h:form>
<h:form>
<h:commandLink action="/consultantStatus/List" value="Show All ConsultantStatus Items"/>
</h:form>
<h:form>
<h:commandLink action="/project/List" value="Show All Project Items"/>
</h:form>
<h:form>
<h:commandLink action="/recruiter/List" value="Show All Recruiter Items"/>
</h:form>
</h:body>
Щелкните ссылку "Показать все элементы консультантов". При анализе приведенного выше кода можно отметить, что целевая страница – /consultant/List.xhtml. (В JSF 2.0 расширение файла является предполагаемым из-за неявного перехода.)
Текущая база данных не содержит данные примера. Данные можно добавить вручную посредством нажатия ссылки "Create New Consultant" и использования предоставленной веб-формы. При этом инициируется отображение страницы /consultant/Create.xhtml. Для заполнения таблиц данными примера также можно выполнить сценарий SQL в среде IDE. В следующих подразделах рассматриваются оба эти варианта.
Для возврата к списку ссылок на странице приветствия щелкните индексную ссылку. По ссылкам открывается представление данных, хранящихся в каждой таблице базы данных, и инициируется файл List.xhtml для каждой отображаемой папки сущностей. Как будет показано ниже, после внесения данных в таблицу появятся другие ссылки для каждой записи, с помощью которых можно просматривать (View.xhtml), править (Edit.xhmtl) и удалять данные отдельной записи таблицы.
Заполнение базы данных с помощью сценария SQL
Запустите предоставленный сценарий, создающий данные примера для таблиц базы данных. Сценарий (mysql_insert_data_consult.sql) включен в файл ZIP "База данных консультационного агентства", который можно загрузить из таблицы требуемого программного обеспечения.
В зависимости от сервера базы данных, с которым вы работаете (MySQL или JavaDB), можно выполнить запуск предоставленного сценария, создающего данные примера для таблиц базы данных. Для MySQL таким сценарием является mysql_insert_data_consult.sql. Для JavaDB таким сценарием является javadb_insert_data_consult.sql. Оба сценария включены в соответствующие архивы, которые можно загрузить из таблицы требуемого программного обеспечения.
Выберите в основном меню "Файл" > "Открыть файл", затем перейдите к папке сценария на компьютере. Нажмите кнопку "Открыть". Файл автоматически открывается в редакторе SQL среды IDE.
Убедитесь, что база данных consult выбрана в раскрывающемся списке "Соединение" на панели инструментов редактора SQL.
Либо щелкните правой кнопкой мыши в области редактора и выберите команду "Выполнить оператор", либо нажмите кнопку "Выполнить SQL" (). Результаты выполнения сценария отображаются в окне вывода.
Перезапустите сервер приложений GlassFish. Это необходимо для перезагрузки и кэширования новых данных при помощи сервера, содержащихся в базе данных consult. Чтобы этого добиться, нажмите на вкладку сервера GlassFish в окне вывода (вкладка сервера GlassFish показывает лог сервера), затем нажмите кнопку "Перезапустить сервер" () в левом поле. Сервер остановится, затем перезапустится.
Выполните проект еще раз и щелкните ссылку "Показать все элементы консультантов". Теперь можно заметить, что список больше не пуст.
Поддержка баз данных NetBeans
Можно использовать средство просмотра для таблиц базы данных в среде IDE, чтобы отображать и изменять данные таблиц, управляемые непосредственно в базе данных. Например, щелкните правой кнопкой мыши таблицу consultant в окне "Службы" и выберите команду "Просмотреть данные".
Запрос SQL, который используется для выполнения действий, отображается в верхней части редактора, а графическое представление таблицы помещено ниже.
Дважды щелкните ячейки таблицы для выполнения внутристрочных изменений данных. Щелкните значок "Фиксировать записи" () для фиксации изменений в базе данных.
Изучение поддержки редактора на страницах Facelets
Откройте страницу /consultant/List.xhtml в редакторе. В строке 8 указывается, что визуализация страницы зависит от файла template.xhtml Facelets.
<ui:composition template="/template.xhtml">
Для отображения номеров строк щелкните правой кнопкой мыши в левом поле редактора и выберите команду "Показать номера строк".
С помощью диалогового окна "Переход к файлу" в среде IDE откройте файл template.xhtml. Нажмите сочетание клавиш ALT+SCHIFT+O (CTRL+SHIFT+O в Mac), затем введите template.
Нажмите кнопку "ОК" (или нажмите клавишу ВВОД).
В шаблоне применяются теги <ui:insert> для вставки содержимого из других файлов в заголовок и тело. Установите курсор на тег <ui:insert>, затем нажмите сочетание клавиш CTRL+ПРОБЕЛ для вызова всплывающего окна документации.
.
Для вызова всплывающего окна документации можно нажать сочетание клавиш CTRL+ПРОБЕЛ, установив курсор на тегах JSF и соответствующих атрибутах. Отображаемая документация взята из описаний, предоставленных в официальной Документации о библиотеке тегов JSF.
Вернитесь к файлу List.xhtml (нажмите CTRL+TAB). Теги <ui:define> используются для определения содержимого, которое применяется в заголовке и теле шаблона. Этот шаблон используется для всех четырех файлов Facelets (Create.xhtml, Edit.xhtml, List.xhtml и View.xhtml), созданных для каждого класса сущностей.
Установите курсор на одном из выражений на языке выражений, используемых для локализованных сообщений, содержащихся в файле Bundle.properties. Для просмотра локализованного сообщения нажмите сочетание клавиш CTRL+ПРОБЕЛ.
На приведенном выше изображении можно заметить, что выражение на языке выражений разрешено в списке "List", который применяется для заголовка шаблона и проверяется из отображаемой в обозревателе страницы.
Выполните прокрутку до конца файла и найдите код для ссылки Создать нового консультанта (строка 92). Это выглядит следующим образом:
Для вызова всплывающего окна документации нажмите сочетание клавиш CTRL+ПРОБЕЛ на атрибуте action для commandLink.
Атрибут action указывает на метод, обрабатывающий запрос при щелчке ссылки в обозревателе. Предоставлена следующая документация:
Компонент MethodExpression определяет вызываемую операцию приложения при его активации пользователем. Выражение должно определять общедоступный метод, который не принимает параметры и возвращает объект (метод toString() которого вызывается для получения логического результата), передаваемый в NavigationHandler для этого приложения.
Другими словами, значение action обычно относится к методу в управляемом компоненте JSF, который имеет значение String. Затем строка используется в NavigationHandler JSF для передачи запроса в соответствующее представление. Проверка этого осуществляется при выполнении следующих действий.
Установите курсор на consultantController и нажмите сочетание клавиш CTRL+ПРОБЕЛ. Функция автозавершения кода в редакторе указывает на то, что consultantController является управляемым компонентом JSF.
Переместите курсор на prepareCreate и нажмите сочетание клавиш CTRL+ПРОБЕЛ. При вызове функции автозавершения кода выводится список методов, содержащихся в управляемом компоненте ConsultantController.
Нажмите CTRL (⌘ в Mac), затем наведите указатель мыши на prepareCreate. Будет создана ссылка, с помощью которой можно перейти непосредственно к методу prepareCreate() в управляемом компоненте ConsultantController.
Щелкните ссылку и просмотрите метод prepareCreate() (отображаемый ниже).
public String prepareCreate() {
current = new Consultant();
selectedItemIndex = -1;
return "Create";
}
Метод возвращает Create. Метод NavigationHandler собирает информацию в фоновом режиме и применяет строку Create в пути для открытия представления, отправленного в ответ на запрос: /consultant/Create.xhtml. (В JSF 2.0 расширение файла является предполагаемым из-за неявного перехода.)
Изучение целостности базы данных с проверкой поля
На странице "Список консультантов" в обозревателе щелкните ссылку "Create New Consultant". Как показано в предыдущем подразделе, это инициирует визуализацию страницы /consultant/Create.xhtml.
Введите в форму следующие подробные сведения. На данный момент оставьте оба поля RecruiterId и StatusId пустыми.
Поле
Значение
Id консультанта
2
Эл. почта
Пароль
jack.smart
Почасовая ставка
75
Оплачиваемая почасовая ставка
110
Дата принятия на работу
22/07/2008
Резюме
У меня большой опыт работы консультантом. Примите меня на эту должность, и вы не разочаруетесь!
RecruiterId
---
StatusId
---
Нажмите кнопку "Сохранить". При подобном заполнении поле StatusId будет отмечено ошибкой проверки.
Почему это произошло? Повторно проверьте диаграмму "сущность/отношение" для базы данных консультационного агентства. Как указано выше в таблице связей, в таблицах CONSULTANT и CONSULTANT_STATUS совместно используется ненулевое отношение "один ко многим". Поэтому каждая запись в таблице CONSULTANT должна содержать ссылку на запись в таблице CONSULTANT_STATUS. Это отмечено во внешнем ключе consultant_fk_consultant_status, который имеет ссылки на две таблицы.
Внешние ключи, хранящиеся в таблицах, можно просмотреть посредством развертывания узла "Внешние ключи" таблицы в окне "Службы" (CTRL+5; ⌘+5 на компьютере Mac).
Для устранения ошибки проверки выберите entity.ConsultantStatus[statusId=A] в раскрывающемся списке StatusId.
Примечание. Поле RecruiterId можно оставить пустым. Как указано на диаграмме "сущность/отношение" для базы данных, между таблицами CONSULTANT и RECRUITER существует нулевое отношение "один ко многим", что означает, что создавать отношение между записями в таблице CONSULTANT с записью RECRUITER не требуется.
Нажмите кнопку "Сохранить". На экран выводится сообщение об успешном сохранении записи consultant. При щелчке ссылки Show All Consultant Items в таблице появится новая запись.
Как правило, на созданных страницах Facelets отображаются ошибки вводимой пользователем информации:
пустые поля для ненулевых ячеек таблицы;
изменения данных, которые нельзя изменять (например, первичные ключи);
вставка данных неверного типа;
изменения данных, когда представление пользователя больше не синхронизируется с базой данных.
Правка классов сущностей
В предыдущем подразделе был показан не совсем интуитивно понятный параметр entity.ConsultantStatus[statusId=A] в раскрывающемся списке StatusId. Необходимо учитывать, что текст, отображаемый для каждой позиции в этом раскрывающемся списке, является строковым представлением каждой обнаруженной сущности ConsultantStatus (т.е., вызывается метод toString() класса сущностей).
В этом подразделе описаны способы использования автозавершения кода в редакторе, документация и поддержка функции переходов, чтобы сделать такой вывод. Кроме того, подготовка наиболее интуитивно понятного сообщения для раскрывающегося списка.
Откройте в редакторе файл /consultant/Create.xhtml. Это форма "Создание нового консультанта", отображаемая в обозревателе. Выполните прокрутку вниз до кода раскрывающегося списка StatusId (выделено ниже жирным шрифтом).
Проверьте атрибут value, применяемый к тегу <f:selectItems>. Атрибут value определяет текст, отображаемый для каждой позиции в раскрывающемся списке.
Нажмите сочетание клавиш CTRL+ПРОБЕЛ, установив курсор на itemsAvailableSelectOne. Автозавершение кода в редакторе указывает, что метод getItemsAvailableSelectOne() для ConsultantStatusController возвращает массив объектов SelectItem.
Нажмите CTRL (⌘ в Mac), затем наведите указатель мыши на itemsAvailableSelectOne. Создается ссылка, позволяющая переходить непосредственно к методу getItemsAvailableSelectOne() в исходном коде сущностей ConsultantStatus. Щелкните эту ссылку.
Установите курсор на значении возврата SelectItem[] в сигнатуре метода и нажмите сочетание клавиш CTRL+ПРОБЕЛ для вызова всплывающего окна документации.
Щелкните значок веб-обозревателя () в окне документации для открытия документации Javadoc во внешнем веб-обозревателе.
Итак, класс SelectItem относится к инфраструктуре JSF. Компонент UISelectOne, как упоминалось в документации, представлен тегом <h:selectOneMenu> из разметки, проверенной выше в Шаге 1.
Нажмите CTRL (⌘ в Mac), затем наведите указатель мыши на findAll(). Появится всплывающее окно, отображающее сигнатуру метода.
Здесь можно отметить, что ejbFacade.findAll() возвращает List объектов ConsultantStatus.
Перейдите к JsfUtil.getSelectItems. Наведите указатель мыши на getSelectItems и нажмите CTRL (⌘ на компьютере Mac), затем щелкните появившуюся ссылку.
Этот метод организует цикл по списку сущностей (т.е., по списку List объектов ConsultantStatus) и создает SelectItem для каждой позиции. Как показано ниже (выделено жирным шрифтом), каждая позиция SelectItem создана с помощью объекта сущностей и метки объекта.
public static SelectItem[] getSelectItems(List<?> entities, boolean selectOne) {
int size = selectOne ? entities.size() + 1 : entities.size();
SelectItem[] items = new SelectItem[size];
int i = 0;
if (selectOne) {
items[0] = new SelectItem("", "---");
i++;
}
for (Object x : entities) {
items[i++] = new SelectItem(x, x.toString());
}
return items;
}
Эта метка создана с помощью метода toString() сущностей и является представлением объекта, отображаемым в этом ответе. (См. определение документации Javadoc для конструктора SelectItem(значение java.lang.Object, метка java.lang.String).)
После проверки того, что методом toString() сущности является метод, отображаемый в обозревателе при просмотре позиций в раскрывающемся списке, измените метод ConsultantStatustoString().
Откройте класс сущностей ConsultantStatus в редакторе. Измените метод toString для возврата statusId и description. Это свойства записей, соответствующие двум столбцам таблицы CONSULTANT_STATUS.
Выполните проект еще раз. При отображении в обозревателе страницы приветствия щелкните ссылку Show All Consultant Items, затем нажмите Create New Consultant.
Просмотрите раскрывающийся список StatusId. Теперь на экран будет выведен идентификатор состояния и описание записи, содержащейся в таблице CONSULTANT_STATUS базы данных.