Skip to main content
Administrator Guide
Laatst bijgewerkt: 2023-06-23
Concept: MVEL Fundamentals

Concept: MVEL Fundamentals

Syntaxis

MVEL is een expressietaal voor op Java gebaseerde toepassingen. De syntaxis is vergelijkbaar met die van Java, maar er zijn enkele toevoegingen waardoor het efficiënter is om inhoud te matchen.
Opmerking:
  • MVEL gebruikt Java-naamruimten en -klassen, maar kan zelf ook geen declareren.
  • In tegenstelling tot Java wordt MVEL dynamisch getypt, met optioneel typen.
  • MVEL-expressies kunnen enkelvoudige instructies of scripts met meerdere regels zijn. Gebruik voor scripts met meerdere regels een puntkomma om elke instructie te scheiden.
  • MVEL werkt volgens het principe van de laatste waarde uit. Het ondersteunt de
    return
    zoekwoord, maar is dit over het algemeen niet vereist.
  • MVEL ondersteunt prioriteitsregels voor operatoren en maakt gebruik van haakjes om de uitvoeringsvolgorde te bepalen.
  • U kunt letterlijke MVEL-tekenreeksen tussen enkele of dubbele aanhalingstekens plaatsen.
  • De puntkomma is een gereserveerd teken in MVEL. U kunt het niet in expressies gebruiken. Gebruiken
    (char) 59
    in plaats daarvan. Voorbeeld:
    props['string']='a;b'
    genereert een fout. Deze code niet:
    props['string']= (char) 59 props['string_new']='a'props['string']'b'
MVEL-expressies kunnen het volgende bevatten:
  • Boole-expressies
  • Methodeaanroepen
  • Eigenschapsexpressies
  • Variabele toewijzingen
Een voorbeeld van een eenvoudige MVEL-eigenschapsexpressie:
context.errorMessage
Het extraheert de eigenschap
errorMessage
van de variabele of het contextobject
context
.
MVEL ondersteunt alle gebruikelijke vergelijkings-, wiskundige en logische operatoren in Java. In deze tabel vindt u een overzicht van andere opvallende MVEL-operatoren:
Operator
Omschrijving
Voorbeeld
new
Instanteert een object.
new String("foo")
with
Voert meerdere bewerkingen uit op één objectinstance.
with (value) { name = 'Foo', age = 50, sex = Sex.MALE }
assert
Bevestigt dat een waarde waar is of mislukt met een AssertionError.
assert foo != null
contains
Hiermee wordt bepaald of de waarde aan de linkerkant de waarde aan de rechterkant bevat.
var contains "Foo"
is
of
instance of
Hiermee wordt bepaald of de waarde aan de linkerkant een lid is van de klasse aan de rechterkant.
var instanceof String
strsim
Hiermee vergelijkt u tekenreeksen en retourneert de overeenkomst, uitgedrukt als percentage.
"foobol" strsim "foobar"
soundslike
Voert een soundex-vergelijking uit tussen twee tekenreeksen.
"foobar" soundslike "fubar"
&
Voert een bitsgewijze AND-bewerking uit.
foo & 5
|
Voert een bitsgewijze OF-bewerking uit.
foo | 5
^
Voert een Bitwise XOR-bewerking uit.
foo ^ 5
+
De operator Overloaded voor het samenvoegen van twee tekenreeksen.
"foo" + "bar"
#
Voegt twee letterlijke waarden samen als tekenreeksen.
8 # 9
in
Inspecteert objecten binnen een verzameling.
(foo in list)
=
Wijst een waarde toe aan een variabele.
var = "foobar"

Waardetest:

In Java is de operator
==
Hiermee wordt gecontroleerd of verwijzingen naar hetzelfde object verwijzen. In MVEL is de vergelijkingsoperator
==
Hiermee wordt gecontroleerd of de waarden gelijk zijn. De MVEL-expressie
foo == 'bar'
is het equivalent van Java's
foo.equals("bar")
.
Een voorbeeld van een Boole-expressie van MVEL:
user.name == 'John Smith'
Het retourneert
true
als de
name
eigenschap van de variabele of het contextobject
user
is John Smith.
MVEL maakt gebruik van het type dwang. Als u twee waarden van verschillende typen vergelijkt, probeert MVEL de waarde aan de rechterkant te dwingen tot het type aan de linkerkant. Als dat niet mogelijk is, wordt geprobeerd de waarde aan de linkerkant naar het type aan de rechterkant te dwingen. Voorbeeld:
"123" == 123;
Deze expressie retourneert
true
omdat MVEL de waarde aan de rechterkant naar een tekenreeks dwingt voordat de vergelijking wordt uitgevoerd.

Lijsten, toewijzingen en matrices

Plaats MVEL-lijsten tussen vierkante haken. Scheid items met komma's. Voorbeeld:
["Paris", "London", "Berlin"]
Plaats MVEL-toewijzingen tussen vierkante haken. Scheid sleutels en waarden met dubbele punten. Voorbeeld:
["Foo" : "Bar", "Bar" : "Foo"]
Zet MVEL-matrices tussen accolades. Scheid items met komma's. Voorbeeld:
{"Bill", "Bob", "Ben"}

Eigenschapsnavigatie:

MVEL biedt één uniforme syntaxis voor toegang tot eigenschappen, statische velden, lijsten, toewijzingen en matrices.
In Java kunt u vanuit een object toegang krijgen tot een eigenschap met behulp van deze instructie:
context.getException().getCause()
In MVEL hebt u toegang tot dezelfde eigenschap met behulp van deze expressie:
context.exception.cause
Krijg op dezelfde manier toegang tot lijsten en matrices. Voorbeeld:
parts[2]
U opent toewijzingen op dezelfde manier als matrices, maar u kunt elk object als indexwaarde doorgeven. Voorbeeld:
props["foobar"]
Als een toewijzing een tekenreeks als sleutel gebruikt, kunt u de toewijzing zelf behandelen als een virtueel object. Voorbeeld:
props.foobar
MVEL behandelt tekenreeksen als matrices voor indexeringsdoeleinden.
Dit voorbeeld retourneert
B
:
foo = "Berlin"; foo[0];

Toewijzing

U kunt variabelen in een MVEL-expressie toewijzen voor gebruik in de expressie of voor extractie tijdens runtime.
Omdat MVEL een dynamisch getypeerde taal is, hoeft u geen type op te geven wanneer u een nieuwe variabele declareert. Maar u kunt dit doen.
Beide voorbeelden zijn geldig in MVEL:
str = "Some string"; String str = "Some string";
Bij het toewijzen van een waarde aan een getypeerde variabele, probeert MVEL een automatische typeconversie uit te voeren. Voorbeeld:
String num = 1;
U kunt de waarde van een dynamisch getypeerde variabele casten naar een ander type. Voorbeeld:
String num = 1;

Sectie: Typen en dwang

MVEL maakt gebruik van dynamisch typen, met optioneel statisch typen. Systeemeigen Java-objecten zijn statisch getypeerd. Om hiermee te kunnen communiceren, moet MVEL soms dwang van het type uitvoeren, wat gevolgen kan hebben voor de prestaties.
In MVEL wordt het type automatisch afgedwongen naar wat het beste lijkt voor de huidige waarde. Dit betekent dat u voorzichtig moet zijn bij het werken met getallen. Er kunnen fouten optreden in berekeningen met zwevende komma omdat oneindige precisie automatisch wordt verwijderd door MVEL
java.math.BigDecimal
naar
java.lang.Double
and
java.lang.Long
. Dit kan problemen veroorzaken wanneer het type opgeslagen waarde niet is wat u verwacht. Over het algemeen moet u geen niet-gehele berekeningen uitvoeren met financiële waarden in MVEL.
Het type coercion van MVEL betekent dat u Java-methoden kunt aanroepen zonder de invoer aan te passen. De interpreter of compiler analyseert de typen die u aan de methode doorgeeft en bepaalt welke dwang vereist is.
In het geval van een conflict met het matrixtype, probeert MVEL de hele matrix naar het benodigde invoertype te dwingen.
MVEL voert de benodigde dwang uit op een statisch getypeerde variabele, op voorwaarde dat de toegewezen waarde afdwingbaar is. Als dit niet het geval is, treedt er een uitzondering op.