Пояснительная записка к диплому (1228397), страница 10
Текст из файла (страница 10)
if (object == null) {
return null;
}
if (object instanceof Cities) {
Cities o = (Cities) object;
return getStringKey(o.getIDcity());
} else {
throw new IllegalArgumentException("object " + object + " is of type " + object.getClass().getName() + "; expected type: " + Cities.class.getName());
}
}
В вышеприведённом методе фигурирует один неопределённый до их пор метод – getStringKey, который отвечает за возвращение ключа как строки, этот метод вызывает класс формирователь строк, после чего заносит в него значение ключа полученного в качестве аргумента, и возвращает сроковое представление ключа. Код этого метода описан ниже:
String getStringKey(java.lang.Long value)
{
StringBuilder sb = new StringBuilder();
sb.append(value);
return sb.toString();
}
Вышеописанные методы конвертации не используются в явном виде, а сами вызываются из элементов в которых необходимо выполнить преобразование.
Помимо этого, в контролер представления адресов не вошел также метод для переходов по ключевым ссылкам. Все контроллеры представлений имеют область сессионную область видимости, это используется в ряде механизмов обеспечивающих удобную работу пользователей в системе. Однако если просто перейти по ссылке, то переменные сессии сохранятся и при возвращении к же посещённым представлениям логика, которая не должна быть вызвана будет применена. Поэтому сессию нужно очищать при каждом переходе по ключевой ссылке. Для этого используется команда:
FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
После чего можно осуществить возвращение строки, отображающей адрес по которому осуществляется переход. Так, например, будет выглядеть типичный метод перехода по ссылке из контроллера боковой панели:
public String go1()
{
FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
return "/SomeFolder/SomeView";
}
Аналогичным образом осуществляется логика выхода из приложения, только в дополнение к очистке сессии, выполняется также очищение переменных, отвечающих за информацию о пользователе, работавшем в системе. Этот метод будет выглядеть следующим образом:
public String exit()
{
FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
LoggedUser=null;
loginARMSent=null;
passwordARMSent=null;
return "/Login";
}
Также следует описать метод авторизации пользователя. Этот метод выполняет поиск по базе данных соответствия введённой пользователем информации для входа в систему, и в случае если соответствие не найдено перенаправлял пользователя на текущую страницу с сообщением об ошибке. Код метода имеет следующий вид:
public String validation()
{
List<Workers> o=getFacade().SearchForUser(loginARMSent, passwordARMSent);
if(o.isEmpty())
{
JsfUtil.addErrorMessage("Неправильная комбинация логин/пароль");
loginARMSent="";
return "Login";
}
else
{
LoggedUser=o.get(0);
return "index";
}
}
3.4 Разработка вспомогательных элементов АРМ
В качестве вспомогательных элементов в данном случае выступают представления, позволяющие пользователю осуществлять взаимодействие с созданными ранее контроллерами.
Все представления строятся по одному шаблону, поэтому сначала выполняется создание шаблона. Шаблон состоит из трёх элементов: заголовка, боковой панели, нижней панели. Также в шаблоне присутствует основное содержимое, однако оно не является шаблонным, поэтому не требует создания отдельного элемента. Описанный шаблон представлен на рисунке 6.
Рисунок 6 – Шаблон для построения
представлений
Каждый элемент шаблона описывается в отдельном XHTML файле, содержащем код, который будет вставлен в шаблон. Для заголовка следует определить логотип «РЖД», название системы, а также блок отвечающий за отображение информации о пользователе авторизованном в системе, со ссылкой на выход из него. Стоит отметить что код представлений в JSF пишется с использованием Java Standard Tag Library (JSTL). С использованием этой технологии отпадает необходимость в написании обычного HTML кода, вместо этого указываются теги из JSTL отвечающие за проработку и отображение конкретных тегов HTML со свойствами, определёнными в теге JSTL [23]. В целом синтаксис JSTL схож с HTML и потому будут описываться лишь ключевые моменты присущие JSTL. Такой подход позволяет осуществлять связь контроллеров с представлениями.
Таким образом разработку представлений можно распределить на разработку шаблона и разработку конкретных представлений.
3.4.1 Разработка шаблона представлений
Для указания ссылки на свойство контроллера, следует сослаться на него по имени указанному в объявлении @ManagedBean, следующим образом:
#{managedBean.Property},
где Property – свойство контроллера, к которому выполняется доступ.
Таким образом в заголовке будут теги для вставки изображения, текста, а также блока, состоящего из текстового поля с логином текущего пользователя и ссылкой на выход из системы. Далее для указания фрагмента кода как подлежащего вставке по запросу в файл шаблона, используется следующая запись:
<ui:composition>Элементы подлежащие вставке</ui:composition>
Таким образом код для реализации шаблона заголовка будет выглядеть следующим образом:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html">
<h:body>
<ui:composition>
<h:panelGroup layout="block" styleClass="headerBack" >
<h:form id="form1">
<h:commandLink action="#{loginController.goIndex}">
<h:graphicImage name="Images/7.jpg" styleClass="headPic" />
</h:commandLink>
</h:form>
<h:panelGroup layout="block" styleClass="titleDiv">
<h1><h:outputText value="Автоматизированное рабочее место складского рабочего" /></h1>
</h:panelGroup>
<h:panelGroup layout="block" styleClass="infoDiv" rendered="#{loginController.loginARMSent!=null and !loginController.loginARMSent.isEmpty()}">
<h:outputText value="#{loginController.loginARMSent}" />
<br/>
<h:form id="form2">
<h:commandLink action="#{loginController.exit}">
Выход
</h:commandLink>
</h:form>
</h:panelGroup>
</h:panelGroup>
</ui:composition>
</h:body>
</html>
В теге ссылки в вышеописанном коде действию при нажатии ссылки соответствует метод контроллера боковой панели, а значению – текст для отображения. Важно заметить, что метод определяемый в соответствие ссылке должен возвращать строку, представляющую собой адрес представления, на которое следует осуществить переход или пустое значение. Также стоит упомянуть что префикс «h», в данном коде означает что данный элемент будет сгенерирован сервером как HTML элемент с указанными в нём атрибутами. StyleClass, в параметрах группы блоков, определяет ссылку на класс CSS используемый для данной группы блоков, а layout, обозначает способ генерации блоков. Сервер может генерировать блоки <div>, при указании значения “block”, либо <span>, которые генерируются по умолчанию. В данном коде также заслуживает упоминания параметр rendered в теге, обозначающем блок с информацией для пользователя. Этот параметр отвечает за генерацию тега HTML в случае если его значение истинно, в случае если оно ложно, то элемент сгенерирован не будет. В данном случае это используется для скрытия излишнего элемента на странице авторизации, до того, как пользователь ввёл свои учётные данные.
Далее следует определить боковую панель. Она содержит в себе ссылки для перехода по основным журналам необходимых для работы складским рабочим. Эти ссылки как упоминалось ранее реализуются в методах контроллера боковой панели и к этим методам осуществляется обращение при нажатии ссылки. Таким образом код для шаблона боковой панели можно представить в следующем виде:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html">
<h:body>
<ui:composition>
<h:panelGroup layout="block" styleClass="SidePanel">
<h:form>
<h:commandLink action="#{sideBarController.go1}" value="Журнал операций"/>
<br/>
<h:commandLink action="#{sideBarController.go2}" value="Журнал посещений"/>
<br/>
<h:commandLink action="#{sideBarController.go3}" value="Журнал запросов"/>
<br/>
<h:commandLink action="#{sideBarController.go4}" value="Журнал информации о складах"/>
<br/>
<h:commandLink action="#{sideBarController.go5}" value="Информация о товарах"/>
<br/>
<h:commandLink action="#{sideBarController.go6}" value="Журнал товаров на складах"/>
<br/>
<h:commandLink action="#{sideBarController.go7}" value="Поиск сотрудников"/>
</h:form>
</h:panelGroup>
</ui:composition>
</h:body>
</html>
Далее определяется подвал станицы. Он содержит в себе информацию о годе разработки системы, а также о целевом предприятии.
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html">
<h:body>
<ui:composition>
<h:panelGroup layout="block" styleClass="footer">
<h:outputText value="ДВЖД - 2015" />
</h:panelGroup>
</ui:composition>
</h:body>
</html>
После задания блоков осуществляется их связь в основном шаблоне. Для интеграции уже написанного шаблона в другом используется команда:
<ui:insert name="header">
<ui:include src="/ templateElementsPath/template.xhtml" />
</ui:insert>
Имя области вставки используется для возможности дальнейшего переопределения области, в представлении в котором она будет отличаться от определённой в шаблоне. Для этого используется команда:
<ui:define name="title">
Новое содержимое
</ui:define>
Таким образом код шаблона будет иметь следующий вид:
<!DOCTYPE html>
<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">
<h:head>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>
<ui:insert name="title">Главная страница АРМ</ui:insert>
</title>
<h:outputStylesheet library="css" name="templates.css"/>
</h:head>
<h:body>
<h:panelGroup layout="block" styleClass="page_content">
<ui:insert name="header">
<ui:include src="/templateElementsPath/header.xhtml" />
</ui:insert>
<ui:insert name="side_panel">
<ui:include src="/templateElementsPath/side_panel.xhtml" />
</ui:insert>
<h:panelGroup layout="block" styleClass="main_content">
<ui:insert name="main_content">
Default Content