Da groovt das Web: Agile Software-Entwicklung - JAXenter

Da groovt das Web: Agile Software-Entwicklung

Code-Beispiele

In der Zeiterfassung sind die Projekte ganz strikt in die Hierarchie Kunde – Projekt – Subprojekt gegliedert. Die Domain-Klasse für Kunden sieht (mit leichten Kürzungen) wie folgt aus.

import java.io.Serializable

class Customer implements Comparable, Serializable {

    String name
    String description

    // Navision customer id.
    String navisionId

    static hasMany = [
            projects: Project,
            accountManagers: AccountManager
    ]

    static constraints = {
        name(
                nullable: false,
                blank: false,
                unique: true,
                maxSize: 255
        )
        description(
                nullable: true,
                maxSize: 255
        )
        navisionId(
                nullable: true,
                blank: false,
                size: 5..5,
                unique: true
        )
    }

    String toString() { "$name ($navisionId)" }

    int compareTo(Object param) { ... }

    AccountManager addAccountManager(Person person) { ... }

    AccountManager removeAccountManager(Person person) { ... }
} 

Für das Bearbeiten eines Kunden sind nun zwei Aktionen und eine GSP-View nötig. Wenn jemand einen neuen Kunden bearbeiten möchte, so wählt er einen existierenden Kunden aus einer Liste aus, in dem er den entsprechenden Listeneintrag anklickt. Dies löst einen Request an die URL http://hostname/appname/customer/edit/1234 aus. 1234 steht hier für die interne ID des Kunden. Es wird gemäß Namenskonventionen die Aktion edit im Controller CustomerController.groovy angesprochen.

class CustomerController {
    ....
    def edit = {
        def customer = Customer.get(params.id)
        if (customer) {
            return [ customer: customer ]
        } else {
            flash.message = message(code: "customer.notFoundById",
                                    args: [params.id])
            redirect(controller: 'void', action: 'failure')
        }
    }

Wiederum gemäß Namenskonvention wird das Ergebnis dieser Aktion (das Model [ customer: customer ]) an die GSP customer/edit.gsp übergeben.


  <message code="customer.edit"></message>
${flash.message?.encodeAsHTML()}

Dieser Code beschreibt eine Seite mit einem Formular mit mehreren Eingabefeldern, mit denen die Daten eines bestehenden Kunden modifiziert werden können. Wenn der Benutzer auf Speichern (<g:actionSubmit … />) klickt, wird die Aktion update im CustomerController aufgerufen.

    def update = {
        def customer = Customer.get(params.id)
        if (customer) {
            customer.properties = params
            if (!customer.hasErrors() && customer.save()) {
                flash.message = message(code: "customer.updated.message",
                                        args: [customer.toString()])
                redirect(action: 'edit', id: customer.id)
            } else {
                render(view: 'edit', model: [customer: customer])
            }
        } else {
            flash.message = message(code: 'customer.notFoundById',
                                    args: [params.id])
            redirect(controller: 'void', action: 'failure')
        }
    }

Der existierende Kunde wird aus der Datenbank gelesen (Customer.get(…)), die Daten des Kunden werden mit den Daten aus dem Web-Formular überschrieben (customer.properties = params) und wenn diese neuen Daten sowohl die Constraints der Domain-Klasse (z.B. Name darf nicht leer sein) erfüllen, als auch das Speichern in der Datenbank (customer.save()) zu keinen Problemen geführt hat, so wird nochmals die Bearbeiten-Seite (redirect(action:’edit‘,…)) zusammen mit einer Erfolgsmeldung (flash.message = …) angezeigt.

Nach einem abwechslungsreichen Werdegang u.a. in den Bereichen Computer-Animation, CAD und Telekommunikation arbeitet Markus Hansmair seit 10 Jahren als Senior Software Consultant bei der ConSol* Software GmbH.“
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.