Devo dire che non sono assolutamente d'accordo con la risposta di Dan LaRocque.
L'ascensore non è monolitico. È composto da elementi discreti. Non ignora gli elementi J / EE, supporta elementi simili a JNDI, JTA, JPA, ecc. Il fatto che non sei obbligato a utilizzare questi elementi di J / EE è una forte indicazione del design modulare di Lift.
- La filosofia di Lift è "lascia decidere allo sviluppatore". Lift offre un meccanismo di template che non consente alcun codice logico nella vista, un meccanismo di visualizzazione basato sull'esecuzione del codice Scala e sui letterali XML di Scala e un meccanismo di visualizzazione basato su Scalate . Se scegli il meccanismo di template XML, allora scegli quanto mark-up appartiene alla tua logica aziendale. La separazione della vista di Lift è più forte di qualsiasi cosa Spring abbia da offrire perché non è possibile esprimere alcuna logica aziendale nei modelli XML di Lift.
- La filosofia di Lift ↔ Object Persistenza è "lascia decidere allo sviluppatore". Lift ha Mapper che è un mappatore relazionale di oggetti in stile ActiveRecord. Fa il lavoro per piccoli progetti. Sollevare il supporto JPA. Lift ha un'astrazione Record che supporta il trasferimento di oggetti dentro e fuori dai database relazionali, dentro e fuori dai negozi NoSQL (Lift include il supporto nativo per CouchDB e MongoDB, ma i livelli dell'adattatore sono poche centinaia di righe di codice, quindi se vuoi Cassandra o qualcos'altro, non c'è molto lavoro per ottenerlo.) Fondamentalmente, Lift the Web Framework non dipende da come gli oggetti si materializzano in una sessione. Inoltre, i cicli di sessione e richiesta sono aperti in modo tale che l'inserimento di hook di transazione nel ciclo richiesta / risposta sia semplice.
- La filosofia di Lift è "il team del server deve conoscere una lingua, non più lingue". Ciò significa che la configurazione viene eseguita tramite Scala. Ciò significa che non abbiamo dovuto implementare il 40% dei costrutti del linguaggio Java nella sintassi XML per creare opzioni di configurazione flessibili. Significa che la sintassi del compilatore e il tipo controllano i dati di configurazione in modo da non ottenere strani analisi XML o dati errati in fase di esecuzione. Significa che non devi avere IDE in grado di comprendere i dettagli delle annotazioni che stai utilizzando in base alla libreria che stai utilizzando.
- Sì, la documentazione di Lift non è il suo punto di forza.
Detto questo, lasciatemi parlare della filosofia di design di Lift.
Ho scritto Web Framework Manifesto prima di iniziare a scrivere Lift. In larga misura, e in misura maggiore di quanto sia vero per qualsiasi altro framework web di cui io sia a conoscenza, Lift raggiunge questi obiettivi.
Lift al suo interno cerca di sottrarre il ciclo di richiesta / risposta HTTP anziché posizionare involucri di oggetti attorno alla richiesta HTTP. A livello pratico, ciò significa che la maggior parte delle azioni che un utente può intraprendere (invio di elementi del modulo, esecuzione di Ajax, ecc.) È rappresentata da un GUID nel browser e da una funzione sul server. Quando il GUID viene presentato come parte di una richiesta HTTP, la funzione viene applicata (chiamata) con i parametri forniti. Poiché i GUID sono difficili da prevedere e specifici della sessione, gli attacchi di riproduzione e molti attacchi di manomissione dei parametri sono molto più difficili con Lift rispetto alla maggior parte degli altri framework Web, incluso Spring. Significa anche che gli sviluppatori sono più produttivi perché si stanno concentrando sulle azioni dell'utente e sulla logica aziendale associata alle azioni dell'utente piuttosto che sull'impianto idraulico di impacchettare e decomprimere una richiesta HTTP.
ajaxButton("Accept", () => {request.accept.save;
SetHtml("acceptrejectspan", <span/>}) ++
ajaxButton("Reject", () => {request.reject.save;
SetHtml("acceptrejectspan", <span/>})
È così semplice. Poiché friendRequest è nell'ambito quando viene creata la funzione, la funzione si chiude sull'ambito ... non è necessario esporre la chiave primaria della richiesta di amicizia o fare qualsiasi altra cosa ... basta definire il testo del pulsante (esso può essere localizzato o può essere estratto da un modello XHTML o può essere estratto da un modello localizzato) e la funzione da eseguire quando si preme il pulsante. Lift si occupa di assegnare il GUID, impostare la chiamata Ajax (tramite jQuery o YUI, e sì, puoi aggiungere la tua libreria JavaScript preferita), fare tentativi automatici con back-off, evitare la fame di connessione accodando le richieste Ajax, ecc.
Quindi, una grande differenza tra Lift e Spring è che la filosofia di Lift del GUID associata alla funzione ha il duplice vantaggio di una sicurezza molto migliore e una produttività degli sviluppatori molto migliore. Il GUID -> L'associazione delle funzioni si è dimostrato molto durevole ... lo stesso costrutto funziona per forme normali, ajax, comete, maghi multipagina, ecc.
Il prossimo pezzo centrale di Lift sta mantenendo le astrazioni di alto livello il più a lungo possibile. Sul lato della generazione della pagina, ciò significa costruire la pagina come elementi XHTML e mantenere la pagina come XHTML fino a poco prima dello streaming della risposta. I vantaggi sono la resistenza agli errori di cross-site scripting, la possibilità di spostare i tag CSS in testa e gli script in fondo alla pagina dopo che la pagina è stata composta e la possibilità di riscrivere la pagina in base al browser di destinazione. Dal lato dell'input, gli URL possono essere riscritti per estrarre i parametri (sia i parametri di query che quelli di percorso) in modo sicuro, ad alto livello, i dati di sicurezza controllati sono disponibili per l'elaborazione molto presto nel ciclo di richiesta. Ad esempio, ecco come definire la manutenzione di una richiesta REST:
serve {
case "api" :: "user" :: AsUser(user) :: _ XmlGet _ => <b>{user.name}</b>
case "api" :: "user" :: AsUser(user) :: _ JsonGet _ => JStr(user.name)
}
Usando il pattern matching integrato di Scala, abbiniamo una richiesta in arrivo, estraiamo la terza parte del percorso e otteniamo l'Utente che corrisponde a quel valore e persino applichiamo i controlli di controllo dell'accesso (la sessione o la richiesta corrente dispone delle autorizzazioni per accedere al dato Record dell'utente). Quindi, quando l'istanza utente raggiunge la logica dell'applicazione, viene verificata.
Con questi due pezzi fondamentali, Lift ha un enorme vantaggio in termini di sicurezza. Per darti un'idea della grandezza della sicurezza di Lift che non interferisce con le funzionalità, Rasmus Lerdorg che ha fatto sicurezza per Yahoo! ho detto questo su FourSquare (uno dei siti poster per bambini di Lift):
Quattro stelle su @foursquare - 1 ° sito da un po 'di tempo che ho visto bene che non aveva un singolo problema di sicurezza (che potevo trovare) - http://twitter.com/rasmus/status/5929904263
All'epoca, FourSquare aveva un ingegnere che lavorava sul codice (non che @harryh non fosse un super-genio) e il suo obiettivo principale era riscrivere la versione PHP di FourSquare mentre gestiva il raddoppio del traffico settimanale.
L'ultima parte del focus sulla sicurezza di Lift è SiteMap. È un controllo di accesso unificato, navigazione del sito e sistema di menu. Lo sviluppatore definisce le regole di controllo degli accessi per ogni pagina usando il codice Scala (es. If(User.loggedIn _)
O If(User.superUser _)
) e tali regole di controllo degli accessi vengono applicate prima che inizi il rendering della pagina. Questo è molto simile a Spring Security, tranne per il fatto che è inserito dall'inizio del progetto e che le regole di controllo dell'accesso sono unificate con il resto dell'applicazione, quindi non è necessario disporre di un processo per l'aggiornamento delle regole di sicurezza in XML quando gli URL modifica o i metodi che calcolano la modifica del controllo di accesso.
Riassumendo fino ad ora, la filosofia di progettazione di Lift offre i vantaggi offerti dal controllo degli accessi, dalla resistenza alle 10 principali vulnerabilità di sicurezza di OWASP, un supporto Ajax molto migliore e una produttività degli sviluppatori molto più elevata rispetto a Spring.
Ma Lift offre anche il miglior supporto Comet per qualsiasi framework web in circolazione. Ecco perché Novell ha scelto Lift per alimentare il suo prodotto Pulse ed ecco cosa ha da dire Novell su Lift:
Lift è il tipo di framework Web che ti consente come sviluppatore di concentrarti sul quadro generale. Digitazione forte ed espressiva e funzionalità di livello superiore come il supporto Comet integrato consentono di concentrarsi sull'innovazione anziché sull'impianto idraulico. La creazione di un'applicazione Web ricca e in tempo reale come Novell Pulse richiede un framework con la potenza di Lift sotto le coperte.
Quindi, Lift non è solo un altro framework MVC anch'io. È un framework che ha alcuni principi di progettazione fondamentali che sono maturati molto bene. È un framework che offre i doppi vantaggi di sicurezza e produttività degli sviluppatori. Lift è un framework costruito a strati e offre allo sviluppatore le giuste scelte in base alle sue esigenze ... scelte per la generazione di visualizzazioni, scelte per la persistenza, ecc
Scala e Lift offrono agli sviluppatori un'esperienza molto migliore rispetto al melange di XML, annotazioni e altri modi di dire che compongono Spring.