Tôi phải nói rằng tôi hoàn toàn không đồng ý với câu trả lời của Dan LaRocque.
Nâng không phải là nguyên khối. Nó được sáng tác trên các yếu tố rời rạc. Nó không bỏ qua các yếu tố J / EE, nó hỗ trợ các yếu tố như JNDI, JTA, JPA, v.v. Thực tế là bạn không bị buộc phải sử dụng các yếu tố này của J / EE là một dấu hiệu mạnh mẽ của thiết kế mô-đun của thang máy.
- Triết lý quan điểm của thang máy là "hãy để nhà phát triển quyết định." Thang máy cung cấp một cơ chế tạo khuôn mẫu không cho phép bất kỳ mã logic nào trong chế độ xem, cơ chế xem dựa trên việc thực thi mã Scala và các chữ XML của Scala và cơ chế xem dựa trên Tỷ lệ . Nếu bạn chọn cơ chế tạo khuôn mẫu XML, thì bạn chọn bao nhiêu, nếu có, đánh dấu thuộc về logic kinh doanh của bạn. Sự tách biệt chế độ xem của thang máy mạnh hơn bất cứ điều gì Spring cung cấp vì bạn không thể diễn đạt bất kỳ logic kinh doanh nào trong các mẫu XML của thang máy.
- Đối tượng của thang máy philosophy Triết lý bền bỉ là "hãy để nhà phát triển quyết định." Thang máy có Mapper là một trình ánh xạ quan hệ đối tượng kiểu ActiveRecord. Nó hoàn thành công việc cho các dự án nhỏ. Hỗ trợ thang máy JPA. Thang máy có bản tóm tắt Bản ghi hỗ trợ đưa các đối tượng vào và ra khỏi cơ sở dữ liệu quan hệ, vào và ra khỏi các cửa hàng NoQuery (Thang máy bao gồm hỗ trợ riêng cho CouchDB và MongoDB, nhưng các lớp bộ điều hợp là vài trăm dòng mã, vì vậy nếu bạn muốn Cassandra hoặc một cái gì đó khác, nó không phải là rất nhiều công việc để có được nó.) Về cơ bản, Nâng khung Web không phụ thuộc vào cách các đối tượng được cụ thể hóa thành một phiên. Hơn nữa, các chu kỳ phiên và yêu cầu được mở sao cho việc chèn các móc giao dịch vào chu kỳ yêu cầu / phản hồi là đơn giản.
- Triết lý của thang máy là "nhóm máy chủ cần biết một ngôn ngữ, không phải nhiều ngôn ngữ." Điều này có nghĩa là cấu hình được thực hiện thông qua Scala. Điều này có nghĩa là chúng tôi đã không phải triển khai 40% cấu trúc ngôn ngữ của Java theo cú pháp XML để tạo các tùy chọn cấu hình linh hoạt. Điều đó có nghĩa là cú pháp trình biên dịch và loại kiểm tra dữ liệu cấu hình để bạn không nhận được bất kỳ phân tích cú pháp XML lạ hoặc dữ liệu không chính xác nào trong thời gian chạy. Điều đó có nghĩa là bạn không cần phải có các IDE hiểu các chi tiết của các chú thích mà bạn đang sử dụng dựa trên thư viện mà bạn đang sử dụng.
- Đúng, tài liệu của thang máy không phải là điểm mạnh của nó.
Với những điều đã nói ở trên, hãy để tôi nói một chút về triết lý thiết kế của thang máy.
Tôi đã viết Tuyên ngôn khung web trước khi tôi bắt đầu viết thang máy. Ở một mức độ lớn, và ở một mức độ lớn hơn là đúng với bất kỳ khung web nào khác mà tôi biết, Lift đáp ứng các mục tiêu này.
Nâng ở lõi của nó tìm cách trừu tượng hóa chu trình yêu cầu / phản hồi HTTP thay vì đặt các trình bao bọc đối tượng xung quanh Yêu cầu HTTP. Ở cấp độ thực tế, điều này có nghĩa là hầu hết mọi hành động mà người dùng có thể thực hiện (gửi các phần tử biểu mẫu, thực hiện Ajax, v.v.) được thể hiện bằng GUID trong trình duyệt và chức năng trên máy chủ. Khi GUID được trình bày như một phần của yêu cầu HTTP, hàm được áp dụng (được gọi) với các tham số được cung cấp. Do GUID khó dự đoán và theo phiên cụ thể, nên các cuộc tấn công phát lại và nhiều cuộc tấn công giả mạo tham số khó khăn hơn nhiều với Lift so với hầu hết các khung web khác, bao gồm cả Spring. Điều đó cũng có nghĩa là các nhà phát triển có năng suất cao hơn vì họ đang tập trung vào hành động của người dùng và logic kinh doanh liên quan đến hành động của người dùng thay vì hệ thống đóng gói và giải nén yêu cầu HTTP.
ajaxButton("Accept", () => {request.accept.save;
SetHtml("acceptrejectspan", <span/>}) ++
ajaxButton("Reject", () => {request.reject.save;
SetHtml("acceptrejectspan", <span/>})
Nó đơn giản mà. Vì friendRequest nằm trong phạm vi khi hàm được tạo, nên hàm đóng trên phạm vi ... không cần phải lộ khóa chính của yêu cầu kết bạn hoặc làm bất cứ điều gì khác ... chỉ cần xác định văn bản của nút (nó có thể được bản địa hóa hoặc nó có thể được kéo từ một mẫu XHTML hoặc nó có thể được kéo từ một mẫu được bản địa hóa) và chức năng để thực thi khi nhấn nút. Lift đảm nhiệm việc gán GUID, thiết lập cuộc gọi Ajax (thông qua jQuery hoặc YUI và vâng, bạn có thể thêm thư viện JavaScript yêu thích của riêng mình), thực hiện thử lại tự động với các bản sao lưu, tránh bỏ đói kết nối bằng cách xếp hàng các yêu cầu Ajax, v.v.
Vì vậy, một điểm khác biệt lớn giữa Nâng và Mùa xuân là triết lý GUID của thang máy liên quan đến chức năng có lợi ích kép là bảo mật tốt hơn nhiều và năng suất của nhà phát triển tốt hơn nhiều. GUID -> Hiệp hội chức năng đã chứng minh rất bền ... cấu trúc tương tự hoạt động cho các dạng thông thường, ajax, sao chổi, trình hướng dẫn nhiều trang, v.v.
Phần cốt lõi tiếp theo của thang máy là giữ cho mức độ trừu tượng cao xung quanh càng lâu càng tốt. Về phía tạo trang, điều đó có nghĩa là xây dựng trang dưới dạng các phần tử XHTML và giữ trang dưới dạng XHTML cho đến trước khi truyền phát phản hồi. Các lợi ích là khả năng chống lại các lỗi kịch bản trang web chéo, khả năng di chuyển các thẻ CSS đến phần đầu và các tập lệnh xuống cuối trang sau khi trang được tạo và khả năng viết lại trang dựa trên trình duyệt đích. Về phía đầu vào, URL có thể được viết lại để trích xuất các tham số (cả tham số truy vấn và đường dẫn) theo cách an toàn loại, mức độ cao, dữ liệu được kiểm tra bảo mật có sẵn để xử lý rất sớm trong chu kỳ yêu cầu. Ví dụ: đây là cách xác định phục vụ yêu cầu REST:
serve {
case "api" :: "user" :: AsUser(user) :: _ XmlGet _ => <b>{user.name}</b>
case "api" :: "user" :: AsUser(user) :: _ JsonGet _ => JStr(user.name)
}
Sử dụng khớp mẫu có sẵn của Scala, chúng tôi khớp với yêu cầu đến, trích xuất phần thứ ba của đường dẫn và nhận Người dùng tương ứng với giá trị đó và thậm chí áp dụng kiểm tra kiểm soát truy cập (phiên hiện tại hoặc yêu cầu có quyền truy cập vào đã cho Hồ sơ người dùng). Vì vậy, vào thời điểm đối tượng Người dùng chạm vào logic ứng dụng, nó đã được hiệu chỉnh.
Với hai phần cốt lõi này, Lift có một lợi thế to lớn về mặt bảo mật. Để cho bạn biết về mức độ bảo mật của thang máy không ảnh hưởng đến các tính năng, Rasmus Lerdorg , người đã bảo mật cho Yahoo! có điều này để nói về FourSapes (một trong những trang web dành cho trẻ em poster):
Bốn sao đến @fiến - Trang web đầu tiên trong một thời gian tôi đã có một cái nhìn tốt về việc không có vấn đề bảo mật nào (mà tôi có thể tìm thấy) - http://twitter.com/rasmus/status/5929904263
Vào thời điểm đó, FourSapes có một kỹ sư làm việc về mã (không phải @harryh không phải là siêu thiên tài) và trọng tâm chính của anh là viết lại phiên bản FourSapes của PHP trong khi đối phó với lưu lượng truy cập tăng gấp đôi.
Phần cuối cùng của trọng tâm bảo mật của thang máy là SiteMap. Đó là một điều khiển truy cập thống nhất, điều hướng trang web và hệ thống menu. Nhà phát triển xác định các quy tắc kiểm soát truy cập cho từng trang bằng mã Scala (ví dụ If(User.loggedIn _)
hoặc If(User.superUser _)
) và các quy tắc kiểm soát truy cập đó được áp dụng trước khi bất kỳ kết xuất trang nào bắt đầu. Điều này rất giống với Spring Security, ngoại trừ việc nó được triển khai từ đầu dự án và các quy tắc kiểm soát truy cập được thống nhất với phần còn lại của ứng dụng, do đó bạn không cần phải có quy trình cập nhật các quy tắc bảo mật trong XML khi các URL thay đổi hoặc các phương pháp tính toán thay đổi kiểm soát truy cập.
Tóm lại, triết lý thiết kế của Lift mang đến cho bạn những lợi ích của việc kiểm soát truy cập, chống lại các lỗ hổng bảo mật hàng đầu của OWASP, hỗ trợ Ajax tốt hơn nhiều và năng suất của nhà phát triển cao hơn nhiều so với Spring.
Nhưng Nâng cũng cung cấp cho bạn sự hỗ trợ Comet tốt nhất của bất kỳ khung web nào xung quanh. Đó là lý do Novell chọn thang máy để cung cấp năng lượng cho sản phẩm Pulse của họ và đây là những gì Novell nói về thang máy:
Nâng là loại khung web cho phép bạn là nhà phát triển tập trung vào bức tranh lớn. Kiểu gõ mạnh mẽ, biểu cảm và các tính năng cấp cao hơn như hỗ trợ Comet tích hợp cho phép bạn tập trung vào đổi mới thay vì hệ thống ống nước. Xây dựng một ứng dụng web phong phú, thời gian thực như Novell Pulse đòi hỏi một khuôn khổ với sức mạnh của Nâng dưới vỏ bọc.
Vì vậy, Lift không chỉ là một khung MVC khác. Đó là một khuôn khổ có một số nguyên tắc thiết kế cốt lõi đằng sau nó đã trưởng thành rất tốt. Đó là một khung cung cấp các lợi thế kép về bảo mật và năng suất của nhà phát triển. Thang máy là một khung được xây dựng theo lớp và cung cấp cho nhà phát triển các lựa chọn phù hợp dựa trên nhu cầu của họ ... các lựa chọn để tạo chế độ xem, các lựa chọn cho sự kiên trì, v.v.
Scala và Lift cung cấp cho các nhà phát triển trải nghiệm tốt hơn nhiều so với sự kết hợp của XML, các chú thích và các thành ngữ khác tạo nên Spring.