Schick...
Spiffy ist ein Web-Framework, das Scala, Akka (eine Scala-Aktor-Implementierung) und die Java Servelet 3.0 API verwendet. Es nutzt die asynchrone Schnittstelle und zielt darauf ab, eine massiv parallele und skalierbare Umgebung für Webanwendungen bereitzustellen. Die verschiedenen Komponenten von Spiffy basieren alle auf der Idee, dass es sich um unabhängige, minimalistische Module handeln muss, die kleine Arbeitsmengen sehr schnell erledigen und die Anforderung an die nächste Komponente in der Pipeline weiterleiten. Nachdem die letzte Komponente die Anforderung verarbeitet hat, signalisiert sie dem Servlet-Container, dass sie die Anforderung „abschließt“ und an den Client zurücksendet.
Fügen Sie einige Routen hinzu:
// index page, no code, just text
"""^/$""".r -> "Welcome to Spiffy!",
// main news page
new Regex("""^/(news)/$""") -> NewsController(),
// view some news by id
new Regex("""^/(news)/(view)/(d+)/$""") -> NewsController()
Schreiben Sie den Controller:
def receive = {
// handles "news/add/"
case ControllerMsg(List("news", "save"), req, res, ctx) => {
// run validation on the request using Spiffy's validation DSL
var errors:Map[String, Set[String]] = validate (req) (
"email" as email confirmedBy "email_confirm",
"email_confirm" as email,
"title" as (string, 32),
"body" as string,
"tag" as string optional
) match {
case Some(List(errs,warns)) => { // Problem validating
errs
}
case None => None.toMap // passed validation
}
}
// handles "/news/"
case ControllerMsg(List("news"), req, res, ctx) => {
// load up news and stuff in map then render
val params = loadNews
view() ! ViewMsg("news", params, req, res, ctx)
}
// handles "/news/view/$newsId/"
case ControllerMsg(List("news", "view", newsId), req, res, ctx) => {
// usually you want to load the item, in this example we dont
// load item and set the params that the view will render
val news = loadNewsItem(newsId)
val params:Map[Any,Any] = Map("news" -> news)
// ask the view to render
view() ! ViewMsg("newsView", params, req, res, ctx)
}
}
Dann erstellen Sie einige Vorlagen. Weitere Informationen zu diesem Beispiel finden Sie unter NewsController und SpiffyConfig
Um Spiffy nutzen zu können, müssen Sie derzeit das JAR erstellen (mvn jar:jar) und es zum Klassenpfad Ihrer Anwendung hinzufügen. Sie müssen außerdem die folgende Umgebungsvariable definieren (context.xml reicht aus):
<Environment name="SpiffyConfigObject" value="org.spiffy.config.SpiffyBuiltinConfig" type="java.lang.String"/>
Sie müssen org.spiffy.config.SpiffyBuiltinConfig
durch ein Objekt ersetzen, das org.spiffy.config.SpiffyConfig
erweitert und alle erforderlichen Werte bereitstellt. Schauen Sie sich SpiffyConfig als Beispiel an.
Spiffy verlässt sich auf Akka-Akteure, um alle seine verschiedenen Komponenten zu unterteilen und zu isolieren. Jede Komponente in der Spiffy-Pipeline (mit Ausnahme des anfänglichen Filters) besteht aus einem Pool von Akka-Akteuren. Spiffy-Akteure werden durch Lastausgleichspools verschiedener Dispatchertypen unterstützt.
Spiffy ist als Filter implementiert. Nachdem der Filter die Anfrage erhalten hat, versetzt er sie in den asynchronen Modus und sendet sie an den Router. Der Router entscheidet dann, was mit der Anfrage geschehen soll, indem er die Anfrage-URL überprüft und sie anhand seiner Liste bekannter Controller-Zuordnungen vergleicht. Eine Zuordnung ist ein regulärer Ausdruck, der mit der angeforderten URL übereinstimmt und diese dem entsprechenden Controller zuweist. Wenn eine erfolgreiche Übereinstimmung gefunden wird, sendet der Router dem Controller eine Nachricht mit der Anfrage (und allen benötigten Objekten, die zusammen mitgesendet werden müssen). An diesem Punkt ist die Arbeit des Routers erledigt und er kann neue eingehende Anfragen verarbeiten. Nachdem der Controller die Anfrage erhalten hat, führt er die erforderliche Logik für die Anfrage aus und kann entscheiden, die Anfrage zu beenden oder an eine andere Komponente von Spiffy (normalerweise einen View-Handler) weiterzuleiten.
Spiffy nutzt das Konzept von Hooks, um Logik auszuführen, die gekapselt und vor und nach bestimmten Komponenten der Pipeline des Frameworks ausgeführt werden kann. Hooks können vor und nach Controllern und Ansichten ausgeführt werden. Ein Hook, der vor einem Controller ausgeführt wird, kann entscheiden, den Controller vollständig zu umgehen, oder einfach eine Logik wie Authentifizierung oder Änderung der Anfrage selbst ausführen, bevor der Controller die Möglichkeit hat, damit zu arbeiten. Ein Hook, der nach einem Controller ausgeführt wird, kann die Anfrage auch an einen anderen Controller umleiten, ändern oder dort beenden und sie dann an den Client zurücksenden. Die gleiche Logik wird in Front- und After-Ansichten verwendet, bei denen der Hook das Rendern der Ansicht insgesamt stoppen oder die gerenderte Ausgabe an einen anderen Teil des Frameworks übergeben kann, der zusätzliche Arbeit an der gerenderten Ausgabe leisten kann.