Concept : principes fondamentaux de MVEL
Syntaxe
MVEL est un langage d'expression pour les applications Java. Sa syntaxe est similaire à celle de Java, mais il comporte quelques ajouts qui le rendent plus efficace pour mettre en correspondance le contenu.
Remarque :
- MVEL utilise des espaces de noms et des classes Java, mais ne peut pas les déclarer lui-même.
- Contrairement à Java, le typage de MVEL est dynamique et, par conséquent, facultatif.
- Les expressions MVEL peuvent être des instructions uniques ou des scripts multilignes. En cas de scripts multilignes, séparez chaque instruction par un point-virgule.
- MVEL fonctionne selon le principe de la dernière valeur sortie. Il prend en chargereturnmais n'en a généralement pas besoin.
- MVEL prend en charge les règles de priorité des opérateurs et utilise les crochets pour contrôler l'ordre d'exécution.
- Les littéraux de chaîne MVEL peuvent être placés entre guillemets simples ou doubles.
- Le point-virgule est un caractère réservé dans le langage MVEL. Vous ne pouvez pas l'utiliser dans les expressions. Utiliser(char) 59à la place. Exemple :props['string']='a;b'renvoie une erreur. Ce code :props['string']= (char) 59 props['string_new']='a'props['string']'b'
Les expressions MVEL peuvent inclure les éléments suivants :
- Expressions booléennes
- Appels de méthode
- Expressions de propriété
- Affectations de variables
Voici un exemple d'expression de propriété MVEL simple :
context.errorMessage
Il extrait la propriété
errorMessage
à partir de la variable ou de l'objet de contexte context
.MVEL prend en charge tous les opérateurs de comparaison, mathématiques et logiques habituels de Java. Le tableau suivant récapitule les autres opérateurs MVEL importants :
Opérateur | Description | Exemple |
|---|---|---|
new
| Instancie un objet. | new String("foo")
|
with
| Exécute plusieurs opérations sur une seule instance d'objet. | with (value) { name = 'Foo', age = 50, sex = Sex.MALE }
|
assert
| Affirme qu'une valeur est vraie ou qu'elle échoue avec AssertionError. | assert foo != null
|
contains
| Détermine si la valeur de gauche contient la valeur de droite. | var contains "Foo"
|
is ou instance of
| Détermine si la valeur de gauche est membre de la classe de droite. | var instanceof String
|
strsim
| Compare les chaînes et renvoie leur similarité exprimée en pourcentage. | "foobol" strsim "foobar"
|
soundslike
| Exécute une comparaison soundex entre deux chaînes. | "foobar" soundslike "fubar"
|
&
| Exécute une opération ET au niveau du bit. | foo & 5
|
|
| Exécute une opération OU au niveau du bit. | foo | 5
|
^
| Exécute une opération XOR au niveau du bit. | foo ^ 5
|
+
| Opérateur surchargé pour concaténer deux chaînes. | "foo" + "bar"
|
#
| Concatène deux littéraux sous forme de chaînes. | 8 # 9
|
in
| Inspecte les objets d'une collection. | (foo in list)
|
=
| Affecte une valeur à une variable. | var = "foobar"
|
Test des valeurs
Dans Java, l'opérateur
==
vérifie si les références pointent vers le même objet. En revanche, dans M Valeur, l'opérateur de comparaison ==
vérifie si les valeurs sont égales. L'expression MVE foo == 'bar'
est l'équivalent de Java. foo.equals("bar")
.Exemple d'expression booléenne MVEL :
user.name == 'John Smith'
Il renvoie
true
si name
propriété de la variable ou de l'objet de contexte user
est John Smith.MVEL utilise la contrainte de type. Si vous comparez deux valeurs de types différents, MVEL tente de contraindre la valeur de droite au type de gauche. Si ce n'est pas possible, il tente de contraindre la valeur de gauche au type de droite. Exemple :
"123" == 123;
Cette expression renvoie
true
car MVE limite la valeur à droite à une chaîne avant d'effectuer la comparaison.Listes, cartes et tableaux
Mettez les listes MVEL entre crochets. Séparez les éléments par des virgules. Exemple :
["Paris", "London", "Berlin"]
Mettez les cartes MVEL entre crochets. Séparez les clés et les valeurs par des deux-points. Exemple :
["Foo" : "Bar", "Bar" : "Foo"]
Mettez les tableaux MVEL entre accolades. Séparez les éléments par des virgules. Exemple :
{"Bill", "Bob", "Ben"}
Navigation dans les propriétés
MVEL fournit une syntaxe unique et unifiée pour accéder aux propriétés, aux champs statiques, aux listes, aux cartes et aux tableaux.
Avec Java, vous pouvez accéder à une propriété à partir d'un objet en utilisant l'instruction suivante :
context.getException().getCause()
Avec MVEL, vous pouvez accéder à la même propriété à l'aide de l'expression suivante :
context.exception.cause
Accédez aux listes et aux tableaux de la même manière. Exemple :
parts[2]
Vous accédez aux cartes de la même manière que les tableaux, mais vous pouvez transmettre n'importe quel objet comme valeur d'index. Exemple :
props["foobar"]
Si une carte utilise une chaîne comme clé, vous pouvez la traiter elle-même comme un objet virtuel. Exemple :
props.foobar
MVEL traite les chaînes comme des tableaux à des fins d'indexation.
Cet exemple renvoie
B
:foo = "Berlin"; foo[0];
Affectation
Vous pouvez affecter des variables dans une expression MVEL à utiliser dans l'expression ou à extraire lors de l'exécution.
MVEL étant un langage à typage dynamique, vous n'avez pas besoin de spécifier de type lorsque vous déclarez une nouvelle variable. Mais vous pouvez le faire.
Les deux exemples suivants sont valides en MVEL :
str = "Some string"; String str = "Some string";
Lors de l'affectation d'une valeur à une variable typée, MVEL tente d'effectuer une conversion automatique de type. Exemple :
String num = 1;
Vous pouvez convertir la valeur d'une variable dont le typage est dynamique en un autre type. Exemple :
String num = 1;
Section : typage et contrainte
MVEL utilise le typage dynamique, avec un typage statique facultatif. Les objets Java natifs sont de type statique. Pour interagir avec eux, MVEL doit parfois effectuer une contrainte de type, ce qui peut avoir des conséquences sur la performance.
MVEL impose automatiquement le type qui semble le mieux adapté à la valeur actuelle. Par conséquent, vous devez être prudent lorsque vous travaillez avec des nombres. Des erreurs peuvent survenir lors d'exécutions arithmétiques à point flottant, car M Valeur est automatiquement rejetée à partir d'une précision infinie.
java.math.BigDecimal
à java.lang.Double
et java.lang.Long
. Cela peut poser des problèmes lorsque le type de la valeur stockée ne correspond pas à ce que vous attendez. De manière générale, il convient d'éviter d'effectuer des calculs non entiers avec des valeurs financières en MVEL.La contrainte de type de MVEL signifie que vous pouvez appeler des méthodes Java sans ajuster les saisies. L'interpréteur, ou le compilateur, analyse les types que vous transmettez à la méthode et détermine la contrainte requise.
En cas de conflit de type de tableau, MVEL tente de contraindre l'ensemble du tableau à utiliser le type de saisies requis.
MVEL applique toute contrainte nécessaire sur une variable de type statique, à condition que la valeur affectée soit contraignable. Si ce n'est pas le cas, une exception se produit.