Статьи

Оценка выражений с использованием Spring Expression Language (SpEL)

Spring  Expression Language  (сокращенно SpEL) — это мощный язык выражений, который поддерживает запросы и манипулирование  графом объектов  во время выполнения, а также оценку логических и  математических выражений  и многие другие функции. Посмотрите на   страницу SpEL для списка этих. SpEL может использоваться независимо, независимо от того, использует ли ваша среда приложения Spring   или нет.

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

  1. Получение SpEL
  2. Оценка буквальных выражений
  3. Выполнение вызова метода на литералах
  4. Доступ к свойствам и методам объекта
  5. операторы
  6. Использование нескольких объектов и переменных
  7. функции

Получение SpEL

Если вы используете maven, добавьте следующую зависимость в ваш файл pom.

<dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-core</artifactId>
     <version>4.0.0.RELEASE</version>
</dependency>
<dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-expression</artifactId>
     <version>3.1.0.RELEASE</version>
</dependency>

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

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

public class Main {
    private ExpressionParser parser;
    public Main(){
        this.parser = new SpelExpressionParser();        
    }...

Оценка буквальных выражений

SpEL может отображать литеральные значения в их правильном типе.

/**
* A function that tests literal expressions.
*/private void evaluateLiteralExpresssions() {//A string literal
      Expression exp = parser.parseExpression("'Hello World'");
      String message = (String) exp.getValue();
      System.out.println(message);//An integer literal

      exp = parser.parseExpression("6");
      Integer value = exp.getValue(Integer.class);
      System.out.println(value*2);
}

Выполнение вызова метода на литералах

SpEL может использоваться для выполнения методов над литералами. Например, вызовите метод substring для строки.

/**
* A function that tests method invocation on literals
*/private void methodInvocationOnLiterals() {
      Expression exp = parser.parseExpression("'Hello World'.concat('!')");
      String message = (String) exp.getValue();
      System.out.println(message);

      exp = parser.parseExpression("'Hello World'.length()");
     Integer size = exp.getValue(Integer.class); 

      System.out.println(size); 


       exp = parser.parseExpression("'Hello World'.split(' ')[0]"); 
       message = (String)exp.getValue(); System.out.println(message);
}

Доступ к свойствам и методам объекта

Выражение может напрямую использовать значения определенного свойства класса (просто используя имя свойства). Аналогично, функцию можно вызывать в выражении (используя functionName ())

/**A function that tests accessing properties of objects**/
private void accessingObjectProperties() {
User user = new User("John", "Doe", "john.doe@acme.com", true, 30);
Expression exp = parser.parseExpression("firstName");
System.out.println((String)exp.getValue(user));
exp = parser.parseExpression("isAdmin()==false");
boolean isAdmin = exp.getValue(user, Boolean.class);
System.out.println(isAdmin);        

exp = parser.parseExpression("emailAddress.split('@')[0]");<

String emailId = exp.getValue(user, String.class);

System.out.println(emailId);}

операторы

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

Операторы отношений:  ==,! =, <, <=,>,> =

Логические операторы:  и, или, не

Математические операторы:  +, -, /, *,%, ^

private void operators() {
     User user = new User("John", "Doe", "john.doe@acme.com", true, 30);
     Expression exp = parser.parseExpression("age > 18");
     System.out.println(exp.getValue(user,Boolean.class));
     exp = parser.parseExpression("age < 18 and isAdmin()");
     System.out.println(exp.getValue(user,Boolean.class));
}

Использование нескольких объектов и переменных

Выражение должно ссылаться не только на один объект, так как мы можем использовать несколько объектов разных типов в выражении. Вы добавляете все объекты, которые хотите использовать в контексте, в качестве пар ключ-значение, а затем ссылаетесь на объект в выражении.

private void variables() {
      User user = new User("John", "Doe", "john.doe@acme.com", true, 30);
      Application app = new Application("Facebook", false);        
      StandardEvaluationContext context = new StandardEvaluationContext();
      context.setVariable("user", user);
      context.setVariable("app", app);        
      Expression exp = parser.parseExpression("#user.isAdmin() and #app.isActive()");
      boolean result = exp.getValue(context,Boolean.class);
      System.out.print(result);
}

функции

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

private void customFunctions() {    

        try {
StandardEvaluationContext context = new StandardEvaluationContext();context.registerFunction("isURLValid", Function.class              .getDeclaredMethod("isValid", new Class[] { String.class }));String expression = "#isURLValid('http://google.com')";
boolean isURLValid = parser.parseExpression(expression).getValue(context,Boolean.class);System.out.println(isURLValid);        } catch (Exception e) {    System.out.println(e);       } }