Class RemoteCalcMod

java.lang.Object
  extended by javax.servlet.GenericServlet
      extended by javax.servlet.http.HttpServlet
          extended by com.google.gwt.user.server.rpc.RemoteServiceServlet
              extended by RemoteCalcMod
All Implemented Interfaces:
com.google.gwt.user.client.rpc.RemoteService, com.google.gwt.user.server.rpc.SerializationPolicyProvider, RemoteCalcIntf, Serializable, Servlet, ServletConfig

public class RemoteCalcMod
extends com.google.gwt.user.server.rpc.RemoteServiceServlet
implements RemoteCalcIntf

Ein Rechner mit Stack-Architektur (model, remote).

Ein Objekt dieser Klasse stellt die Serverseite einer GWT- (Google-Webtoolkit-) AJAX-Anwendung dar. Die Client-Seite lässt sich beispielsweise durch die Klasse RemoteCalcGWT darstellen, nachdem jene Java-Quelle (von GWT) in JavaScript übersetzt wurde.

Die (Web-) Anwendung ist ein ganzzahliger Stackrechner. Es gibt vier Stackregistern — x, y, z und t — genau wie bei den berühmten HP-Taschenrechnern. Dezimale und hexadezimale Darstellung werden unterstützt.

Ein Objekt dieser Klasse stellt die reine Statusmaschine (model, Automat) eines solchen Stackrechners dar und bedient sich dazu jeweils eines CalcMod-Objekts.

Die (Tasten-) Eingaben für Ziffern, Enter und Operationen gehören nicht zum (RemoteCalcMod-) Objekt. Sie sind über öffentliche Methoden ansteuerbar. Damit ist ein beliebig gestalteter Controller einsetzbar.

Auf einer Demo-Seite kann man sich dies alles anschauen.

Hinweis 1:
Dieses Server- / Servlet-Beispiel mit einem Stackrechner ist nicht ganz so trivial wie die sonst üblichen Einstiegsbeispiele, die einen festen oder leicht berechenbaren String liefern — und dies nicht nur wegen des session management. Das Beispiel ist für viele Zwecke (Fernsteuerung, Fernabfrage) so als Vorbild / Ausgangspunkt einsetzbar. Die Sitzungsverwaltung kann ggf. (bei reiner Abfragefunktion beispielsweise) leicht weggelassen werden.

Hinweis 2:
Diese Klasse "wohnt" nicht in dem Paket, in der sie vom Zusammenhang her hingehörte; das wäre hier nämlich de.a_weinert.gwt.server. Wegen Tomcat's Servlet-Ladeproblemen aus Paketen (zumindest bei 5.5) lebt sie stattdessen "flat" im unbenannten / anonymen Paket.

Hinweis 3:
Alle mit GWT-AJAX "asynchron" über Callback genutzte Methoden liefern einheitlich String zurück. Der Wert ist immer die passende Darstellung des X-Stackregister bzw. in Einschalt- und Fehlerzuständen ein entsprechender Statustext.


Copyright 2007   Albrecht Weinert

Version:
1.2 (23.09.2007)
Author:
Albrecht Weinert
See Also:
RemoteCalcIntf, RemoteCalcIntfAsync, Serialized Form

Field Summary
static String CALC_MOD_KEY
          Schlüssel für Standard-CalcMod-Objekt der Sitzung.
static String VERS
          Versionstext.
protected  String xText
          X-Text.
 
Constructor Summary
RemoteCalcMod()
           
 
Method Summary
 String chgSign()
          Ändern des Vorzeichens von x:  x = -x.
 String chgXY()
          Vertauschen von x und y.
 String clrAll()
          Löschen von allen Registern.
 String clrX()
          Löschen des X-Registers.
 String enter()
          Push-Operation beziehungsweise Enter.
 String op2(char opSign)
          Zweistellige Operation; x = x op y.
protected  CalcMod prepState()
          Aktuellen Zustand liefern.
 String reset()
          Rücksetzen in den Einschaltzustand.
 String rollDown()
          Herunterrollen des Stack (t wird urspr.
 String setHex(boolean hex)
          Hex-Dez-Umschaltung.
 String setX(long x)
          Setzen des X-Registers auf einen Wert.
 String teilen2()
          Division und Rest (ganzzahlig) x,y = (y / x), (x mod y).
 String zif(int zif)
          Eingabe einer Ziffer (0..9; ..15).
 
Methods inherited from class com.google.gwt.user.server.rpc.RemoteServiceServlet
doGetSerializationPolicy, doPost, doUnexpectedFailure, getSerializationPolicy, getThreadLocalRequest, getThreadLocalResponse, onAfterResponseSerialized, onBeforeRequestDeserialized, processCall, shouldCompressResponse
 
Methods inherited from class javax.servlet.http.HttpServlet
doDelete, doGet, doHead, doOptions, doPut, doTrace, getLastModified, service, service
 
Methods inherited from class javax.servlet.GenericServlet
destroy, getInitParameter, getInitParameterNames, getServletConfig, getServletContext, getServletInfo, getServletName, init, init, log, log
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

VERS

public static final String VERS
Versionstext.

See Also:
Constant Field Values

CALC_MOD_KEY

public static final String CALC_MOD_KEY
Schlüssel für Standard-CalcMod-Objekt der Sitzung.

See Also:
Constant Field Values

xText

protected String xText
X-Text.

Constructor Detail

RemoteCalcMod

public RemoteCalcMod()
Method Detail

prepState

protected CalcMod prepState()
Aktuellen Zustand liefern.

Hinweis: Diese Methode organisiert das Session-Management mit J2EE- und GWT-Mitteln.

Returns:
das CalcMod-Objekt der aktuellen Sitzung

zif

public String zif(int zif)
Description copied from interface: RemoteCalcIntf
Eingabe einer Ziffer (0..9; ..15).

Diese Methode ist mit entsprechendem Parameter von den Zifferntasten 0..9, A..F aufzurufen.

Der x-Wert wird entsprechend geändert. Nach einer vorangegangenen Operation wird vorher RemoteCalcIntf.enter() ausgeführt.

return false, falls Ziffer außerhalb 0..9/15 oder falls overflow bei dezimal

Specified by:
zif in interface RemoteCalcIntf

op2

public String op2(char opSign)
Zweistellige Operation; x = x op y.

Diese Methode verknüpft die beiden unteren Stackregister (x und y) zu einem neuen (x-) Wert und "zieht" den Stack eins runter (t wird nach z kopiert).

Implementiert sind: +, -, *, /, % (Java-/C-Syntax), sowie $ (für x = y ** x).

Specified by:
op2 in interface RemoteCalcIntf
See Also:
RemoteCalcIntf.op2(char)

teilen2

public String teilen2()
Description copied from interface: RemoteCalcIntf
Division und Rest (ganzzahlig) x,y = (y / x), (x mod y).

Diese Methode berechnet den ganzzahligen Quotienten y / x und den ganzzahligen Rest y mod x (y % x in Java). Der neue Inhalt von x ist der Quotient und der von y der Rest. Durch Vertauschen mit RemoteCalcIntf.chgXY() kann man beide Ergebnisse abwechselnd ins x-Register bringen.
Die Register z und t bleiben unverändert.

Specified by:
teilen2 in interface RemoteCalcIntf

chgSign

public String chgSign()
Description copied from interface: RemoteCalcIntf
Ändern des Vorzeichens von x:  x = -x.

Diese Methode ändert das Vorzeichen des Inhalts des Hauptstackregisters x. Die anderen drei Stackregister. bleiben unverändert.

Specified by:
chgSign in interface RemoteCalcIntf

setHex

public String setHex(boolean hex)
Description copied from interface: RemoteCalcIntf
Hex-Dez-Umschaltung.

Diese Methode setzt den Modus Hexadezimal oder Dezimal.
Ein ggf. Änderung wird über die Rückgabe signalisiert und wirkt wie Eingabeabschluss (nächste Ziffer auto Enter).

Specified by:
setHex in interface RemoteCalcIntf

chgXY

public String chgXY()
Description copied from interface: RemoteCalcIntf
Vertauschen von x und y.

Diese Methode vertauscht den Inhalt der beiden unteren Stackregister. t und z bleiben unverändert.

Specified by:
chgXY in interface RemoteCalcIntf

rollDown

public String rollDown()
Description copied from interface: RemoteCalcIntf
Herunterrollen des Stack (t wird urspr. x).

Diese Methode rollt den Stack nach unten bzw. nach x, setzt aber den ursprünglichen x-Inhalt nach t.

Nach viermaliger Anwendung ist der Ausgangszustand wieder erreicht.

Specified by:
rollDown in interface RemoteCalcIntf

enter

public String enter()
Description copied from interface: RemoteCalcIntf
Push-Operation beziehungsweise Enter.

Diese Methode schiebt den Inhalt des Stacks um eins hoch. x wird nach y kopiert; der bisherige Inhalt von t geht verloren.

Im Fehlerzustand wird nur X und der Fehler gelöscht.

Specified by:
enter in interface RemoteCalcIntf

reset

public String reset()
Description copied from interface: RemoteCalcIntf
Rücksetzen in den Einschaltzustand.

Diese Methode löscht alle Stack-Register auf 0 und setzt den Modus auf Dezimal.

Rückgabewert ist die Versionsinformation (nicht die Dezimaldarstellung von 0).

Specified by:
reset in interface RemoteCalcIntf

clrX

public String clrX()
Description copied from interface: RemoteCalcIntf
Löschen des X-Registers.

Diese Methode löscht nur das X-Register.
Ein Fehlerzustand wird gelöscht.

Specified by:
clrX in interface RemoteCalcIntf

setX

public String setX(long x)
Description copied from interface: RemoteCalcIntf
Setzen des X-Registers auf einen Wert.

Diese Methode setzt nur das X-Register.
Ein Fehlerzustand wird gelöscht.

Specified by:
setX in interface RemoteCalcIntf

clrAll

public String clrAll()
Description copied from interface: RemoteCalcIntf
Löschen von allen Registern.

Diese Methode löscht alle vier Stackregister auf 0.

Specified by:
clrAll in interface RemoteCalcIntf