Ich muss sagen, dass ich der Antwort von Dan LaRocque überhaupt nicht zustimme.
Der Aufzug ist nicht monolithisch. Es besteht aus diskreten Elementen. J / EE-Elemente werden nicht ignoriert, es werden beispielsweise JNDI, JTA, JPA usw. unterstützt. Die Tatsache, dass Sie nicht gezwungen sind, diese Elemente von J / EE zu verwenden, ist ein starkes Indiz für den modularen Aufbau von Lift.
- Die Ansichtsphilosophie von Lift lautet: "Lassen Sie den Entwickler entscheiden." Lift bietet einen Vorlagenmechanismus, der keinen Logikcode in der Ansicht zulässt, einen Ansichtsmechanismus, der auf der Ausführung von Scala-Code und den XML-Literalen von Scala basiert, und einen Ansichtsmechanismus, der auf Scalate basiert . Wenn Sie den XML-Vorlagenmechanismus auswählen, legen Sie fest, wie viel Markup gegebenenfalls in Ihre Geschäftslogik gehört. Die Ansichtstrennung von Lift ist stärker als alles, was Spring zu bieten hat, da Sie in den XML-Vorlagen von Lift keine Geschäftslogik ausdrücken können.
- Lifts Ziel ↔ Die Persistenzphilosophie lautet "Lassen Sie den Entwickler entscheiden". Lift verfügt über Mapper, einen relationalen Objekt-Mapper im ActiveRecord-Stil. Es erledigt die Arbeit für kleine Projekte. Heben Sie die Unterstützung JPA an. Lift verfügt über eine Datensatzabstraktion, die das Shutteln von Objekten in und aus relationalen Datenbanken in und aus NoSQL-Speichern unterstützt (Lift bietet native Unterstützung für CouchDB und MongoDB, die Adapterebenen bestehen jedoch aus einigen hundert Codezeilen, wenn Sie also Cassandra oder möchten etwas anderes, es ist nicht viel Arbeit, es zu bekommen.) Grundsätzlich hat Lift the Web Framework keine Abhängigkeit davon, wie Objekte in einer Sitzung materialisiert werden. Ferner sind die Sitzungs- und Anforderungszyklen offen, so dass das Einfügen von Transaktions-Hooks in den Anforderungs- / Antwortzyklus einfach ist.
- Die Philosophie von Lift lautet: "Das Serverteam muss eine Sprache kennen, nicht mehrere Sprachen." Dies bedeutet, dass die Konfiguration über Scala erfolgt. Dies bedeutet, dass wir nicht 40% der Java-Sprachkonstrukte in XML-Syntax implementieren mussten, um flexible Konfigurationsoptionen zu erstellen. Dies bedeutet, dass die Compilersyntax und der Typ die Konfigurationsdaten typüberprüft, damit Sie zur Laufzeit keine seltsamen XML-Analysen oder falsche Daten erhalten. Dies bedeutet, dass Sie keine IDEs benötigen, die die Details der von Ihnen verwendeten Anmerkungen basierend auf der von Ihnen verwendeten Bibliothek verstehen.
- Ja, die Dokumentation von Lift ist nicht seine Stärke.
Lassen Sie mich vor diesem Hintergrund etwas über die Designphilosophie von Lift sprechen.
Ich habe Web Framework Manifesto geschrieben, bevor ich anfing, Lift zu schreiben. Lift erfüllt diese Ziele in hohem Maße und in größerem Maße als bei jedem anderen mir bekannten Webframework.
Im Kern versucht Lift, den HTTP-Anforderungs- / Antwortzyklus zu abstrahieren, anstatt Objekt-Wrapper um die HTTP-Anforderung zu platzieren. Auf praktischer Ebene bedeutet dies, dass die meisten Aktionen, die ein Benutzer ausführen kann (Senden von Formularelementen, Ausführen von Ajax usw.), durch eine GUID im Browser und eine Funktion auf dem Server dargestellt werden. Wenn die GUID als Teil einer HTTP-Anforderung angezeigt wird, wird die Funktion mit den angegebenen Parametern angewendet (aufgerufen). Da die GUIDs schwer vorherzusagen und sitzungsspezifisch sind, sind Wiederholungsangriffe und viele Parametermanipulationsangriffe mit Lift weitaus schwieriger als die meisten anderen Webframeworks, einschließlich Spring. Dies bedeutet auch, dass Entwickler produktiver sind, da sie sich auf Benutzeraktionen und die mit Benutzeraktionen verbundene Geschäftslogik konzentrieren und nicht auf das Installieren und Entpacken einer HTTP-Anforderung.
ajaxButton("Accept", () => {request.accept.save;
SetHtml("acceptrejectspan", <span/>}) ++
ajaxButton("Reject", () => {request.reject.save;
SetHtml("acceptrejectspan", <span/>})
So einfach ist das. Da sich die friendRequest beim Erstellen der Funktion im Bereich befindet, wird die Funktion über dem Bereich geschlossen. Es ist nicht erforderlich, den Primärschlüssel der Freundschaftsanforderung verfügbar zu machen oder etwas anderes zu tun. Definieren Sie einfach den Text der Schaltfläche (it kann lokalisiert werden oder es kann aus einer XHTML-Vorlage gezogen werden oder es kann aus einer lokalisierten Vorlage gezogen werden) und die Funktion, die ausgeführt werden soll, wenn die Taste gedrückt wird. Lift kümmert sich um das Zuweisen der GUID, das Einrichten des Ajax-Aufrufs (über jQuery oder YUI, und ja, Sie können Ihre eigene bevorzugte JavaScript-Bibliothek hinzufügen), das automatische Wiederholen mit Back-Offs, das Vermeiden von Verbindungsmangel durch das Einreihen von Ajax-Anforderungen usw.
Ein großer Unterschied zwischen Lift und Spring besteht darin, dass die mit der Funktion verbundene GUID-Philosophie von Lift den doppelten Vorteil einer viel besseren Sicherheit und einer viel besseren Entwicklerproduktivität bietet. Die GUID -> Funktionszuordnung hat sich als sehr dauerhaft erwiesen. Das gleiche Konstrukt funktioniert für normale Formen, Ajax, Kometen, mehrseitige Assistenten usw.
Das nächste Kernstück von Lift besteht darin, die Abstraktionen auf hoher Ebene so lange wie möglich beizubehalten. Auf der Seite der Seitengenerierung bedeutet dies, dass die Seite als XHTML-Elemente erstellt und bis kurz vor dem Streaming der Antwort als XHTML beibehalten wird. Die Vorteile sind die Beständigkeit gegen Cross-Site-Scripting-Fehler, die Möglichkeit, CSS-Tags in den Kopf und Skripte an den unteren Rand der Seite zu verschieben, nachdem die Seite erstellt wurde, und die Möglichkeit, die Seite basierend auf dem Zielbrowser neu zu schreiben. Auf der Eingabeseite können URLs neu geschrieben werden, um Parameter (sowohl Abfrage- als auch Pfadparameter) typsicher zu extrahieren. Hochwertige, sicherheitsgeprüfte Daten können sehr früh im Anforderungszyklus verarbeitet werden. So definieren Sie beispielsweise die Wartung einer REST-Anforderung:
serve {
case "api" :: "user" :: AsUser(user) :: _ XmlGet _ => <b>{user.name}</b>
case "api" :: "user" :: AsUser(user) :: _ JsonGet _ => JStr(user.name)
}
Mithilfe des in Scala integrierten Mustervergleichs stimmen wir eine eingehende Anforderung ab, extrahieren den dritten Teil des Pfads und ermitteln den Benutzer, der diesem Wert entspricht, und wenden sogar Zugriffssteuerungsprüfungen an (verfügt die aktuelle Sitzung oder Anforderung über Berechtigungen für den Zugriff auf die angegebene Anforderung? Benutzerdatensatz). Wenn die Benutzerinstanz die Anwendungslogik erreicht, wird sie überprüft.
Mit diesen beiden Kernstücken hat Lift einen enormen Sicherheitsvorteil. Um Ihnen eine Vorstellung von der Größe der Sicherheit von Lift zu geben, die den Funktionen nicht im Wege steht, hat Rasmus Lerdorg, der die Sicherheit für Yahoo! hatte folgendes über FourSquare (eine der Lift-Poster-Child-Sites) zu sagen:
Vier Sterne für @foursquare - 1. Site in einer Weile Ich habe mir genau angesehen, dass es kein einziges Sicherheitsproblem gab (das ich finden konnte) - http://twitter.com/rasmus/status/5929904263
Zu dieser Zeit hatte FourSquare einen Ingenieur, der an dem Code arbeitete (nicht, dass @harryh kein Supergenie ist), und sein Hauptaugenmerk lag darauf, die PHP-Version von FourSquare neu zu schreiben, während er mit der wöchentlichen Verdoppelung des Datenverkehrs fertig wurde.
Der letzte Teil des Sicherheitsfokus von Lift ist SiteMap. Es ist eine einheitliche Zugriffskontrolle, Site-Navigation und ein Menüsystem. Der Entwickler definiert die Zugriffssteuerungsregeln für jede Seite mithilfe von Scala-Code (z. B. If(User.loggedIn _)
oder If(User.superUser _)
). Diese Zugriffssteuerungsregeln werden angewendet, bevor mit dem Rendern einer Seite begonnen wird. Dies ähnelt Spring Security, mit der Ausnahme, dass es vom Beginn des Projekts an eingebunden ist und die Zugriffssteuerungsregeln mit dem Rest der Anwendung vereinheitlicht werden, sodass Sie keinen Prozess zum Aktualisieren der Sicherheitsregeln in XML benötigen, wenn die URLs verwendet werden Änderung oder die Methoden, die die Zugriffssteuerung berechnen, ändern sich.
Zusammenfassend lässt sich sagen, dass die Designphilosophie von Lift Ihnen die Vorteile einer integrierten Zugriffskontrolle, Widerstand gegen die Top-10-Sicherheitslücken von OWASP, eine viel bessere Ajax-Unterstützung und eine viel höhere Entwicklerproduktivität als Spring bietet.
Lift bietet Ihnen aber auch die beste Comet-Unterstützung für jedes Webframework. Aus diesem Grund hat sich Novell für Lift entschieden, um sein Pulse-Produkt mit Strom zu versorgen. Novell sagt Folgendes zu Lift:
Lift ist eine Art Web-Framework, mit dem Sie sich als Entwickler auf das Gesamtbild konzentrieren können. Starke, ausdrucksstarke Eingaben und übergeordnete Funktionen wie die integrierte Comet-Unterstützung ermöglichen es Ihnen, sich auf Innovationen anstatt auf die Installation zu konzentrieren. Das Erstellen einer umfangreichen Echtzeit-Webanwendung wie Novell Pulse erfordert ein Framework mit der Leistung von Lift unter der Decke.
Lift ist also nicht nur ein weiteres MVC-Framework für mich. Es ist ein Framework, das einige grundlegende Designprinzipien enthält, die sehr gut ausgereift sind. Es ist ein Framework, das die doppelten Vorteile von Sicherheit und Entwicklerproduktivität bietet. Lift ist ein Framework, das in Ebenen aufgebaut ist und dem Entwickler die richtigen Auswahlmöglichkeiten basierend auf seinen Anforderungen bietet ... Auswahlmöglichkeiten für die Ansichtsgenerierung, Auswahlmöglichkeiten für die Persistenz usw.
Scala und Lift bieten Entwicklern eine viel bessere Erfahrung als die Mischung aus XML, Anmerkungen und anderen Redewendungen, aus denen Spring besteht.