Passa al contenuto principale
Administrator Guide
Ultimo aggiornamento: 2023-06-23
Concetto: Nozioni di base su MVEL

Concetto: Nozioni di base su MVEL

Sintassi

MVEL è un linguaggio di espressione per applicazioni basate su Java. La sua sintassi è simile a quella di Java, ma presenta alcune aggiunte che lo rendono più efficiente nell'abbinamento dei contenuti.
Nota:
  • MVEL utilizza spazi dei nomi e classi Java, ma non può dichiararle.
  • A differenza di Java, MVEL è tipizzato in modo dinamico, con tipizzazione facoltativa.
  • Le espressioni MVEL possono essere istruzioni singole o script multiriga. Per gli script multiriga, utilizzare un punto e virgola per separare ogni istruzione.
  • MVEL opera in base al principio dell'ultimo valore in uscita. Supporta
    return
    parola chiave, ma in genere non la richiede.
  • MVEL supporta le regole di precedenza degli operatori e utilizza il bracketing per controllare l'ordine di esecuzione.
  • È possibile racchiudere valori letterali stringa MVEL tra virgolette singole o doppie.
  • Il punto e virgola è un carattere riservato in MVEL. Non è possibile utilizzarlo nelle espressioni. Utilizzare
    (char) 59
    invece. Esempio:
    props['string']='a;b'
    genera un errore. Questo codice non:
    props['string']= (char) 59 props['string_new']='a'props['string']'b'
Le espressioni MVEL possono includere:
  • Espressioni booleane
  • Richiami di metodi
  • Espressioni di proprietà
  • Assegnazioni variabili
Un esempio di semplice espressione di proprietà MVEL:
context.errorMessage
Estrae la proprietà
errorMessage
dalla variabile o dall'oggetto contesto
context
.
MVEL supporta tutti i consueti operatori Java di confronto, matematici e logici. La seguente tabella riepiloga altri importanti operatori MVEL:
Operatore
Descrizione
Esempio
new
Crea un'istanza di un oggetto.
new String("foo")
with
Esegue più operazioni su una singola istanza di oggetto.
with (value) { name = 'Foo', age = 50, sex = Sex.MALE }
assert
Afferma che un valore è vero o ha esito negativo con AssertionError.
assert foo != null
contains
Determina se il valore a sinistra contiene il valore a destra.
var contains "Foo"
is
o
instance of
Determina se il valore a sinistra è un membro della classe a destra.
var instanceof String
strsim
Confronta le stringhe e restituisce la loro somiglianza espressa in percentuale.
"foobol" strsim "foobar"
soundslike
Esegue un confronto soundex tra due stringhe.
"foobar" soundslike "fubar"
&
Esegue un'operazione AND bit a bit.
foo & 5
|
Esegue un'operazione OR bit a bit.
foo | 5
^
Esegue un'operazione XOR bit per bit.
foo ^ 5
+
Operatore sovraccaricato per concatenare due stringhe.
"foo" + "bar"
#
Concatena due valori letterali come stringhe.
8 # 9
in
Esamina gli oggetti all'interno di una raccolta.
(foo in list)
=
Assegna un valore a una variabile.
var = "foobar"

Test del valore

In Java, l'operatore
==
verifica se i riferimenti puntano allo stesso oggetto. In MVEL, invece, l'operatore di confronto
==
verifica se i valori sono uguali. Espressione MVEL
foo == 'bar'
è l'equivalente di Java
foo.equals("bar")
.
Un esempio di espressione booleana MVEL:
user.name == 'John Smith'
Ritorna
true
se il
name
proprietà della variabile o dell'oggetto contesto
user
è John Smith.
MVEL utilizza la coercizione del tipo. Se si confrontano due valori di tipi diversi, MVEL tenta di forzare il valore a destra sul tipo a sinistra. Se ciò non è possibile, tenta di forzare il valore a sinistra sul tipo a destra. Esempio:
"123" == 123;
Questa espressione viene restituita
true
perché MVEL forza il valore a destra su una stringa prima di eseguire il confronto.

Elenchi, mappe e matrici

Racchiudere gli elenchi MVEL tra parentesi quadre. Separare gli elementi con virgole. Esempio:
["Paris", "London", "Berlin"]
Racchiudere le mappe MVEL tra parentesi quadre. Separare le chiavi e i valori con i due punti. Esempio:
["Foo" : "Bar", "Bar" : "Foo"]
Racchiudere le matrici MVEL tra parentesi graffe. Separare gli elementi con virgole. Esempio:
{"Bill", "Bob", "Ben"}

Navigazione proprietà

MVEL offre un'unica sintassi unificata per l'accesso a proprietà, campi statici, elenchi, mappe e matrici.
In Java, è possibile accedere a una proprietà da un oggetto utilizzando la seguente istruzione:
context.getException().getCause()
In MVEL è possibile accedere alla stessa proprietà utilizzando questa espressione:
context.exception.cause
Accedere a elenchi e matrici allo stesso modo. Esempio:
parts[2]
Si accede alle mappe allo stesso modo delle matrici, ma è possibile passare qualsiasi oggetto come valore di indice. Esempio:
props["foobar"]
Se una mappa utilizza una stringa come chiave, è possibile considerare la mappa stessa come un oggetto virtuale. Esempio:
props.foobar
MVEL considera le stringhe come matrici ai fini dell'indicizzazione.
Questo esempio restituisce
B
:
foo = "Berlin"; foo[0];

Assegnazione

In un'espressione MVEL è possibile assegnare variabili da utilizzare all'interno dell'espressione o per l'estrazione in fase di esecuzione.
Poiché MVEL è un linguaggio tipizzato dinamicamente, non è necessario specificare un tipo quando si dichiara una nuova variabile. È comunque possibile farlo.
Entrambi i seguenti esempi sono validi in MVEL:
str = "Some string"; String str = "Some string";
Quando si assegna un valore a una variabile tipizzata, MVEL tenta di eseguire la conversione automatica del tipo. Esempio:
String num = 1;
È possibile eseguire il cast del valore di una variabile tipizzata in modo dinamico a un altro tipo. Esempio:
String num = 1;

Sezione: Digitazione e coercizione

MVEL utilizza la tipizzazione dinamica, con la tipizzazione statica facoltativa. Gli oggetti Java nativi sono tipizzati in modo statico. Per interagire con loro, a volte MVEL deve eseguire la coercizione dei tipi, che può avere implicazioni sulle performance.
MVEL forza automaticamente il tipo su quello che sembra migliore per il valore corrente. Ciò significa che è necessario prestare attenzione quando si lavora con i numeri. Possono verificarsi errori nell'aritmetica a virgola mobile perché MVEL esclude automaticamente la precisione infinita
java.math.BigDecimal
a
java.lang.Double
e
java.lang.Long
. Ciò può causare problemi quando il tipo del valore archiviato non è quello previsto. In generale, è consigliabile evitare di eseguire operazioni aritmetiche con numeri non interi per valori finanziari in MVEL.
La coercizione del tipo di MVEL consente di richiamare i metodi Java senza modificare gli input. L'interprete o il compilatore analizza i tipi che si stanno passando al metodo e determina quale coercizione è necessaria.
In caso di conflitto tra i tipi di matrice, MVEL tenta di forzare l'intera matrice al tipo di input necessario.
MVEL esegue qualsiasi coercizione necessaria su una variabile tipizzata in modo statico, a condizione che il valore assegnato sia forzabile. In caso contrario, si verifica un'eccezione.