Eine Stärke des Frameworks besteht darin, dass alle Anfragen
automatisch an eine programmierbare "`Action"' geleitet werden.
Dabei entspricht die URL /SecureOne/Login.wapp der
Action-Pfad /SecureOne/Login.
Die Datei map.xml bestimmt, welcher
Action-Controller für eine gegebene Action aufgerufen wird.
Bei Bedarf wird mit form noch ein Formular angeführt, über das
Eingaben vorgenommen werden können.
Die Default-Action muss deklariert sein, sie wird verwendet,
wenn keine bestimmte Aktion angegeben wurde. Im Beispiel wird
die Seite ausgegeben, die vom default.xsl-Dokument erzeugt
wurde.
<WebApp-Config>
<Action-Mapping>
<Action path="/Default"
type="Wapp/DisplayPageAction">
<Forward name="success" path="default"/>
</Action>
<Action path="/SecureOne/Login"
type="SecureOne/AuthenticateUserAction"
form="SecureOne/AuthenticationFormModel">
<Forward name="success" path="welcome"/>
<Forward name="failure" path="relogin"/>
</Action>
</Action-Mapping>
</WebApp-Config>
In dem mitgelieferten Facet-Beispiel enthält die Defaultseite ein
Formular für die Eingabe von Benutzername und Kennwort. Wird also
/SecureOne/ im Browser aufgerufen, sollte der Benutzer Name und
Kennwort eingeben. Nach Abschicken des Formulars sucht Facet die zur
Formular-Action gehörende Facet-Action heraus und führt die in
AuthenticationFormModel festgelegte Gültigkeitsprüfung aus.
class AuthenticationFormModel
# Zugriff auf Formularfelder
attr_accessor :userName, :password
def validate
return false if @userName.nil? ||
@userName.length < 6
return false if @password.nil? ||
@password.length < 6
return true
end
end
Ist diese erfolgreich, wird die
AuthenticateUserAction-Methode process
ausgeführt. Über das formObject hat die Methode Zugriff auf
die vom Formular mit GET oder POST übermittelten Daten.
def process(httpRequestResponse,formObject)
userName = formObject.userName
password = formObject.password
bo = UserAuthenticationBO.new
isValidUser = bo.validateUser(userName,password)
if isValidUser then
httpRequestResponse.forward = "success"
else
httpRequestResponse.forward = "failure"
end
end
Die eigentliche Arbeit wird von dem "`Business-Object"' bo
erledigt, das als Domänenobjekt von der Benutzeroberfläche vollkommen
abgekoppelt ist. Dieser mehrlagige Zugang hat den großen Vorteil,
dass die komplexe Domänenlogik nur einmal in einem allgemein
zugänglichen Backend implementiert werden muss, während sich das
Frontend allein um die Interaktion mit dem Benutzer kümmert.