Dan LaRocque'un cevabına kesinlikle katılmıyorum demeliyim.
Asansör yekpare değildir. Ayrık elemanlardan oluşur. J / EE elemanlarını görmezden gelmez, JNDI, JTA, JPA, vb. Gibi özellikleri destekler. J / EE'nin bu elemanlarını kullanmaya zorlanmamanız Lift'in modüler tasarımının güçlü bir göstergesidir.
- Lift'in görüş felsefesi "geliştirici karar versin" dir. Lift, görünümde herhangi bir mantık koduna izin vermeyen bir şablonlama mekanizması, Scala kodunu ve Scala'nın XML değişmezlerini yürütmeye dayalı bir görünüm mekanizması ve Scalate'e dayalı bir görünüm mekanizması sunar . XML şablonlama mekanizmasını seçerseniz, işaretlemenin iş mantığınıza ne kadar (varsa) ait olduğunu seçersiniz. Lift'in görünüm ayrımı, Spring'in sunduğu her şeyden daha güçlüdür çünkü Lift'in XML şablonlarında herhangi bir iş mantığını ifade edemezsiniz.
- Lift'in Nesnesi ↔ Kalıcılık felsefesi "geliştirici karar versin" dir. Lift, ActiveRecord tarzı nesne ilişkisel eşleyicisi olan Mapper'a sahiptir. Küçük projeler için işi yapar. JPA desteğini kaldırın. Lift, ilişkisel veritabanlarının içine ve dışına NoSQL depolarına girip çıkmayı destekleyen bir Kayıt soyutlamasına sahiptir (Lift, CouchDB ve MongoDB için yerel destek içerir, ancak adaptör katmanları birkaç yüz kod satırıdır; başka bir şey, bunu elde etmek için çok fazla iş değil.) Temel olarak, Lift Web Framework nesnelerin bir oturumda nasıl gerçekleştiğine bağlı değildir. Ayrıca, oturum ve istek döngüleri açıktır, öyle ki istek / yanıt döngüsüne işlem kancaları eklemek basittir.
- Lift'in felsefesi "sunucu ekibinin birden fazla dili değil, bir dili bilmesi gerekiyor." Bu, konfigürasyonun Scala üzerinden yapıldığı anlamına gelir. Bu, esnek yapılandırma seçenekleri oluşturmak için Java'nın dil yapılarının% 40'ını XML sözdiziminde uygulamak zorunda olmadığımız anlamına gelir. Bu, derleyici sözdiziminin ve türün yapılandırma verilerini kontrol ettiği, böylece çalışma zamanında garip XML ayrıştırma veya yanlış veri elde edemeyeceğiniz anlamına gelir. Başka bir deyişle, kullandığınız kitaplığa göre kullandığınız ek açıklamaların ayrıntılarını anlayan IDE'lere sahip olmanız gerekmez.
- Evet, Lift'in belgeleri güçlü noktası değil.
Yukarıdakilerin söylendiği gibi, Lift'in tasarım felsefesi hakkında konuşalım.
Lift yazmaya başlamadan önce Web Framework Manifestosu'nu yazdım . Büyük ölçüde ve bildiğim diğer tüm web çerçeveleri için geçerli olandan daha yüksek derecede, Lift bu hedeflere ulaşır.
Özünde asansör, nesne sarmalayıcılarını HTTP İsteği'nin etrafına yerleştirmek yerine HTTP istek / yanıt döngüsünü soyutlamaya çalışır. Pratik düzeyde, bu, kullanıcının yapabileceği her işlemin (form öğelerini gönderme, Ajax vb. Yapma) tarayıcıda bir GUID ve sunucudaki bir işlevle temsil edildiği anlamına gelir. GUID, bir HTTP isteğinin parçası olarak sunulduğunda, işlev sağlanan parametrelerle uygulanır (çağrılır). GUID'leri tahmin etmek zor ve oturuma özgü olduğu için, tekrar saldırıları ve birçok parametre müdahalesi saldırısı, Lift de dahil olmak üzere diğer web çerçevelerinin çoğundan çok daha zordur. Ayrıca, geliştiricilerin daha verimli oldukları anlamına gelir, çünkü bir HTTP isteğinin paketlenmesi ve paketinin açılması yerine kullanıcı eylemlerine ve kullanıcı eylemleriyle ilişkili iş mantığına odaklanırlar.
ajaxButton("Accept", () => {request.accept.save;
SetHtml("acceptrejectspan", <span/>}) ++
ajaxButton("Reject", () => {request.reject.save;
SetHtml("acceptrejectspan", <span/>})
Bu kadar basit. FriendRequest işlev oluşturulduğunda kapsamda olduğundan, işlev kapsam üzerinde kapanır ... arkadaşlık isteğinin birincil anahtarını açığa çıkarmaya veya başka bir şey yapmaya gerek yoktur ... sadece düğmenin metnini tanımlayın ( yerelleştirilebilir veya bir XHTML şablonundan çekilebilir veya yerelleştirilmiş bir şablondan çekilebilir) ve düğmeye basıldığında yürütülecek işlev. Lift, GUID'in atanmasına, Ajax çağrısının ayarlanmasına (jQuery veya YUI aracılığıyla ve evet, kendi favori JavaScript kitaplığınızı ekleyebilir), geri çekmelerle otomatik yeniden denemeler gerçekleştirmeye, Ajax isteklerini sıralayarak bağlantı açlığını önlemeye vb.
Bu nedenle, Lift ve Spring arasındaki büyük bir fark, Lift'in fonksiyonla ilişkili GUID felsefesinin çok daha iyi güvenlik ve daha iyi geliştirici üretkenliği gibi iki avantajı olmasıdır. GUID -> İşlev ilişkilendirmesinin çok dayanıklı olduğu kanıtlanmıştır ... aynı yapı normal formlar, ajax, kuyruklu yıldız, çok sayfalı sihirbazlar vb.
Bir sonraki ana Lift parçası, yüksek seviyeli soyutlamaları olabildiğince uzun süre tutuyor. Sayfa oluşturma tarafında, sayfanın XHTML öğeleri olarak oluşturulması ve sayfanın yanıt akışından hemen öncesine kadar XHTML olarak tutulması anlamına gelir. Avantajlar, siteler arası komut dosyası yazma hatalarına karşı direnç, CSS etiketlerini sayfa oluşturulduktan sonra sayfanın altına ve komut dosyalarını sayfanın altına taşıma ve hedef tarayıcıya göre sayfayı yeniden yazma yeteneğidir. Giriş tarafında, URL'ler, parametreleri (hem sorgu hem de yol parametreleri) tür güvenli bir şekilde ayıklamak için yeniden yazılabilir, yüksek düzeyde, güvenlikle kontrol edilen veriler, istek döngüsünün çok erken aşamalarında işlenebilir. Örneğin, bir REST isteğinin servisinin nasıl tanımlanacağı aşağıda açıklanmıştır:
serve {
case "api" :: "user" :: AsUser(user) :: _ XmlGet _ => <b>{user.name}</b>
case "api" :: "user" :: AsUser(user) :: _ JsonGet _ => JStr(user.name)
}
Scala'nın yerleşik kalıp eşleşmesini kullanarak, gelen bir isteği eşleştiriyoruz, yolun üçüncü bölümünü çıkartıyoruz ve bu değere karşılık gelen Kullanıcıyı alıyoruz ve hatta erişim kontrol kontrolleri uyguluyoruz (mevcut oturumun veya isteğin verilen erişim için izinleri var mı? Kullanıcı kaydı). Bu nedenle, User örneği uygulama mantığına çarptığında, denetlenir.
Bu iki temel parça ile Lift, güvenlik açısından muazzam bir avantaja sahiptir. Lift'in güvenliğinin özellikleri engellemeyen büyüklüğü hakkında fikir vermek için Yahoo! için güvenlik yapan Rasmus Lerdorg ! FourSquare (Lift poster-çocuk sitelerinden biri) hakkında şunları söylemişti:
Dört yıldız için @ dört yıldız - Bir süre içinde 1. site Tek bir güvenlik sorunu (bulabildiğim) yoktu iyi bir göz attım - http://twitter.com/rasmus/status/5929904263
O zaman, FourSquare'in kod üzerinde çalışan bir mühendisi vardı (@harryh bir süper dahi değil) ve ana odak noktası haftalık trafik ikilemi ile başa çıkarken FourSquare'in PHP sürümünü yeniden yazmaktı.
Lift'in güvenlik odağının son kısmı Site Haritası'dır. Birleşik bir erişim kontrolü, sitede gezinme ve menü sistemidir. Geliştirici, Scala kodu (örn. If(User.loggedIn _)
Veya If(User.superUser _)
) kullanarak her sayfa için erişim kontrol kurallarını tanımlar ve bu erişim kontrol kuralları herhangi bir sayfa oluşturma başlamadan önce uygulanır. Bu, Spring Security'ye çok benzer, ancak projenin başından itibaren pişirilir ve erişim kontrol kuralları uygulamanın geri kalanıyla birleştirilir, böylece URL'ler olduğunda XML'deki güvenlik kurallarını güncelleme işlemine sahip olmanız gerekmez değişikliği veya erişim denetimi değişikliğini hesaplayan yöntemler.
Özetlemek gerekirse, Lift'in tasarım felsefesi size erişim kontrolü, OWASP ilk 10 güvenlik açığına karşı direnç, Spring'den çok daha iyi Ajax desteği ve çok daha yüksek geliştirici üretkenliği gibi avantajlar sunar.
Ancak Lift, etrafınızdaki herhangi bir web çerçevesinin en iyi Comet desteğini de sağlar. Bu nedenle Novell, Pulse ürünlerine güç vermek için Lift'i seçti ve Novell'in Lift hakkında söyledikleri:
Lift, bir geliştirici olarak büyük resme odaklanmanızı sağlayan bir web çerçevesi türüdür. Yerleşik Kuyruklu yıldız desteği gibi güçlü, etkileyici yazım ve daha üst düzey özellikler, sıhhi tesisat yerine inovasyona odaklanmanızı sağlar. Novell Pulse gibi zengin, gerçek zamanlı bir web uygulaması oluşturmak, kapakların altında Lift'in gücüne sahip bir çerçeve gerektirir.
Yani, Lift sadece başka bir MVC çerçevesi değildir. Arkasında çok iyi olgunlaşan bazı temel tasarım ilkelerine sahip bir çerçeve. Güvenlik ve geliştirici verimliliğinin iki avantajını sunan bir çerçeve. Asansör, katmanlar halinde yerleşik bir çerçevedir ve geliştiriciye ihtiyaçlarına göre doğru seçenekler sunar ... görünüm oluşturma seçenekleri, kalıcılık seçenekleri vb.
Scala ve Lift, geliştiricilere, Spring'i oluşturan XML, ek açıklamalar ve diğer deyimlerden daha iyi bir deneyim sunar.