Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2013_1 / КСТ / Разработка веб-приложений.pdf
Скачиваний:
160
Добавлен:
23.02.2015
Размер:
2.74 Mб
Скачать

9. Конфигурирование приложений

JavaServer Faces

Архитектура приложения обязательно включает:

регистрацию внутренних объектов приложения, чтобы все части приложения имели к ним доступ;

конфигурирование внешних бинов и бинов базы данных, чтобы им были приписаны значения, когда на них ссылается страница;

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

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

9.1.Файл конфигурации ресурсов приложения

Технология JavaServer Faces использует переносимый формат (XML) для конфигурирования ресурсов. Архитектор приложения создаёт один или более файлов, называемых «файлы конфигурации ресурсов приложения», которые используют этот формат, чтобы регистрировать и конфигурировать объекты и ресурсы, определять

правила навигации. Файл конфигурации ресурсов приложения обычно называется faces-config.xml.

Файл конфигурации ресурсов приложения должен соответствовать схеме, рас-

положенной по адресу http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd.

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

1)номер версии XML:

<?xml version=”1.0”?>

2)тег Faces-config, охватывающий все другие декларации:

<faces-config xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd" version=”2.0”>

...

</faces-config>

В приложении может быть один или более файлов конфигурации ресурсов при-

ложения. Реализация JavaServer Faces находит файл или файлы, производя следую-

щий поиск:

Ресурс с именем /META-INF/faces-config.xml в любом из файлов JAR в дирек-

тории /WEB-INF/lib/ и в родительских папках классов. Если ресурс с этим име-

нем существует, он загружается как конфигурация ресурсов. Этот вариант ра-

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

Контекстный параметр инициализации javax.faces.application.CONFIG_FILES,

который определяет один или более путей (разделённых запятой) в множество файлов конфигурации для вашего веб-приложения. Этот метод часто

87

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

группам пользователей ответственность за поддержание файлов.

Ресурс с именем faces-config.xml в директории /WEB-INF/ вашего приложе-

ния. Это простой способ создать файл конфигурации для небольших приложений.

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

работчик использует экземпляр класса Application, который автоматически создаётся

для каждого приложения. Экземпляр Application действует как централизованная фа-

брика ресурсов, которые определены в файле XML.

Когда приложение запускается, реализация JavaServer Faces создаёт един-

ственный экземпляр класса Application и конфигурирует его данными из файла конфигурации ресурсов приложения.

9.2.Упорядочение ресурсов конфигурации приложения

Так как спецификация JavaServer Faces 2.0 допускает использование многих

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

дут загружены. Это может быть сделано через тег <ordering> в файле конфигурации

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

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

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

<faces-config> <name>myJSF</name> <absolute-ordering>

<name>A</name>

<name>B</name>

<name>C</name> </absolute-ordering>

</faces-config>

В этом примере A, B и C представляют собой файлы конфигурации и считываются в том же порядке.

При использовании относительного упорядочения порядок, в котором будут за-

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

пример показывает некоторые варианты:

Файл A:

<faces-config> <name>myJSF</name> <ordering>

<before>

<name>B</name>

</before>

</ordering> </faces-config>

88

Файл C:

<faces-config> <name>myJSF</name> <ordering>

<after>

<name>B</name>

</after>

</ordering> </faces-config>

В этом примере A, B и C представляют собой файлы конфигурации, которые

будут загружены в следующем порядке: А перед B и C после B. Если нет заказанных

объявлений порядка файлов конфигурации, тогда файл получит самый низкий прио-

ритет.

9.3. Конфигурирование состояния проекта

Контекстный параметр ProjectStage определяет статус приложения JavaServer Faces в жизненном цикле программы. Статус приложения может повлиять на поведение приложения.

Возможны следующие значения состояния:

Production

(Рабочее)

Development

(Разработка)

UnitTest

(Локальное тестирование)

SystemTest (Системное тестирование)

Extension (Расширение)

ProjectStage конфигурируется контекстным параметром в файле дескриптора

развертывания. Например:

<context-param>

<param-name>javax.faces.PROJECT_STAGE </param-name> <param-value> Development </param-value>

</context-param>

Если параметр ProjectStage не определён, то по умолчанию состояние счи-

тается Development. Вы можете также добавить собственные состояния по вашему усмотрению. Значение ProjectStage также может быть сконфигурировано через JNDI.

Конфигурация ProjectStage через JNDI является продвинутым решением, включён-

ным в Java EE 6.

9.4. Выбор конфигурации бина

Для создания экземпляров и управления бинами в приложениях JavaServer

Faces используются средства управления созданием бинов. Такое средство сконфигу-

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

Когда страница ссылается на бин, реализация JavaServer Faces инициализирует его

согласно конфигурации в файле или эквивалентной аннотации @ManagedBean в опи-

сании класса. Информация об использовании аннотаций приведена ниже.

89

С помощью средств управления созданием бинов можно:

создавать бины в одном общем файле, который используется для всего при-

ложения, а не прописывать значение бина внутри самого приложения;

модифицировать свойства бина без дополнительного кода;

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

рации для инициализации свойств этими значениями при создании бина;

использовать элементы value, устанавливая свойства одного бина для зада-

ния результатов вычисления другого выражения.

9.4.1. Использование элемента managed-bean

Вы можете создавать экземпляр бина для употребления в атрибутах тегов

приложения, используя элемент managed-bean. Во время выполнения приложения

JavaServer Faces обрабатывает элемент managed-bean. Если страница ссылается на

бин и никакого экземпляра еще не существует, сервер JavaServer Faces создает и инициирует экземпляр бина, как определено элементом конфигурации.

Пример элемента конфигурации для управления бином:

<managed-bean> <managed-bean-name>userNumberBean</managed-bean-name>

<managed-bean-class> guessnNumber.UserNumberBean

</managed-bean-class>

<managed-bean-scope> session </managed-bean-scope> <managed-property>

<property-name> maximum </property-name> <property-class> long </property-class> <value> 10 </value>

</managed-property>

...

</managed-bean-name> </managed-bean>

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

1.После открытия вашего проекта в NetBeans IDE расширьте узел проекта в

окне проектов.

2.Расширьте узлы «Страницы Web» и WEB-INF узла проекта.

3.Сделайте двойной щелчок по faces-config.xml.

4.После открытия faces-config.xml в подокне редактора сделайте щелчок пра-

вой клавишей мыши в подокне редактора.

5.Выберите JavaServer Faces->AddManaged Bean.

6.В диалоговом блоке AddManaged Bean:

a) ввести имя бина в поле BeanName;

б) щелкнуть по кнопке «Просмотр», чтобы найти класс для бина.

7.В диалоговом окне «Просмотр классов»:

a)начните набирать имя класса, который вы ищете в поле ClassName. Пока вы печатаете, диалог покажет подходящие классы;

б) выберите класс из списка;

в) щелкните по кнопке OK.

90

8.В диалоговом окне AddManaged:

a)выберите область видимости бина из меню «Области».

б) сделайте щелчок по кнопке «Добавить».

Предыдущие шаги добавят управляющий элемент и три элемента внутри этого

элемента: имя управляющего элемента, класс элемента и область видимости элемен-

та. Для последующего изменения конфигурации управления бином вам понадобится непосредственно редактировать XML-файл конфигурации.

Элемент name управления бином определяет имя, под которым бин будет за-

гружен в область видимости (в то или иное пространство имен). Для компонента, ис-

пользующего этот бин, атрибут value тега компонента должен содержать это имя в

указании бина (перед первой точкой).

Элемент class управления бином определяет полное имя класса JavaBeans, ис-

пользуемого при инициализации бина.

Элемент управления бином может содержать нуль или более элементов, со-

ответствующих свойствам, определённым в классе бина. Эти элементы используют-

ся для инициализации значений свойств бина. Если вы не хотите инициализировать конкретное свойство, то не включайте элемент managed-property для этого свойства в

файле конфигурации приложения.

Если элемент управления бином не содержит другие элементы managed-bean,

он может содержать один элемент map-entries или элемент list-entries. Элемент mapentries конфигурирует множество бинов экземпляров класса Map. Элемент list-entries конфигурирует множество бинов экземпляров класса List.

Для отображения в свойство, определённое элементом managed-property, вы должны гарантировать, что часть после точки выражения value тега компонента будет

соответствовать имени свойства элемента managed-property.

9.4.2. Использование области видимости managed-bean-scope

Элемент managed-bean-scope определяет область видимости пространства имен, в которую бин будет загружен. Допустимые области — none, request, session или application. Кроме того, есть две новые области: view и custom, доступные в JavaServer

Faces 2.0.

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

жен быть создан тогда, когда на него сослались.

Если вы конфигурируете внешний бин, на который ссылается атрибут binding тега компонента, следует определить бин с областью запроса request. Если вы уста-

новили бин в области видимости session или application, то бин должен принять меры

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

пляры класса UIComponent рассчитаны на исполнение внутри единственной нити.

Если вы конфигурируете бин, который позволяет атрибутам связываться с видом, вы можете использовать новую область view. Атрибуты сохраняются, пока поль-

зователь не перешел на следующий вид.

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

нотацией в классе управления бином.

91

Eager-бины с областью видимости application

Обычно управление бином создаёт lazy-экземпляр только при поступлении

запроса из приложения. Если атрибут eager объявлен как true, то экземпляр инициируется и устанавливается в области видимости приложения, когда приложение запу-

скается. Управление бина может быть объявлено как eager также аннотацией:

@ManagedBean(eager=true)

Атрибут eager может быть также установлен в файле конфигурации приложения:

<managed-bean eager="true">

9.4.3. Инициализация свойств элементом managed-property

Элементmanaged-property долженсодержатьэлемент property-name,которыйсо-

ответствует имени свойства в бине, и один из множества элементов (указаны в табл. 9.1),

который определяет значение этого свойства. Это значение должно быть того же самого

типа, что и соответствующее свойство бина.

Таблица 9.1

Элементы managed-property и значения свойств

Элемент

Значение

list-entries

Элемент списка значений

map-entries

Элемент карты значений

null-value

Установить свойство в null

value

Определяет значение, например, строка,

 

целое или EL-выражение JavaServer Faces

Приведённый в п. 9.4.1 пример инициализирует свойство типа long при помощи

элемента value. Чтобы инициализировать примитивы и другие типы ссылок, также применяется элемент value. Далее описывается, как использовать элемент value и другие элементы, чтобы инициализировать свойства типов Java Enum, java.util.Map, массивы и коллекции, а также параметры.

Использование Java Enum

В соответствии с версией 1.2 технологии JavaServer Faces задание свойства бина также может быть сделано с использованием типа Enum языка Java

(см. http://java.sun.com/javase/6/docs/api/java/lang/Enum.html). В этом случае элемент value элемента managed-property должен быть строкой, которая соответствует одной

из констант Enum. Другими словами, строка должна быть одним из правильных значений, которое может быть возвращено вызовом valueOf(Class, String) для enum, где

Class является классом Enum, а String является содержанием подэлемента value.

Например, полагаем, что свойство бина следующего типа:

public enum Suit { Hearts, Spades, Diamonds, Clubs}

...

public Suit getSuit() { ... return Suit.Hearts; }

Допустим, что вы хотите конфигурировать это свойство в файле конфигурации,

тогда соответствующий элемент managed-property должен выглядеть так:

<managed-property> <property-name>suit</property-name> <value>Hearts</value>

</managed-property>

92

Когда система сталкивается с этим свойством, она просматривает члены enum

и вызывает метод toString() для каждого элемента, пока не найдет равное значение из

элемента value.

Использование инициализации параметра

Другой мощной характеристикой средства управления бинами является способ-

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

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

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

когда страница генерируется для пользователя.

Вы можете сохранить код области как начальное значение по умолчанию на

встроенном в контекст объекте initParam, добавив контекстный параметр к ваше-

му веб-приложению и задав его значение в дескрипторе развертывания. Например, чтобы установить контекстный параметр с именем defaultAreaCode в 650, до-

бавьте элемент context-param к дескриптору развёртывания и задайте параметру defaultAreaCode значение 650.

<context-param> <param-name>initParam.defaultAreaCode</param-name> <param-value> 650 </param-value>

</context-param>

Затемвызаписываетедекларациюmanaged-bean,котораяконфигурируетсвой-

ство, которое ссылается на параметр:

<managed-bean> <managed-bean-name>customer</managed-bean-name>

<managed-bean-class>CustomerBean</managed-bean-class> <managed-bean-scope>request</managed-bean-scope>

<managed-property> <property-name>areaCode</property-name>

<value>#{initParam.defaultAreaCode}</value> </managed-property>

...

</managed-bean>

Значение свойства areaCode можно задать и простой константой. Для того что-

бы получить доступ к коду области проживания во время создания страницы, сошлитесь на свойство areaCode из атрибута value тега компонента area:

<h:inputText id=area value="#{customer.areaCode}”

Использование значений из других встроенных объектов аналогично.

Инициализация свойств типа Map (словарь)

Элемент map-entries используется для инициализации значений свойства бина

с типом java.util.Map, если элемент map-entries находится внутри элемента managedproperty. Элемент map-entries содержит дополнительные элементы key-class и valueclass и нуль или более элементов словаря map-entry.

Каждый элемент map-entry должен содержать ключ и пустое или непустое значение. Пример, который использует элемент map-entries:

<managed-bean>

...

<managed-property>

93

<property-name>prices</property-name> <map-entries>

<map-entry>

<key>My Early Years: Growing Up on *7</key> <value>30.75</value>

</map-entry> <map-entry>

<key>Web Servers for Fun and Profit</key> <value>40.75</value>

</map-entry> </map-entries>

</managed-property> </managed-bean>

Словарь, созданный из этих тегов данных, содержит два элемента. По умолчанию, все ключи и значения преобразуются в java.lang.String. Если вы хотите опре-

делить другой тип для ключа карты, вставьте элемент value-class после элемента key-class, например:

<map-entries> <key-class>java.math.BigDecimal</key-class>

...

</map-entries>

Эта декларация преобразует все ключи в java.math.BigDecimal. Конечно, нужно

убедиться, что ключи могут быть преобразованы в тот тип, который вы определили. Ключ типа String не может быть преобразован в java.math.BigDecimal.

Если вы также хотите определить другой тип для всех значений словаря, включите элемент value-class после элемента key-class, например:

<map-entries> <key-class>int</key-class>

<value-class>java.math.BigDecimal</value-class> <map-entry>

<key>25</key>

<value>25000000.00</value> </map-entry>

...

</map-entries>

Отметьте, что этот тег устанавливает тип значений всех подэлементов.

Обращение к другому бину из свойства полезно для построения системы из

мелких объектов. Например, обработка формы с областью видимости request может

иметь указатель на объект с областью видимости application в базе данных объек-

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

Вместо использования map-entries элемента также можно назначить словарь

объектов, используя элемент value, который определяет выражение типа Map.

Инициализация свойств массива и списка

Элемент list-entries используется для инициализации значений свойств массива

или списка. Каждое индивидуальное значение массива или списка инициализируется

с использованием элемента value с непустым или пустым значением. Например:

94

<managed-bean>

...

<managed-property> <property-name>books</property-name> <list-entries>

<value-class>java.lang.String</value-class> <value>Web Servers for Fun and Profit</value> <value>#{myBooks.bookId[3]}</value> <null-value/>

</list-entries> </managed-property>

</managed-bean>

Этот пример инициализирует массив или список. Тип соответствующего свой-

ствабинаопределяет,какаяструктураданныхбудетсоздана.Элементlist-entries определяет список значений в массиве или списке. Элемент value определяет одно значе-

ние в массиве или списке и может ссылаться на свойство в другом бине. Значение

элемента null-value вызовет метод setBooks с аргументом null. Значение null-value не

может быть определено для свойств, чей тип данных является примитивом Java, как

например, int или boolean.

Инициализация свойств Managed Bean

Иногда нужно создать бин, который ссылается на другие бины, чтобы создать

граф или дерево бинов. Например, вы хотите создать бин, представляющий информа-

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

рень и два дочерних объекта AddressBean.

<managed-bean> <managed-bean-name>customer</managed-bean-name> <managed-bean-class>

com.mycompany.mybeans.CustomerBean </managed-bean-class>

<managed-bean-scope> request </managed-bean-scope> <managed-property>

<property-name>mailingAddress</property-name> <value>#{addressBean}</value>

</managed-property> <managed-property>

<property-name>streetAddress</property-name> <value>#{addressBean}</value>

</managed-property> <managed-property>

<property-name>customerType</property-name> <value>New</value>

</managed-property> </managed-bean>

<managed-bean> <managed-bean-name>addressBean</managed-bean-name> <managed-bean-class>

com.mycompany.mybeans.AddressBean

95

</managed-bean-class>

<managed-bean-scope> none </managed-bean-scope> <managed-property>

<property-name>street</property-name> <null-value/>

<managed-property>

...

</managed-bean>

Первая декларация CustomerBean создает экземпляр бина CustomerBean с именем экземпляра customer в области запроса. Этот бин имеет два свойства: mailingAddress и streetAddress. Эти свойства используют элемент value, чтобы ссы-

латься на бин с именем addressBean. Вторая декларация определяет экземпляр

AddressBean, но не создаёт его, поскольку область видимости элемента определе-

на как none. Вспомните, что область none означает, что бин создаётся только тогда, когда кто-то другой ссылается на него. Поскольку оба свойства (mailingAddress и streetAddress) экземпляра customer ссылаются на addressBean, используя элемент value, создаются два экземпляра класса AddressBean, когда создаётся экземпляр

класса CustomerBean.

Когда вы создаёте объект, который указывает на другие объекты, не пытайтесь

указывать на объект с более короткой областью видимости, поскольку невозможно восстанавливать эти ресурсы, когда область видимости исчезает вместе с носителем

(например, запрос или вид). Сеансовый объект, например, не может указать на объект

области запроса request. Объекты с областью none не имеют реальной области жизни на сервере, так что они могут указать только на другие объекты с областью none. Табл. 9.2 показывает все допустимые схемы связей.

 

Таблица 9.2

Допустимые схемы связи бинов

 

 

Область объекта

Допустимо ссылаться на

none

none

application

none, application

session

none, application, session

request

none, application, session, request,view

view

none, application, session, view

Нельзя допускать циклические ссылки между объектами. Например, ни один

из объектов AddressBean в предыдущем примере не должен указывать на объ-

ект CustomerBean, поскольку уже есть указатели из CustomerBean на объекты

AddressBean.

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

9.4.4. Использование аннотаций

Поддержкааннотаций—важнаяхарактеристикаJavaServer Faces 2.0.Аннотация @ManagedBean в тексте определения класса автоматически регистрирует на сервере класс как managed bean со временем жизни по умолчанию application. Такая регистрация управления бином не требует тега <managed-bean> в файле конфигурации приложения.

96

Соседние файлы в папке КСТ