Zum Hauptinhalt springen

Web-Schnittstelle - Beispiel einer Web-Anbindung

Web-Schnittstelle - Beispiel einer Web-Anbindung Anwendungsbeispiel der Web-Schnittstelle

In einem kleinen Beispiel soll die Kommunikation zwischen dem Browser und der Datenbank verdeutlicht werden. Wesentlich dazu ist die Verbindung von Prozeduren in der Datenbank und den HTML-Seiten.

Das Beispiel besteht aus nur einer CONZEPT 16-Prozedur, aus der alle HTML-Seiten generiert werden. Das Programm soll eine vom Benutzer ausgedachte Zahl zwischen 1 und 10 erraten.

In der Konfigurationsdatei wurde die Prozedur WebRequest als Request-Funktion eingetragen. Damit wird in der Applikation die main-Funktion der Prozedur aufgerufen, sobald ein Request an die Applikation gestellt wird.

Der vollständige Prozedurtext ohne ausführliche Kommentare befindet sich hier .

Die Request-Funktion besteht aus einem switch-Konstrukt, das den Aufrufzeitpunkt unterscheidet:

main()
{
switch (WseStatus())
{
case _WseUserInit : ...
case _WseUserProc : ...
case _WseUserTerm : ...
} // End of switch (WseStatus())
} // End of main()

Gibt der Befehl WseStatus () _WseUserInit zurück, wurde die Request-Funktion zum ersten Mal aufgerufen. Es wird also ein neues Spiel gestartet. Dazu wird ein globaler Datenbereich angelegt, der wie folgt definiert ist:

global Common
{
g.fLowest : float; // untere Grenze des Ratebereiches
g.fHighest : float; // obere Grenze des Ratebereiches
g.fGuess : float; // geratene Zahl
g.iTry : int; // Anzahl der benötigten Versuche
}

Für den Fall des ersten Aufrufs der Request-Funktion wird folgendes Programmsegment durchlaufen:

 
case _WseUserInit : // erster Aufruf der Request-Funktion
{
VarAllocate(Common);

// Seite zurückgeben
WseReturn(_WseRetString, 0, 'text/html', 'Denken Sie ' +
'sich eine Zahl zwischen 1 und 10 aus.<br>' +
'<a href="C16.URL(absolute,Mode=Starten)">Starten' +
'</a><br>');
} // Ende von case _WseUserInit

Nachdem die Seite zurückgegeben wurde, kann der Benutzer nur den angegebenen Link betätigen. Dem Link wird des Argument Mode=Starten angefügt. Dieses Argument kann in der Request-Funktion entsprechend ausgewertet werden.

    case _WseUserProc : // wiederholter Aufruf der Request-Funktion
{
switch (WseArg(_WseArgReq, 'Mode'))
{
case 'Starten' : // Neues Spiel starten
{
// Initialisierung des Datenbereiches
g.fLowest # 1.0;
g.fHighest # 10.0;
g.iTry # 1;

// ersten Versuch berechnen
g.fGuess # Rnd((g.fHighest + g.fLowest) / 2.0);

// Seite zurückgeben
WseReturn(_WseRetString, 0, 'text/html',
'Ich versuche ' + CnvAF(g.fGuess, 0) + '<br>' +
'<a href="C16.URL(absolute,Mode=GuessLow)">zu ' +
'niedrig</a><br>' +
'<a href="C16.URL(absolute,Mode=GuessRight)">' +
'richtig geraten</a><br>' +
'<a href="C16.URL(absolute,Mode=GuessHigh)">zu ' +
'hoch</a><br>');
} // End of case 'Starten'
...
} // End of switch (WseArg(_WseArgReq,'Mode'))
} // End of case _WseUserProc

Die weiteren Argumente müssen ebenfalls ausgewertet werden können. Innerhalb der switch-Konstruktion switch (WseArg(_WseArgReq, 'Mode'))

müssen also noch die Fälle GuessLow, GuessRight und GuessHigh abgefragt werden.>

Die Fälle GuessLow und GuessHigh unterscheiden sich nur in der Berechnungsvorschrift des nächsten Ratevorgangs. Je nach Fall wird die untere Grenze des Ratebereiches nach oben oder die obere Grenze nach unten verschoben.

        case 'GuessLow' : // zu niedrig geraten
{
Inc(g.iTry);
// unteren Bereich noch oben verschieben
g.fLowest # g.fGuess;
// g.fHighest # g.fGuess bei oberen Bereich

// neuen Versuch berechnen
g.fGuess # Rnd((g.fHighest + g.fLowest) / 2.0);

// Seite zurückgeben
WseReturn(_WseRetString, 0, 'text/html',
'Ich versuche ' + CnvAF(g.fGuess, 0) + '<br>' +
'<a href="C16.URL(absolute,Mode=GuessLow)">zu ' +
'niedrig</a><br>' +
'<a href="C16.URL(absolute,Mode=GuessRight)">' +
'richtig geraten</a><br>' +
'<a href="C16.URL(absolute,Mode=GuessHigh)">zu ' +
'hoch</a><br>');
} // End of case 'GuessLow'

Im Falle das richtig geraten wurde, wird die Anzahl der Versuche ausgegeben und der Benutzer abgemeldet.

        case 'GuessRight' : // richtig geraten
{
// Anzahl der Versuche anzeigen
WseReturn(_WseRetString, _WseTerm, 'text/html',
'Ich habe ' + CnvAI(g.iTry) + ' Versuche ' +
'gebraucht.<br>');
} // End of case 'GuessRight'

Vor dem Entfernen des Web-Benutzers wird die Request-Funktion nochmals aufgerufen. In diesem Fall wird von WseStatus () der Wert _WseUserTerm zurückgegeben. Hier wird lediglich der in _WseUserInit angelegt Datenbereich freigegeben.

    case _WseUserTerm : // letzter Aufruf der Request-Funktion
{
VarFree(Common);
} // End of _WseUserTerm