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

8.3. Написание методов внешних бинов

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

выполнение проверки вводимых в компонент значений;обработка событий действия;

обработка событий изменения значений;

выполнение навигации.

Использование внешних бинов для выполнения этих функций устраняет необ-

ходимость реализовывать интерфейс Validator, чтобы выполнять проверку данных,

или интерфейс Listener, чтобы обрабатывать события. Используя внешний бин вместо реализации Validator, вы устраняете необходимость создавать собственный тег для

реализации проверок.

Методам нужно иметь доступ к данным компонента, чтобы обрабатывать со-

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

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

8.3.1. Методы для навигации

Метод бина для выполнения навигации, вызываемый методом action, дол-

жен быть методом public, который не имеет параметров и возвращает данные типа Object — логический результат, который использует система навигации, чтобы определить следующую отображаемую страницу. На этот метод ссылается атрибут action тега компонента.

Следующий метод action внешнего бина с именем CashierBean вызывается,

когда пользователь щелкает кнопку Submit на странице. Если пользователь заказал книги на сумму более чем $100, этот метод заменяют свойства rendered и specialOffer компонентов fanClub на true, чтобы они отображались на странице в следующий раз при её генерации.

После установки свойства компонентов в true этот метод возвращает логиче-

ский результат null. Это заставляет реализацию JavaServer Faces при перерисовке страницы не создавать новый вид страницы, сохранив ввод пользователя. Если этот метод должен возвращать логический результат, чтобы использовать его для навигации на страницу оплаты, страница будет регенерироваться без сохранения пользо-

вательского ввода.

Еслипользовательнеприобретаеткнигистоимостьюболеечем$100иликомпо-

нент thankYou уже был сгенерирован, то метод возвращает строку receipt. JavaServer

Faces загружает страницу после того, как этот метод закончится.

public String submit() { // Метод для обработки нажатия кнопки

...

if(cart().getTotal() > 100.00 && !specialOffer.isRendered())

{

specialOfferText.setRendered(true);

specialOffer.setRendered(true); return null;

} else

if (specialOffer.isRendered() && !thankYou.isRendered())

{

82

thankYou.setRendered(true); return null;

} else

{

clear();

return ("receipt");

}

}

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

хранит все возможные строки-результаты, затем возвращает методом действия константы enum, которые представляют конкретный результат типа String, определённый классом Enum. В этом случае возвращаемое вызовом метода toString класса Enum значение результата должно соответствовать элементу from правил навигации в файле конфигурации приложения.

Следующий пример использует класс Enum, чтобы включить строки всех логических результатов:

public enum Navigation {

main, accountHist, accountList, atm, atmAck, transferFunds, transferAck, error

}

Когда метод возвращает результат, он использует точечную нотацию, чтобы

ссылаться на элемент из класса Enum: public Object submit(){

...

return Navigation.accountHist;

}

8.3.2. Методы для обработки событий Action

Метод внешнего бина для обработки событий должен быть методом public, ко-

торый принимает событие и возвращает void. На этот метод указывает ссылка в атри-

буте actionListener тега компонентов. Только компоненты, которые реализуют интерфейс ActionSource, могут ссылаться на этот метод.

В следующем примере метод из внешнего бина LocaleBean обрабатывает со-

бытие пользователя, щелкающего по одной из гиперссылок на странице:

public void chooseLocaleFromLink(ActionEvent event) { // Получить ID того, кто вызвал

String current = event.getComponent().getId(); // контекст

FacesContext context = FacesContext.getCurrentInstance(); context.getViewRoot().setLocale((Locale)

locales.get(current)); // локаль

}

Этот метод ищет компонент, который генерировал событие из параметра event,

а затем он получает ID компонента, который указывает регион мира. Метод ищет ID

в объекте locales класса HashMap, который содержит доступные локали для прило-

83

жения. Далее он устанавливает локаль действия, используя выбранное значение из объекта HashMap.

8.3.3. Методы для выполнения проверки (Validation)

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

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

FacesContext, компонент, чьи данные должны быть проверены, и сами данные, которые нужно проверить, подобно тому, как это делает метод интерфейса Validator.

Компонент ссылается на метод внешнего бина, используя атрибут validator. Могут

быть проверены значения только компонентов Input или их потомков. Пример метода внешнего бина, который проверяет ввод пользователя:

public void validateEmail(FacesContext context, UIComponent toValidate, Object value) { String message = "";

String email = (String) value;

if (! email.contains(’@’)) { // Если ошибка ввода ((UIInput)toValidate).setValid(false);

message = CoffeeBreakBean.loadErrorMessage(context, CoffeeBreakBean.CB_RESOURCE_BUNDLE_NAME, "EMailError");

context.addMessage(toValidate.getClientId(context), new FacesMessage(message));

}

}

Давайте более внимательно посмотрим на вышеуказанный сегмент кода:

1.Метод validateEmail сначала получает локальное значение value.

2.Затем он проверяет, есть ли символ @ в value.

3.Если символа @ нет, то метод устанавливает свойство valid в false методом setValid.

4.Затем он загружает сообщение об ошибке и ставит его в очередь в экземпляр FacesContext, связывая сообщение с ID компонента, получаемым методом toValidate.getClientId(context).

8.3.4. Методы для обработки событий (Value Change)

Внешний бин, который обрабатывает события изменения значений, должен ис-

пользовать метод public, который принимает события и возвращает void. На этот ме-

тод ссылается атрибут valueChangeListener компонента.

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

цию ValueChangeListener. Следующий пример тега h:inputText с id name содержит в себе тег ValueChangeListener. Экземпляр класса ValueChangeListener обрабатывает

событие ввода значения в поле соответствующего компонента. Когда пользователь

вводит значение, генерируется событие изменения значения и вызывается метод processValueChange(ValueChangeEvent) класса ValueChangeListener.

<h:inputText id="name" size="50" value="#{cashier.name}" required="true">

84

<f:valueChangeListener type="listeners.NameChanged" /> </h:inputText>

Взамен реализации ValueChangeListener вы можете написать метод внешнего

бина, чтобы обрабатывать это событие. Для того чтобы сделать это, нужно перенести

метод processValueChange(ValueChangeEvent) из класса ValueChangeListener с име-

нем NameChanged в класс внешнего бина:

public void processValueChange(ValueChangeEvent event) throws AbortProcessingException {

if (null != event.getNewValue()) { FacesContext.getCurrentInstance().

getExternalContext().getSessionMap(). put(“name”, event.getNewValue());

}

}

Для того чтобы сделать этот метод обработчиком события ValueChangeEvent,

сгенерированного компонентом Input, сделайте ссылку на этот метод из атрибута valueChangeListener тега компонента, например: valueChangeListener="#{cashier.processValueChange}"

8.4. Проверка бинами

Инструментарий Bean Validation (JSR 303) является новой возможностью, которая

доступна в Java EE 6. Реализации JavaServer Faces 2.0 должны поддерживать биновую проверку, если это требуется во время работы сервера (как, например, Java EE 6).

Проверка может размещаться в других слоях в случае простейшего приложения, как по-

казано в примере приложения guessNumber. Приложение guessNumber проверяет ввод пользователя (в теге <h:inputText> ) для цифровых данных в слое представления, а для

правильного диапазона — в бизнес-слое.

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

могут быть встроенными или определены пользователем. Несколько встроенных ан-

нотаций доступны в пакете javax.validation.constraints. Некоторые часто используемые встроенные аннотации указаны ниже:

@Min: элемент должен быть числом, чьё значение должно быть более или равно заданному минимуму.

@Max: элемент должен быть числом, чьё значение должно быть меньше или равно определённому максимуму.

@Size: элемент должен быть в границах между определённым минимумом и

максимумом.

@NotNull: элемент не должен быть null. @Null: элемент должен быть null.

@Pattern: элемент должен соответствовать определённому регулярному выражению языка Java.

Полный список встроенных аннотаций находится в документации по API для класса javax.validation.constraints по адресу: http://java.sun.com/javaee/6/docs/api/.

85

В следующем примере ограничение установлено в поле использованием встроенной аннотации @NotNull:

public class Name {

@NotNull

private String firstname; @NotNull

private String lastname;

}

Вы можете также установить более чем одно ограничение на одном объекте

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

фамилии:

public class Name {

@NotNull @Size(min=1, max=16)

private String firstname; @NotNull

@Size(min=1, max=16) private String lastname;

}

Следующий пример показывает заданное пользователем ограничение, уста-

новленное для проверки адреса email встроенным шаблоном в методе бина запроса адреса:

@validEmail

public String getEmailAddress() { return emailAddress;

}

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

Любые неудачи проверки прекрасно обрабатываются и могут быть отображены тегом h:messages.

86

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