Announcement

Collapse
No announcement yet.

Beispiele zur JEXL API

Collapse
This is a sticky topic.
X
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Beispiele zur JEXL API

    Die JEXL (Java Expression Language) ist eine API zur Auswertung von Expressions in Java. Damit lassen sich recht einfach Strings, die Java-Ausdrücke enthalten auswerten und die Ergebnisse weiterverarbeiten. Dabei können nicht nur einfache mathematische Strings ausgewertet werden, auch die Vorgabe von Klassen und die Arbeit mit if, while u.a. ist möglich.

    Zur Nutzung ist die Jexl-API und die Commons-Logging-API in das Projekt einzubinden.

    Die JEXL-API ist hier erhältlich
    Die Commons-Logging-API ist hier erhältlich

    Zunächst ein Beispiel für die Auswertung eines mathematischen Ausdrucks:

    [highlight=java]

    JexlEngine jexlEngine=new JexlEngine();
    Expression expr=jexlEngine.createExpression("3+5*6+PI");
    JexlContext jexlContext=new MapContext();
    jexlContext.set("PI",Math.PI);
    System.out.println(expr.evaluate(jexlContext));
    [/highlight]
    Ergebnis: 36.1415926535898

    Zunächst wird eine neue JexlEngine erstellt. Als Expression wird der Ausruck 3+5*6+PI vorgegeben. Nunmehr wird ein JexlContext erstellt. Dies ist eine HashMap, die die individuellen Objekte die die Expression enthält, der JexlEngine zur Verfügung stellt. In diesen Fall ist das PI. Dieser Wert wird im JexlContext mit dem PI-Wert aus der Klasse Math vorbelegt. Dann erfolgt mit evaluate die Auswertung der Expression.

    Ein weiteres Beispiel mit einer eigenen Klasse:

    Zunächst legen wir eine Testklasse an:

    [highlight=java]
    public class Testklasse
    {
    private int berechnungswert;

    public Testklasse(int berechnungswert)
    {
    this.berechnungswert=berechnungswert;
    }

    public int getBerechnungswert()
    {
    return berechnungswert;
    }

    public void setBerechnungswert(int berechnungswert)
    {
    this.berechnungswert=berechnungswert;
    }

    }
    [/highlight]

    Eine einfache Klasse, die über den Konstruktor einen Berechnungswert erhält und die über entsprechende Getter/Setter verfügt

    Nunmehr die Expression

    [highlight=java]

    Testklasse tk=new Testklasse(50);
    JexlEngine jexlEngine=new JexlEngine();
    Expression expr=jexlEngine.createExpression("3+testklasse.get Berechnungswert()");
    JexlContext jexlContext=new MapContext();
    jexlContext.set("testklasse",tk);
    System.out.println(expr.evaluate(jexlContext));
    [/highlight]
    Ergebnis: 53

    Zunächst wird die Testklasse angelegt und mit dem Wert 50 durch den Konstruktor versorgt. In den JexlContext wird die Klasse Testklasse mit dem Namen testklasse eingefügt. Dieser Name ist frei wählbar. Obiges Beispiel funktioniert auch, wenn als Name Teddy gewählt worden wäre. In der Expression wird nunmehr mit dem gewählten Namen und der in der Testklasse vorhandenen Methoden eine Expression erstellt.

    Ein weiteres Beispiel mit einer if-Bedingung:
    [highlight=java]

    Testklasse tk=new Testklasse(30);
    JexlEngine jexlEngine=new JexlEngine();
    Expression expr=jexlEngine.createExpression("if(teddy.getBere chnungswert()>50){\"größer 50\";}else{ \"kleiner gleich 50\";}");
    JexlContext jexlContext=new MapContext();
    jexlContext.set("teddy",tk);
    System.out.println(expr.evaluate(jexlContext));
    [/highlight]
    Ergebnis: kleiner gleich 50

    Hier wurde nun teddy als Name in den JexlContext gesetzt. Als Expression dient jetzt eine if-Bedingung. Ausgeschrieben sieht sie so aus
    [highlight=java]
    if(teddy.getBerechnungswert()>50)
    {
    \"größer 50\";
    }else
    {
    \"kleiner gleich 50\";
    }
    [/highlight]

    Bitte beachten, dass KEIN return geschrieben wird
    Zuletzt editiert von Christian Marquardt; 23.07.2011, 09:48.
    Christian
Working...
X