Главная » Spring » Выполнение операций со значениями SpEL Spring

0

Язык SpEL предлагает несколько операций, которые могут при- меняться к значениям в выражениях. Эти операции перечислены в табл. 2.5.

Таблица 2.5. Язык SpEL включает несколько операторов для манипулирования значениями в выражениях

Типы операторов

Операторы

Арифметические

+, -, *, /, %, ^

Операторы отношений

<, >, ==, <=, >=, lt, gt, eq, le, ge

Логические

and, or, not, !

Условные

?: (трехместный), ?: (Элвис)

Регулярные выражения

matches

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

Выполнение математических операций в языке SpEL

Язык SpEL поддерживает все основные арифметические опера- торы, имеющиеся в языке Java, плюс оператор «крышки» (^), вы- полняющий возведение в степень.

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

<property  name="adjustedAmount"  value="#{counter.total  +  42}"/>

Здесь к значению свойства total компонента counter добавляется число 42. Обратите внимание, что хотя оба операнда в этом выра- жении являются числовыми, они не обязательно должны быть ли- тералами. В данном случае левым операндом является полноценное выражение на языке SpEL.

Другие арифметические операторы языка SpEL действуют точно так же, как в языке Java. Оператор -, например, выполняет вычи- тание:

<property name="adjustedAmount" value="#{counter.total – 20}"/>

Оператор * – умножение:

<property name="circumference"

➥  value="#{2   *   T(java.lang.Math).PI   *   circle.radius}"/>

Оператор / – деление:

<property name="average" value="#{counter.total / counter.count}"/>

И оператор %  – деление по модулю:

<property   name="remainder"   value="#{counter.total   %   counter.count}"/>

В отличие от Java, язык SpEL также предлагает оператор воз- ведения в степень:

<property  name="area"  value="#{T(java.lang.Math).PI  *  circle.radius  ^  2}"/>

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

<property  name="fullName"

value="#{performer.firstName + ‘ ‘ + performer.lastName}"/>

Подобно тому как оператор + можно использовать для конкате- нации строк в языке Java.

Сравнение значений

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

Например, чтобы выяснить равенство двух чисел, можно восполь- зоваться оператором равенства (==):

<property  name="equal"  value="#{counter.total  ==  100}"/>

В данном случае, если предположить, что свойство equal имеет логический тип, ему будет присвоено значение true, если свойство total равно 100.

Аналогично для сравнения разных значений можно использовать операторы «меньше чем» (<) и «больше чем» (>). Кроме того, язык SpEL поддерживает операторы «больше или равно» (>=) и «меньше или равно» (<=). Например, ниже представлено вполне допустимое выражение на языке SpEL:

counter.total   <=   100000

К сожалению, операторы «меньше чем» и «больше чем» могут вызывать проблемы при использовании в конфигурационных XML- файлах, так как в языке разметки XML они имеют специальное значение. Поэтому при использовании выражений на языке SpEL в XML-файлах1 лучше использовать текстовые эквиваленты этих операторов. Например:

<property name="hasCapacity" value="#{counter.total le 100000}"/>

Здесь оператор le означает «меньше или равно». Другие тексто- вые операторы сравнения перечислены в табл. 2.6.

1   Как использовать выражения на языке SpEL за пределами конфигураци- онных XML-файлов, будет показано в главе 4.

Таблица 2.6. Язык SpEL включает несколько текстовых операторов для сравнения значений в выражениях

Операция

Символический оператор

Текстовый оператор

Равно

==

eq

Меньше чем

lt

Меньше или равно

<=

le

Больше чем

gt

Больше или равно

>=

ge

Вы могли заметить, что даже при том, что символический опера- тор определения равенства (==) не вызывает проблем в XML, язык SpEL все равно предлагает альтернативный текстовый оператор eq, чтобы обеспечить непротиворечивость с другими операторами и по- тому что некоторые разработчики предпочитают использовать текс- товые версии операторов.

Логические выражения

Это здорово, что имеется возможность выполнять сравнение в выражениях на языке SpEL, но что, если потребуется выполнить вычисления, опираясь на две операции сравнения? Или, например, потребуется инвертировать некоторое логическое значение? В этом вам помогут логические операторы. В табл. 2.7 перечислены все ло- гические операторы, поддерживаемые языком SpEL.

Таблица 2.7. Язык SpEL включает несколько операторов

для манипулирования логическими значениями в выражениях

Оператор

Операция

and

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

or

Логическая операция ИЛИ; чтобы результатом выражения было зна- чение true, хотя бы один из операндов должен иметь значение true

not или !

Логическая операция НЕ; инвертирует значение целевого выражения

Например, взгляните, как используется оператор and:

<property name="largeCircle"

value="#{shape.kind == ‘circle’ and shape.perimeter gt 10000}"/>

В данном случае, если свойство kind компонента shape имеет зна- чение "circle" и свойство perimeter имеет значение больше 10 000,

свойству largeCircle будет присвоено значение true. В противном случае оно получит значение false.

Инвертировать значение логического выражения можно с по- мощью двух операторов: либо с помощью символического опера- тора !, либо с помощью текстового оператора not. Например, ниже демонстрируется использование оператора !:

<property   name="outOfStock"   value="#{!product.available}"/>

что эквивалентно использованию оператора not:

<property name="outOfStock" value="#{not product.available}"/>

Странно, что в языке SpEL отсутствуют символические эквива- ленты операторов and и or.

Условные вычисления

Как быть, если в выражении SpEL потребуется получить одно значение при выполнении условия и другое – в противном случае? Например, предположим, что Карл (компонент типа Instrumentalist) желает исполнять песню «Jingle Bells» только на фортепиано, а дру- гие – на саксофоне. В этом случае можно использовать трехместный (тернарный) оператор (?:):

<property  name="instrument"

value="#{songSelector.selectSong()==’Jingle   Bells’?piano:saxophone}"/>

Трехместный оператор в языке SpEL действует точно так же, как в языке Java. В данном случае, если будет выбрана песня «Jingle Bells», в свойство instrument будет внедрена ссылка на компонент piano. В противном случае в него будет внедрена ссылка на компо- нент с идентификатором saxophone.

Типичная область применения трехместного оператора – провер- ка значения на равенство null и внедрение значения по умолчанию, если равенство соблюдается. Например, предположим, что необхо- димо подготовить Карла к исполнению того же произведения, кото- рое должен исполнять Кенни, если только для Кенни было указано какое-либо произведение. В противном случае Карл должен испол- нять произведение по умолчанию «Greensleeves». В такой ситуации можно было бы использовать трехместный оператор, как показано ниже:

<property name="song"

value="#{kenny.song != null ? kenny.song : ‘Greensleeves’}"/>

Это выражение построено правильно, но в нем имеется повторяю- щийся элемент – ссылка на свойство kenny.song. Язык SpEL предла- гает разновидность трехместного оператора, упрощающую подобные выражения:

<property name="song" value="#{kenny.song ?: ‘Greensleeves’}"/>

Как и в предыдущем примере, выражение вернет значение свой- ства kenny.song или «Greensleeves», если свойство kenny.song равно null. При таком способе использования оператор ?: называют опе- ратором Элвиса. Этим странным названием оператор обязан срав- нению со смайликами – если повернуть его на 90 градусов, вопро- сительный знак будет напоминать прическу знаменитого Элвиса Пресли (Elvis Presley)1.

Регулярные выражения

При работе с текстом иногда бывает желательно проверить его совпадение с некоторым шаблоном. Язык SpEL поддерживает сопо- ставление с шаблонами с помощью оператора matches.

Оператор matches пытается применить регулярное выражение (в аргументе справа) к строковому значению (в аргументе слева). Результатом выполнения оператора matches является логическое значение: true – если строка совпадает с шаблоном и false – в про- тивном случае.

Для демонстрации оператора matches представим, что необходимо проверить в строке наличие допустимого адреса электронной поч- ты. В этом случае можно применить оператор matches, как показано ниже:

<property name="validEmail" value=

"#{admin.email  matches  ‘[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.com’}"/>

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

1   Я тут ни при чем! Не я придумал это название. Но ведь действительно он напоминает прическу Элвиса?!

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

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

Источник:   Уоллс К., Spring в действии. – М.: ДМК Пресс, 2013. – 752 с.: ил.

По теме:

  • Комментарии