Изучаем Java EE 7 - [175]

Шрифт
Интервал

>Object getAsObject(FacesContext ctx, UIComponent component, String value)

>String getAsString(FacesContext ctx, UIComponent component, Object value)

Метод getAsObject() преобразует строковое значение компонента пользовательского интерфейса в соответствующий поддерживаемый тип и возвращает новый экземпляр. Этот метод генерирует исключение ConverterException, если преобразование не удалось. И наоборот, метод getAsString() преобразует объект предоставленного типа в строку, которая будет отрисована с помощью языка разметки (например, XHTML).

Как только вы разработаете собственный преобразователь, он должен быть зарегистрирован, чтобы можно было использовать его в веб-приложении. Один из методов регистрации — объявление преобразователя в файле faces-config.xml, а другой — использование аннотации @FacesConverter.

В листинге 11.13 показано, как создать собственный преобразователь, который преобразует цены из долларов в евро. Он начинается со связывания этого преобразователя с именем euroConverter с помощью аннотации @FacesConverter("euroConverter") и реализации интерфейса Converter. В этом примере только переопределяется метод getAsString(), который возвращает строковое представление данной цены в евро.


Листинг 11.13. Преобразователь евро

>@FacesConverter("euroConverter")

>public class EuroConverter implements Converter {

>··@Override

>··public Object getAsObject(FacesContext context, UIComponent component, String value) {

>····return value;

>··}

>··@Override

>··public String getAsString(FacesContext ctx, UIComponent component, Object value) {

>····float amountInDollars = Float.parseFloat(value.toString());

>····double ammountInEuros = amountInDollars * 0.8;

>····DecimalFormat df = new DecimalFormat("###,##0.##");

>····return df.format(ammountInEuros)

>··}

>}

Для того чтобы использовать этот преобразователь, укажите либо атрибут converter тега , либо тег . В обоих случаях вам следует передать имя своего преобразователя, определенное в аннотации @FacesConverter (euroConverter). Следующий код отображает два выходных текста, один из которых представляет цену в долларах, а другой — преобразование этой цены в евро:

> // в долларах

>··// конвертируем в евро

>··

>

Или же вы можете использовать атрибут converter тега outputText:

>

Валидаторы

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

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

>

Если вы не введете значение, то JSF вернет страницу с сообщением о том, что должно быть введено значение (страница должна иметь тег ). При этом используется тот же механизм сообщений, который я описал ранее. Но JSF поставляется с набором валидаторов (перечисленных в табл. 11.4). Они определены в пакете javax.faces.validator.


Таблица 11.4. Стандартные валидаторы
ВалидаторОписание
DoubleRangeValidatorПроверяет значение соответствующего компонента на вхождение в заданный интервал, границы которого имеют тип double
LengthValidatorПроверяет количество символов в строке, связанной с компонентом
LongRangeValidatorПроверяет значение соответствующего компонента на вхождение в заданный интервал, границы которого имеют тип long
MethodExpressionValidatorВыполняет проверку, выполнив метод объекта
RequiredValidatorЭквивалентен присвоению значения true атрибуту required входного компонента
RegexValidatorПроверяет значение определенного компонента на соответствие регулярному выражению

Эти валидаторы полезны для общих задач, например таких, как определение длины поля или диапазона номеров. Они могут быть легко связаны с компонентом так же, как преобразователи (они оба могут быть использованы на одном компоненте). Следующий код обеспечивает, что название книги составляет от 2 до 20 символов в длину, а ее цена — от $1 до 500:

>

>··

>

>

>··

>

Пользовательские валидаторы

Возможно, стандартные валидаторы JSF не могут удовлетворить ваши потребности — вам, вероятно, потребуется иметь данные, которые должны следовать определенному формату, такому как почтовый индекс, область или адрес электронной почты. Вы должны создать собственный валидатор для обработки этих случаев. Как и преобразователи, валидатор — это класс, который должен реализовывать интерфейс и переопределить отдельные методы. В случае валидаторов таким интерфейсом является javax.faces.validator.Validator, который имеет один метод validate():


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

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


Симуляция частичной специализации

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


Обработка событий в С++

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


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.