Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Распределенные сервис-ориентированные системы..pdf
Скачиваний:
16
Добавлен:
05.02.2023
Размер:
9.2 Mб
Скачать

2.3.2 Прямая реализация тестового примера

Наиболее сильная сторона технологии JSP — прямое взаимодействие ресурсов представления информации с бизнес-уровнем компонент-подложек.

Для прямой реализации тестового приложения, ранее созданного на основе сервлета HttpServlet, имеются все необходимые условия:

а) создан проект labs, включающий в себя компоненту JSF; б) имеется новый Facelets-шаблон учебной дисциплины;

в) имеется компонента-подложка в виде POJO-класса TestTomee, реализующая бизнес-модель тестового примера (см. листинг 2.1 на стр. 77);

г) отсутствует только XHTML-ресурс представления решаемой задачи, который бы связывал отображаемое в браузере представление задачи с с бизнес-подложкой модели.

Реализуем недостающую часть приложения тестовой задачи на основе файла lab3.xhtml, который уже включен в структуру шаблона учебной дисциплины (см. листинг 2.14 на стр. 93-94). Сачала запустим тестовое приложение (см. рисунок 2.21) и перечислим графические компоненты, которые должен содержать файл lab3.xhtml.

Рисунок 2.21 — Интерфейс тестового приложения

В интерфейсе тестового приложения можно выделить три части, пред-

93

ставленные в таблице 2.8.

Таблица 2.8 — Основные части интерфейса тестового приложения

№ части

Описание

1

Вывод метода обращения к серверу и идентификатора сессии.

2

Вывод списка отправленных приложению сообщений.

3

Форма ввода текста и командная кнопка отправки тестовому

 

приложению нового сообщения.

Хорошо видно, что каждая из выделенных частей приложения требует ввода или вывода информации сосредоточенной в объектах компонентов-подло- жек или в объектах компоненты JSF.

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

Для связывания страниц JSF с компонентами-подложками используется язык выражений

EL (Expression Language).

Базовый синтаксис утверждения языка выражений имеет вид #{expr}, который будет оцениваться и преобразовываться во время выполнения JSF.

Основные операторы EL:

а) арифметические: + , , * , / (деление), % (целая часть);

б) операторы отношений: == (равно), != (не равно), < (меньше), > (больше), <= (меньше либо равно), >= (больше либо равно);

в) логические: && (и), || (или), ! (не);

г) другие: () (вызов метода), empty (логическая проверка на null), [] (как и оператор «точка» - доступ к атрибуту).

Компоненты-подложки — это CDI-объекты POJO-классов, имеющих имя класса, имена публичных методов и имена приватных данных (простых типов или объектных).

Доступ к целевым приватным данным компонентов-подложек осуществляется через имена классов, причем используется «верблюжья нотация», требующая, чтобы имя класса указвалось со строчной буквы. Например, компо- нента-подложка TestTomee проекта labs имеет приватную строковую переменную text (см. листинг 2.1, стр. 77-78):

94

Для обращения к этой переменной со страницы JSF следует использовать синтаксис: "#{testTomee.text}".

Обратите внимание, что в приведенном примере класс TestTomee должен иметь реализацию методов:

для чтения из text: public String getText() {...};

для записи в text: public void setText(String text) {...}.

Страницы JSF имеют доступ ко множеству неявных объектов, представленных в таблице 2.9.

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

Поскольку в таблице 2.8 присутствуют неявные объекты request и session, то воспользуемся их методами для доступа к нужной информации.

Ранее, нужная нам информация извлекалась в тестовом примере (см. пункт 1.5.5 главы 1). Там JSP-страница test.jsp (см. листинг 1.2, стр. 55) содержала выражения:

Зная назначение и структуру POJO-классов (JavaBeans) и синтаксис применения языка выражений EL, мы понимаем, что:

а) метод доступа можно получить выражением: "#{request.method}"; б) идентификатор сессии можно получить выражением: "#{session.id}".

Часть 1 тестового приложения реализуется в Facelets-компоненте нового шаблона с идентификатором subheader.

Исходя из этого условия, переопределим компоненту subheader JSF-стра- ницы lab3.xhtml, как это приведено в листинге 2.17.

95

Таблица 2.9 — Неявные объекты, доступные на страницах JSF [17]

Неявный объект

Описание

Возвращаемый тип

application

Представляет среду веб-приложения. Ис-

Object

 

пользуется для получения конфигурацион-

 

 

ных параметров приложения.

 

applicationScope

Преобразует имена глобальных атрибутов

Map

 

приложения в их значения.

 

component

Указывает на текущий компонент.

UIComponent

cc

Указывает на текущий составной компо-

UIComponent

 

нент.

 

cookie

Определяет объект типа Map, содержащий

Map

 

имена cookies (являющиеся ключами) и

 

 

объекты типа Cookie.

 

facesContext

Указывает на объект типа FacesContext для

FacesContext

 

текущего запроса.

 

flash

Представляет объект, использующий флеш.

Object

header

Преобразует имя HTTP-заголовка в значе-

Map

 

ние заголовка типа String.

 

headerValues

Преобразует имя HTTP-заголовка в набор

Map

 

всех значений заголовка типа String[].

 

initParam

Преобразует имена параметров инициали-

Map

 

зации контекста к значениям типа String.

 

param

Преобразует имена параметров запроса к

Map

 

одному значению параметра типа String.

 

paramValues

Преобразует имена параметров запроса к

Map

 

набору всех значений параметра типа

 

 

String[].

 

request

Представляет объект запроса HTTP.

Object

requestScope

Преобразует имена атрибутов запроса к их

Map

 

значениям.

 

resource

Представляет объект ресурса.

Object

session

Представляет объект сеанса НТТР.

Object

sessionScope

Преобразует имена атрибутов сеанса к их

Map

 

значениям.

 

view

Представляет текущее представление.

UIViewRoot

viewScope

Преобразует имена атрибутов представле-

Map

 

ния к их значениям.

 

Листинг 2.17 — Первая часть реализации lab3.xhtml проекта labs

<?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">

96

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://xmlns.jcp.org/jsf/facelets" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:c="http://xmlns.jcp.org/jsp/jstl/core" xmlns:f="http://xmlns.jcp.org/jsf/core" xml:lang="ru">

<ui:composition template="/WEB-INF/templates/lab3Templ.xhtml"> <!-- Переопределение подзаголовка subheader-->

<ui:define name="subheader">

<!-- Часть 1 реализации тестового примера --> <div style="background-color:gray;width:100%;

color:white;padding:5px">

<b>Вызван метод: #{request.method};</b> ID сессии: #{session.id} </div>

</ui:define>

</ui:composition> </html>

Результат реализации этой части приложения показан на рисунке 2.22. Обратите внимание, что компонента context не изменилась.

Рисунок 2.22 — Результат реализации первой части тестового приложения

97

Вторая часть тестового приложения, согласно таблице 2.8, должна выводить список отправленных приложению сообщений. Здесь следует напомнить, что отправленные сообщения храняться в компоненте-подложке класса TestTomee (см. листинг 2.1 на стр. 77-78) в виде списка строк msgs типа List<String>. Этот список строк необходимо прочитать на страние lab3.xhtml, а затем представить для обозрения.

JSF имеет четыре основных тега вывода, представленных в таблице 2.10 и способных с помощью EL отображать информцию связанную с компонентами-подложками, а также — тег цикла: <c:forEach>.

Таблица 2.10 — Теги вывода [17]

Тег

Описание

<h:outputLabel>

Отображает элемент HTML <label>.

<h:outputLink>

Отображает элемент привязки HTML <a>.

<h:outputText>

Выводит текст.

<h:outputFormat>

Отрисовывает параметризованный текст.

Рассмотрим применение тегов <c:forEach> и <h:outputLabel> на примере реализации второй части тестового приложения. Эта часть будет переопределять компоненту шаблона context, что показано на рисуке 2.23.

Рисунок 2.23 — Демонстрация использования тегов <c:forEach> и <h:outputLabel>

Результат работы реализованных двух частей тестового приложения показан на рисунке 2.24.

98

Рисунок 2.24 — Результат работы двух частей тестового приложения

Обратите внимание, что на рисунке 2.24 никаких сообщений не показано, потому что еще не реализованы средства ввода сообщений.

Основными средствами интерактивного взаимодействия JSF-страниц и компонент-подло- жек являются теги ввода информации (см. таблица 2.11) и теги команд (см. таблица 2.12).

Таблица 2.11 — Теги компонентов ввода [17]

Тег

Описание

<h:inputHidden>

Представляет HTML-элемент ввода для скрытых данных (полезен для

 

переноса значений от страницы к странице вне сессии).

<h:inputSecret>

Представляет HTML-элемент ввода для паролей. При повторной

 

загрузке страницы любое ранее введенное значение не будет

 

отображено , если только свойство redisplay не имеет значения true.

<h:inputText>

Представляет HTML-элемент ввода для текста.

<h:inputTextarea>

Представляет текстовую область в HTML.

<h:inputFile>

Позволяет просматривать каталог, выбирать и загружать файл.

99

 

Таблица 2.12 — Теги команд [17]

Тег

Описание

<h:commandButton>

Представляет HTML-элемент, предназначенный для ввода данных

 

кнопок «Отправить» или «Очистить».

<h:commandLink>

Представляет HTML-элемент для гиперссылки, который действует

 

как кнопка «Отправить». Этот компонент должен быть помещен

 

внутрь формы.

Используя выделенные красным цветом теги, можно легко реализовать третью часть тестового приложения, что:

а) тег <h:inputTextarea> читает и записывает приватный атрибут text класса

TestTomee;

б) <h:commandButton> обращается к методу addMessage() того же класса.

Реализация третьей части приложения офрмляется тегом <h:form> и вставляется в компоненту context после второй части.

Общий результат реализации приложения в виде файла lab3.xhtml представлен на листинге 2.18.

Листинг 2.18 — Полная реализация lab3.xhtml проекта labs

<?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://xmlns.jcp.org/jsf/facelets" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:c="http://xmlns.jcp.org/jsp/jstl/core" xmlns:f="http://xmlns.jcp.org/jsf/core" xml:lang="ru">

<ui:composition template="/WEB-INF/templates/lab3Templ.xhtml">

<!-- Переопределение подзаголовка subheader--> <ui:define name="subheader">

<!-- Часть 1 реализации тестового примера --> <div style="background-color:gray;width:100%;

color:white;padding:5px">

<b>Вызван метод: #{request.method};</b> ID сессии: #{session.id}

</div>

</ui:define>

<!-- Переопределение контекстной страницы context --> <ui:define name="context">

<!-- Часть 2 реализации тестового примера -->

100

<div align="left" style="color:black;padding:10px">

<b>Тестовый пример (lab3.xhtml)</b> <hr/>

<c:forEach var="ss" items="#{testTomee.msgs}"> <h:outputLabel value="#{ss}"/> <hr/>

</c:forEach>

<!-- Часть 3 реализации тестового примера --> Введи текст: <br/>

<h:form>

<h:inputTextarea rows="5" cols="40" value="#{testTomee.text}"/> <br/>

<h:commandButton value="Отправить" action="#{testTomee.addMessage}"/> <hr/>

</h:form>

</div>

</ui:define>

</ui:composition>

</html>

Запуск полной реализации тестового приложения с двумя введенными сообщениями представлен на рисунке 2.25.

Хорошо видно, что с точностью до ряда деталей оформления, прикладная часть тестового JSF-приложения полностью соответствует прикладной части тестового JSP-приложения.

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

Технология JSP на первое место выставляет HttpServlet, к которому идут запросы от браузера. Сервлет может сам формировать HTML-страницу или обратиться к соотвествующей JSP-странице. Используя встроенный (неявный) объект out, можно формировать содержимое HTML-страницы, что и было сделано в тестовом примере (см. пункт 1.5.5 главы 1).

Технология JSF на первое место выставляет XHTML-ресурс, к которому обращается браузер, а FacesServlet «работает скрытно», предоставляя каждому запросу браузера объект жизненного цикла (типа Lifecycle) и объект состояния запроса (типа FacesContext).

Предоставляемая браузеру прикладная информация выводится не в страницу, а — в поле страницы.

101