Пояснительная записка к диплому (1228397), страница 9
Текст из файла (страница 9)
Метод проверки строки на пустоту, действует просто. Он проверяет строку сначала на наличие содержимого, а затем проверяет содержимое на пустоту, после чего возвращает логическое значение, соответствующее результату. Этот метод используется для сокращения записи проверки строк в различных контроллерах на пустоту.
Схема полученного вспомогательного класса приведена на рисунке 5.
Рисунок 5 – Схема вспомогательного
класса
Код вспомогательного класса представлен в приложении А.4.
3.3.5 Создание контроллеров представлений
Контроллеры представлений содержат основной функционал приложения. На примере контроллера представления адресов будет выполнено описание построения типового контроллера представления, также после описания построения контроллера представления адресов будет осуществлено описание функций в него не вошедших, но присутствующих в АРМ.
Прежде всего для контроллера представления необходимо задать объявление @ManagedBean, которое укажет на то что данный контроллер предназначен для работы с представлением. После этого также необходимо определить область действия для контроллера, для большинства контроллеров представлений подойдёт установка действия в рамках сессии – @SessionScoped, однако для контроллера авторизации следует реализовать область действия в рамках приложения, для возможности хранения данных вне зависимости от сессии которая может быть сброшена для обновления моделей и представлений [21].
Далее следует объявить поля, требуемые для работы контроллера. Так для его работы потребуется поле для хранения информации об одной записи из таблицы адресов и поле для хранения информации о множестве адресов. Информация об одном адресе будет использована для возможности его редактирования, а информация о группе адресов будет использоваться для отображения результатов поиска. Информация о группе объектов будет храниться в не в классе модели, в отличие от конкретной записи, а в классе DataModel. Этот класс по сравнению со списком реализует механизм простого доступа к информации о конкретной записи модели. Далее необходимо создать поле для хранения экземпляра класса контроллера фасада модели. Для этого перед полем нужно объявить следующую запись: @EJB, которая установит зависимость между объявленным полем и контроллером фасада модели [21]. Затем объявляется класс, созданный ранее для реализации постраничной навигации. Далее объявляются поля, отвечающие за реализацию поиска по таблице, в данном случае три строки для хранения данных о фильтре по улицам, городам и домам. В других контроллерах представления могут также создаваться специальные поля, отвечающие за хранение важных, в рамках представления данных.
Адрес может выбираться в других таблицах как внешний ключ. Выбор внешнего ключа реализуется посредством перехода на поисковую форму связанной таблицы, поиском нужной записи или её добавлением и после утверждением в качестве внешнего ключа. Для реализации такой логики необходима логическая переменная отвечающая за отображение соответствующей информации на представлениях. Сущность адресов используется как внешний ключ в сущности сотрудников и сущности информации о складах, поэтому понадобится две логические переменные.
Стоит отметить что для реализации этого механизма потребуются также соответствующие методы в контроллерах обеих связанных сущностей. Метод сущности являющейся внешним ключом должен принимать информацию о сущности уже указанной как связанная, для возможности правки информации о связанной сущности, а также логическое значение, отвечающее за определение с какого окна (создания или редактирования) был произведён переход, для дальнейшей отсылки в связанный метод и определения соответствующего для показа представления.
Также для сохранения информации о представлении из которого осуществился переход, используется логическое значение, которое в последствии войдёт в список параметров функции из оригинальной сущности. В этих полях, контроллер представления адресов не нуждается, так как связанные таблицы не подразумевают создания новых записей из системы.
В контроллер представления адресов войдут только два метода для перехода на поисковую форму с запоминанием параметров и одни общий метод для возвращения с формы создания/редактирования информации о городе и улице. В этих методах производится установка поискового фильтра в соответствии с переданным экземпляром сущности, после чего логическая переменная отвечающая за отображение ссылок, связанных с установкой внешнего ключа. После выполнения этих действий функция возвращает адрес представления поисковой формы, что завершает работу функции. В методе возвращения к от внешних ключей прописывается очистка переменных в контроллерах улицы и города, а также осуществляется переход на страницу создания/редактирования адреса в зависимости от значения полученной логической единицы.
Далее производится запись стандартных методы установки и получения значений инкапсулированных полей. Для поля, хранящего информацию о единичной записи метод получения будет изменён таким образом, что в случае если поле пустое, то ему присвоится значение нового элемента типа адрес. Метод получения контроллера фасада следует объявить, как закрытый, чтобы предотвратить ошибки при работе с моделью. Метод получения модели данных определённой в контроллере будет, в случае отсутствия данных в текущей модели, выполнять занесение из метода класса постраничной навигации, возвращающего модель данных, а в случае если модель уже содержит не нулевое значение, то будет осуществлять возвращение этого значения. Также следует объявить пустой конструктор по умолчанию.
После этого выполняется определение метода получения класса постраничной навигации. Для этого нужно перегрузить методы подсчёта количества записей и создания модели данных с использованием созданных в абстрактном фасаде методов для подсчёта записей по результатам поиска и самого поиска. Таким образом в качестве параметров в данных методах будет выступать название класса сущности, список параметров поиска, список значений ранее определённых поисковых фильтров, а также в качестве начала выборки первый элемент на странице и в качестве конца сумма первого элемента и количества записей на странице. Список параметров поиска представлен в представлении классов, то есть сослаться на название города связанный с адресом можно следующим образом Adress.cityR.city, для формирования запроса достаточно лишь двух последних полей.
Необходимо также предусмотреть метод попытки поиска, в котором будет выполняться проверка задания фильтров. Необходимость этого метода обусловлена потенциально большим количеством записей в таблицах, в связи с чем выгрузка всех данных будет отнимать огромное число ресурсов, что несомненно плохо скажется на работе пользователей в системе.
Далее выполняется определение методов подготовки перехода на страницу создания, редактирования/просмотра записи, а также на страницу со списком адресов, найденных по результатам поиска.
В методе подготовки результатов поиска выполняется вызов другого метода – метода воссоздания модели данных, после чего возвращается относительный адрес страницы результатов поиска. Метод же воссоздания модели данных осуществляет очистку модели данных от имеющейся в ней информации, этот метод необходим для очистки данных чтобы при попытке получить доступ к модели данных, она сформировалась заново.
Метод подготовки создания записи, реализует выделение памяти под одиночный экземпляр класса модели, с тем, чтобы при создании все значения помещались в выделенную область памяти и при выполнении создания интерпретировались, как значения полей новой записи, после чего возвращает адрес представления создания записи.
Метод подготовки просмотра/редактирования записи заносит в текущий экземпляр класса модели значение, полученное из строки модели данных из которой осуществился вызов метода, после чего возвращает адрес соответствующего представления.
Указанные методы подготовки операций и попытки поиска вызываются при активации пользователем соответствующих гиперссылок и возвращаемое строковое значение определяет место в которое ведёт гиперссылка. Вообще все методы, связываемые с представление и предполагающие переход на другое представление должны возвращать текстовое значение определяющее адрес нового представления для отображения.
Далее выполняется определение методов создания записи и её обновления. Метод создания записи вызывает контроллер фасада модели и при помощи метода создания пытается создать запись. В случае успеха выводится сообщение об успешном завершении операции и в качестве возвращаемого значения вызывается метод подготовки создания, для очистки формы и готовности к созданию нового адреса. В случае неудачи выводится сообщение с ошибкой и её описанием и возвращается пустой объект. Метод обновления записи устроен аналогичным образом, только в случае успеха он возвращает адрес текущего представления.
Затем реализуются методы постраничной навигации для перехода на первую, последнюю, следующую и предыдущую страницы. Эти методы аналогичны друг другу, единственное их отличие заключается в том, что они в самом начале вызывают соответствующий их деятельности метод класса постраничной навигации. После чего вызывается метод воссоздания модели данных и возвращается адрес представления, отвечающего за показ результатов поиска.
На этом реализация контроллера представления адресов закончена, полный код созданного контроллера приведён в приложении А.5. Однако этот контроллер содержит далеко не все методы которые вошли в некоторые другие контроллеры и эти методы следует отдельно описать. В приложении реализован выбор некоторых внешних ключей через выпадающий список. Такая реализация отличается удобством, однако требует наличия дополнительных методов поддерживающих такой механизм.
Схема данного класса приведена на общей диаграмме блока адресов в приложении В.
Так, например, требуется наличие метода, возвращающего список объектов для выбора в выпадающем меню. Для этого используется метод формирующий такой список из вспомогательного класса и сформированный список просто возвращается на представление.
public SelectItem[] getItemsAvailableSelectOne()
{
return JsfUtil.getSelectItems(ejbFacade.Search("TableName",
new String[]{""},
new String[]{""}, "",
new int[]{-1, -1}),true);
}
Также реализуется набор методов, отвечающих за конвертацию экземпляра класса в строку и объект, а также для получения ключа и ключа в строковом представлении. Следует описать создание такого класса на примере контроллера модели городов. Для этого объявляется класс конвертации, для которого делается объявление @FacesConverter(forClass = Cities.class) [22]. Этот класс является реализацией интерфейса конвертера и перегружает его метод получения экземпляра класса как объект и как строку. Метод получения экземпляра класса как объект проверяет значение полученное как параметр и, если оно пустое, возвращает пустое значение. Если же значение не пустое, то создаёт экземпляр класса контроллера, в который помещает значение, возвращаемое текущим контекстом приложения после чего осуществляет возвращение найденного в модели экземпляра класса в качестве объекта. В качестве параметров принимается контекст представления, из которого был вызван метод, компонент интерфейса для которого вызывается метод (в данном случае выпадающий список), а также строковое значение представляющее объект (его ключ в строковом виде). Код реализующий данный метод приведён ниже:
@Override
public Object getAsObject(FacesContext facesContext, UIComponent component, String value)
{
if (value == null || value.length() == 0) {
return null;
}
CitiesController controller = (CitiesController) facesContext.getApplication().getELResolver().getValue(facesContext.getELContext(), null, "citiesController");
return controller.ejbFacade.find(getKey(value));
}
В этом коде используется один ранее не определённый метод – getKey, этот метод используется для получения ключа экземпляра класса, поиск которого выполняется. Этот метод возвращает ключ конвертированный в объект типа Long и возвращает его в предыдущий метод для поиска этого объекта. Код метода получения ключа имеет следующий вид:
java.lang.Long getKey(String value)
{
java.lang.Long key;
key = Long.valueOf(value);
return key;
}
Метод получения экземпляра класса как строки во основном схож с методом получения его как объекта. Он проверяет объект на пустоту, после чего, если объект не пустой он проверяет его на принадлежность к классу модели. В случае прохождения этих проверок будет возвращено значение экземпляра класса модели как строки. Код этого метода выглядит следующим образом:
@Override
public String getAsString(FacesContext facesContext, UIComponent component, Object object)
{
















