Muszę powiedzieć, że zdecydowanie nie zgadzam się z odpowiedzią Dana LaRocque.
Winda nie jest monolityczna. Składa się z dyskretnych elementów. Nie ignoruje elementów J / EE, obsługuje takie elementy jak JNDI, JTA, JPA itp. Fakt, że nie jesteś zmuszony do korzystania z tych elementów J / EE jest mocnym wskazaniem na modułową konstrukcję Lift.
- Filozofia Lift to „niech zdecyduje deweloper”. Lift oferuje mechanizm tworzenia szablonów, który nie dopuszcza żadnego kodu logicznego w widoku, mechanizm widoku oparty na wykonywaniu kodu Scala i literałów XML Scali oraz mechanizm widoku oparty na Scalate . Jeśli wybierzesz mechanizm tworzenia szablonów XML, wybierzesz, ile, jeśli w ogóle, narzut należy do logiki biznesowej. Separacja widoku Lift jest silniejsza niż cokolwiek, co ma do zaoferowania Spring, ponieważ nie można wyrazić żadnej logiki biznesowej w szablonach XML firmy Lift.
- Filozofia Lift's Object ↔ Trwałość to „niech zdecyduje deweloper”. Winda ma Mapper, który jest mapowaniem obiektów w stylu ActiveRecord. Wykonuje pracę w przypadku małych projektów. Podnieś wspornik JPA. Lift ma abstrakcję Record, która obsługuje przenoszenie obiektów do i z relacyjnych baz danych, do i z magazynów NoSQL (Lift obejmuje natywną obsługę CouchDB i MongoDB, ale warstwy adaptera to kilkaset linii kodu, więc jeśli chcesz, aby Cassandra lub coś innego, uzyskanie tego nie jest dużo pracy). Zasadniczo, Lift the Web Framework nie ma zależności od tego, jak obiekty są materializowane w sesji. Ponadto cykle sesji i żądań są otwarte tak, że wstawianie haków transakcji do cyklu żądanie / odpowiedź jest proste.
- Filozofia Lift to „zespół obsługujący serwer musi znać jeden język, a nie wiele języków”. Oznacza to, że konfiguracja odbywa się za pośrednictwem Scali. Oznacza to, że nie musieliśmy implementować 40% konstrukcji języka Java w składni XML, aby stworzyć elastyczne opcje konfiguracyjne. Oznacza to, że składnia kompilatora i typ sprawdzają dane konfiguracyjne, aby nie uzyskać żadnych dziwnych analiz XML lub nieprawidłowych danych w czasie wykonywania. Oznacza to, że nie musisz mieć środowisk IDE, które rozumieją szczegóły adnotacji, których używasz, na podstawie używanej biblioteki.
- Tak, dokumentacja Lift nie jest jego mocną stroną.
Mając powyższe na uwadze, pozwólcie, że opowiem o filozofii projektowania firmy Lift.
Napisałem Manifest Web Framework zanim zacząłem pisać Lift. W dużym stopniu i w większym stopniu niż w przypadku innych znanych mi platform internetowych, Lift spełnia te cele.
Lift w swoim rdzeniu stara się wyodrębnić cykl żądanie / odpowiedź HTTP, zamiast umieszczać opakowania obiektów wokół żądania HTTP. Na poziomie praktycznym oznacza to, że większość działań, które użytkownik może wykonać (przesyłanie elementów formularza, wykonywanie Ajax itp.) Jest reprezentowana przez identyfikator GUID w przeglądarce i funkcję na serwerze. Gdy identyfikator GUID jest prezentowany jako część żądania HTTP, funkcja jest stosowana (wywoływana) z podanymi parametrami. Ponieważ identyfikatory GUID są trudne do przewidzenia i zależne od sesji, ataki typu Replay i wiele ataków polegających na manipulowaniu parametrami są znacznie trudniejsze w przypadku Lift niż większość innych platform internetowych, w tym Spring. Oznacza to również, że programiści są bardziej produktywni, ponieważ koncentrują się na działaniach użytkownika i logice biznesowej związanej z działaniami użytkownika, a nie na pakowaniu i rozpakowywaniu żądania HTTP.
ajaxButton("Accept", () => {request.accept.save;
SetHtml("acceptrejectspan", <span/>}) ++
ajaxButton("Reject", () => {request.reject.save;
SetHtml("acceptrejectspan", <span/>})
To takie proste. Ponieważ friendRequest znajduje się w zakresie podczas tworzenia funkcji, funkcja zamyka się w zakresie ... nie ma potrzeby ujawniania klucza podstawowego żądania znajomego ani robić nic innego ... po prostu zdefiniuj tekst przycisku (to może być zlokalizowane lub może być wyciągnięte z szablonu XHTML lub może zostać pobrane ze zlokalizowanego szablonu) oraz funkcję do wykonania po naciśnięciu przycisku. Lift zajmuje się przypisywaniem identyfikatora GUID, konfigurowaniem wywołania Ajax (przez jQuery lub YUI, i tak, możesz dodać własną ulubioną bibliotekę JavaScript), wykonywaniem automatycznych ponownych prób z cofnięciami, unikaniem utraty połączenia przez kolejkowanie żądań Ajax itp.
Tak więc jedną dużą różnicą między Lift a Spring jest to, że filozofia Lift dotycząca GUID związana z funkcją ma podwójną korzyść: znacznie lepsze zabezpieczenia i znacznie lepszą produktywność programistów. Powiązanie GUID -> Function okazało się bardzo trwałe ... ta sama konstrukcja działa dla normalnych formularzy, Ajax, komety, wielostronicowych kreatorów itp.
Następnym głównym elementem Lift jest utrzymanie abstrakcji wysokiego poziomu tak długo, jak to możliwe. Po stronie generowania strony oznacza to budowanie strony jako elementów XHTML i utrzymywanie strony jako XHTML do momentu tuż przed przesłaniem odpowiedzi. Korzyści to odporność na błędy cross-site scripting, możliwość przenoszenia tagów CSS do nagłówka i skryptów na dół strony po skomponowaniu strony oraz możliwość przepisania strony w oparciu o docelową przeglądarkę. Po stronie wejściowej adresy URL można ponownie zapisać w celu wyodrębnienia parametrów (zarówno zapytań, jak i parametrów ścieżki) w sposób bezpieczny dla typu, dane sprawdzone pod kątem bezpieczeństwa na wysokim poziomie są dostępne do przetwarzania na bardzo wczesnym etapie cyklu żądania. Na przykład, oto jak zdefiniować obsługę żądania REST:
serve {
case "api" :: "user" :: AsUser(user) :: _ XmlGet _ => <b>{user.name}</b>
case "api" :: "user" :: AsUser(user) :: _ JsonGet _ => JStr(user.name)
}
Korzystając z wbudowanego dopasowania wzorców Scali, dopasowujemy przychodzące żądanie, wyodrębniamy trzecią część ścieżki i pobieramy użytkownika, który odpowiada tej wartości, a nawet stosujemy kontrole dostępu (czy bieżąca sesja lub żądanie ma uprawnienia dostępu do podanej Rekord użytkownika). Tak więc, zanim wystąpienie użytkownika trafi w logikę aplikacji, jest sprawdzane.
Dzięki tym dwóm podstawowym elementom Lift ma ogromną przewagę pod względem bezpieczeństwa. Aby dać ci wyobrażenie o wielkości zabezpieczeń Lift, które nie przeszkadzają funkcjom, Rasmus Lerdorg, który wykonał zabezpieczenia dla Yahoo! miał to do powiedzenia na temat FourSquare (jedna z witryn podrzędnych z plakatem Lift):
Cztery gwiazdki na @foursquare - Pierwsza strona od jakiegoś czasu dobrze się przyjrzałem, która nie miała ani jednego problemu z bezpieczeństwem (który mogłem znaleźć) - http://twitter.com/rasmus/status/5929904263
W tym czasie FourSquare miał jednego inżyniera pracującego nad kodem (nie żeby @harryh nie był super-geniuszem), a jego głównym celem było ponowne napisanie wersji FourSquare w PHP przy jednoczesnym podwojeniu ruchu w tygodniu.
Ostatnią częścią bezpieczeństwa Lift jest SiteMap. To ujednolicona kontrola dostępu, nawigacja po witrynie i system menu. Deweloper definiuje reguły kontroli dostępu dla każdej strony przy użyciu kodu Scala (np. If(User.loggedIn _)
Lub If(User.superUser _)
), a te reguły kontroli dostępu są stosowane przed rozpoczęciem renderowania strony. To jest bardzo podobne do Spring Security, z tym wyjątkiem, że jest zapieczętowane od początku projektu, a reguły kontroli dostępu są ujednolicone z resztą aplikacji, więc nie musisz mieć procesu aktualizacji reguł bezpieczeństwa w XML, gdy adresy URL zmiana lub metody obliczania zmiany kontroli dostępu.
Podsumowując do tej pory, filozofia projektowania Lift zapewnia korzyści wynikające z kontroli dostępu, odporności na 10 największych luk w zabezpieczeniach OWASP, znacznie lepszą obsługę Ajax i znacznie wyższą produktywność programistów niż Spring.
Ale Lift zapewnia również najlepszą obsługę Comet spośród wszystkich dostępnych frameworków internetowych. Właśnie dlatego Novell wybrał Lift do zasilania swojego produktu Pulse i oto, co Novell ma do powiedzenia na temat Lift:
Lift to rodzaj frameworka internetowego, który umożliwia programistom skoncentrowanie się na szerszej perspektywie. Silne, ekspresyjne pisanie i funkcje wyższego poziomu, takie jak wbudowana obsługa Comet, pozwalają skupić się na innowacjach zamiast na hydraulice. Tworzenie bogatej aplikacji internetowej działającej w czasie rzeczywistym, takiej jak Novell Pulse, wymaga struktury z mocą Lift pod osłonami.
Tak więc Lift to nie tylko kolejny framework MVC dla mnie. Jest to framework, który ma za sobą kilka podstawowych zasad projektowych, które bardzo dobrze dojrzały. Jest to struktura, która zapewnia podwójne korzyści w postaci bezpieczeństwa i produktywności programistów. Lift to framework, który jest zbudowany w warstwach i daje programiście właściwe wybory w oparciu o ich potrzeby ... wybory dotyczące generowania widoku, wybory dotyczące trwałości itp.
Scala i Lift zapewniają programistom znacznie lepsze wrażenia niż połączenie XML, adnotacji i innych idiomów tworzących Spring.