Zusatzinformationen

Neuigkeiten in der Version 2.3

Das Framework wurde auf groovy 1.6.0 angepasst
das Menue kann in den Linkbar ${linkbar} und in den Backlinkbar ${backlinkbar} getrennt werden.
Um diese Funktionen zu demonstrieren wurde ein weiteres Demononstrationenprojekt erstellt. Dieses zeigt ein Drei-Spaltenlayout.

Neuigkeiten in der Version 2.2.4

Minor Bugfixes
Im Kriteriebuilder wurde die Option "order" eingebaut. Beispiel order(maxSalary:'desc',jobID:'ASC')

Neuigkeiten in der Version 2.2

eachDomain wurde um die Möglichkeit erweitert Abfragen basierend auf den Domainfeldnamen zu Formulieren. Dazu wurde ein Groovy-Builder erstellt.
Beispiel:
jobs.eachDomain(criteria:{greaterequals(minSalary:8000)}){domJob->
   closure.call(domJob)
   }
Details können in den Artikel unter "eachDomain mit Kriterien" entnommen werden

Neuigkeiten in der Version 2.00

Es wurde Dynamische Abfragemöglichkeite eingebaut.
Beispiel:
def query1 = {Closure closure->
   jobs.eachDomainByJobTitleLikeAndMinSalaryGreaterThan(
      orderby:['minSalary','JobID'],
      conditions:['Pu%',1000]) {domJob->
      closure.call(domJob)
      }
   }
Für Details stehen die Demonstrationsapplikation "sonstige" --> finder und ein Artikel ueber Dynamische Abfragen zur Verfügung.

Neuigkeiten in der Version 1.10

Standard HTTP Method GET/POST

Das Framewerk verwendete bei den als Standardvorgabe bei HTTP Requests "POST". Dieses Verhalten kann in der Taglib umgestellt werden.
def taglib = new Taglib(request:request, httpMethod:'GET')
Im laufenden Betriebs kann dies durch
taglib.httpMethod='GET'
geschehen.

Inlineedit

In einer Grid Maske kann durch betätigen der AKtionsschaltfläche 'edit' der Inhalt der gewählten Zeile in den Eingabebereich kopiert werden.
Beispiel

Dialoge

Das Framework stellt die Möglichkeiten zu Verfügung Dialoge in den Workflow einzubauen. Dies ist zum Beispiel notwending um nach Löschoperationen eine Sicherheitsabfrage zu implementieren.
Die Funktion ist in der Klasse framework.helper.Dialog implementiert.

Im viewhandler kann diese automatisch aufgerufen werden.

Viewhandler crud = new Viewhandler(
 controller:this,
 action:'grid',
 gridConfirmOnDelete:Viewhandler.GRID_COFIRM_ON_DELETE,
 viewBindings:[
   list:list
  ]
 )

Implementation im Viewer


Neuigkeiten in der Version 1.9

DAO: (DataAccessObject)

Das ist die Basisklasse für die Domainklassen.
Transaktionskontrolle
  • beginTransaction()
    Einschalten der Transaktionskontrolle
  • rollback()
    Datenbankänderungen werden zurückgesetzt
  • commit()
    Bestätigen der Datenbanänderungen
  • autocommit()
    Schaltet die Transaktionskontrolle wieder aus. Jede Datenbankänderung wird sofort durchgeführt.
Diese Methoden können im Controller oder in einer Domainklasse aufgerufen werden. z.B.: jobs.beginTransaction()

Beispiel ist in der Demoapplikation im Pfad '/root/extras/sonstiges/transaction' demonstriert.

setDomainField

Es wurde die Möglichkeit geschaffen, Daten in die Domain zu schreiben und die Feldvalidatoren zu nutzen.
jobs.clearErrors()
jobs.setDomainField('a123','maxSalary')
jobs.setDomainField('123.45','minSalary')
                
Fehler können auf zwei Arten erkannt werden.
  • die Methode liefert einen Wahrheitswert zurück
  • Beim Auftreten eines Fehler wird in die Liste errors der Domain Fehlermeldungen eingetragen.
Anzeigen der Fehlermedungen:
Die Datenstruktur errors ist eine Liste mit Map Einträgen. Die Einträge haben folgende Schlüselwerte:
  • 'field': Feldname
  • 'message': Fehlermeldung
  • 'value': Übergebene Daten
Beispiel:
jobs.errors.each{error->
   render "Im Feld ${error.field} trat der Fehler: ${error.message} auf. Value: ${error.value}
" }
In der Demoapplikation wird dies im Pfad
'/root/extras/sonstiges/setdomainfield' domonstriert.

Alternativer Container

Das Framwork liefert sein Ergebnis standardmäßig in den Container 'main.gsp' Im Controller kann durch die Anweisung setContainer(filename:'alternative.gsp') umgesetzt werden.

Der Container ist im Verzeichnis WEB-INF zu notieren.

Ein Beispiel ist im Pfad /root/extras/sonstiges/plainlist demonstriert.

Neuigkeiten in der Version 1.8

Bugfix Version: 1.81
Es wurden Bugs in der Demonstrations Applikation entfernt. Danke für den Test an "HUMP".
  • Demonstrationsapplikation:
    Die Sourcen wurden um noch mehr Kommentare erweitert.
  • Die Klasse Viewehandler:
    Die Reihenfolge der Prüfungen (validatorren) wurde vereinheitlicht
      Aufrufreihenfolge
    • Feldprüfung validate in meta.fields
    • Datensatzprüfung validate in meta
    • Der Event befor_write
    Siehe dazu die EmployeesDomain.groovy in der Demonstrationsapplikaiton.
      Erweiterungen der Feldbeschreibungen in der Domain (meta.fields): Es wurden weiter Events eingebaut:
      • after_read: wird nach dem einlsen des Datensatzes aus der Db in die Domain aufgerufen
      • before_write: wird vor dem Schreiben in die Db und nach validate aufgerufen
      • after_cgi: wird aufgerufen, wenn die Daten aus den CGI Variable in die Domain übertragen wurden.
      	salary:[
      		dbfield:'SALARY',
      		type:'Double',
      
      		/**
      		* Diese Closure wird nach dem Lesen der Daten aus dem
      		* Datenbakrecord aufgerufen. Der Returnwert wird in 
      		* das Feld der Domain geschrieben.
      		*/
      		after_read:{value->return value?:0.0},
      
      		/**
      		* Diese Closure wird vor dem Schreiben der Daten
      		* in den Datenbakrecord aufgerufen und das Ergebnis
      		* in das Datenfeld geschrieben.
      		*/
      		before_write:{value->return value * 1.0},
      
      		/**
      		* Diese Closure wird vor dem 
      		* schreiben aufgerufen.
      		*/
      		after_cgi:{value->return (value =~ /,/).replaceFirst('.')}
      		],
      
      				   
  • Die Entwicklungsumgebung wurde um jEdit erweitert.
  • DAO: es wurden für die Domainklassen die Sql Funktionen
    • sqlCount() (COUNT(*)
    • sqlAvg() (AVG)
    • sqlSum()< (SUM)/li>
    • sqlMin() (MIN)
    • sqlMax() (MAX)
    implementiert. Alle Funktionen können mit der Option where verschen werden Beispiel domain.sqlCount(where:'SALARY < 2000'). Die Funktion liefert ein Integer zurück.

Neuigkeiten in der Version 1.7

  • Es wurde die Domonstrationsapplikation völlig neu überarbeitet.
  • Die Klasse CRUD wurde stillgelegt und durch Viewhandler ersetzt
  • Die Klasse Taglib wurde erweitert

Domonstrationsapplikation

Die Applikation wurde vollständig mit der Klasse Viewhandler entwickelt. Durch Erweiterung der Klasse Taglib konnte ein wesentlich kompakterer Code erstellt werden.

Was wird demonstriert

  • EmployeesDomain
    Die verschiedenen Möglicheiten der Konfigureation der Domain (Metadaten).
  • JobsDomain
    Zeigt die Verwendung vom Domainmethoden zum Erzeugen der Daten für eine Datasource welche in der Taglib benötigt werden.
  • Grid (Datenbearbeitung in Tabellenform)
    extras -> recht zeigt die Verwendung von Grid
  • Auswahlliste mit Editiermaske
    extras -> lov zeigt die Verwendung einer Auswahliste mit Editiermaske.
  • Eine Auswahlliste mit Paginierung
    extras -> jobs zeigt eine Auswahlliste mit Paginierung.
  • Auswahlliste mit Filter und Paginierung
    extras -> employees zeigt eine Filterfunktion bei den Auswahlliste,
  • usw.

Viewhandler

Die Klasse CRUD wurde vollständig von der Klasse Viewhandler ersetzt. CRUD wird nicht mehr gewartet aber aus kompatibilitätsgründen weiter ausgeliefert.

Taglib

Erweiterte Funktionen
  • form
    taglib.form(name:'edit') erzeugt einen Formtag
  • hidden
    taglib.hidden name:'action', value:'grid' erzeugt eine Hidden-Tag
Und vieles mehr.