ฉันต้องบอกว่าฉันไม่เห็นด้วยอย่างยิ่งกับคำตอบของ Dan LaRocque
ลิฟท์ไม่ได้เป็นเสาหิน มันประกอบด้วยองค์ประกอบที่ไม่ต่อเนื่อง มันไม่ได้เพิกเฉยต่อองค์ประกอบ J / EE แต่ก็รองรับการกด JNDI, JTA, JPA และอื่น ๆ ความจริงที่ว่าคุณไม่ได้บังคับให้ใช้องค์ประกอบเหล่านี้ของ J / EE เป็นตัวบ่งชี้ที่แข็งแกร่งของการออกแบบโมดูลของลิฟต์
- ปรัชญาการมองของลิฟต์คือ "ให้นักพัฒนาตัดสินใจ" ลิฟท์เสนอกลไกการสร้างแม่แบบที่ไม่อนุญาตให้รหัสตรรกะใด ๆ ในมุมมองของกลไกมุมมองบนพื้นฐานของการดำเนินรหัส Scala และสกาล่าของตัวอักษร XML และกลไกมุมมองบนพื้นฐานของScalate หากคุณเลือกกลไกการสร้างเทมเพลต XML คุณจะต้องเลือกว่าจะมี mark-up เท่าใดในตรรกะทางธุรกิจของคุณ การแยกมุมมองของลิฟต์นั้นแข็งแกร่งกว่าสิ่งที่สปริงมีให้เพราะคุณไม่สามารถแสดงตรรกะทางธุรกิจใด ๆ ในแม่แบบ XML ของลิฟต์
- วัตถุประสงค์ของลิฟต์↔ปรัชญาการดำรงอยู่คือ "ให้ผู้พัฒนาตัดสินใจ" Lift มี Mapper ซึ่งเป็น Mapper เชิงสัมพันธ์เชิงวัตถุสไตล์ ActiveRecord มันทำให้งานสำเร็จสำหรับโครงการขนาดเล็ก ลิฟท์รองรับ JPA Lift มี abstraction บันทึกที่รองรับการเคลื่อนย้ายวัตถุเข้าและออกจากฐานข้อมูลเชิงสัมพันธ์เข้าและออกจากร้านค้า NoSQL (Lift รวมการสนับสนุนแบบดั้งเดิมสำหรับ CouchDB และ MongoDB แต่ชั้นอะแดปเตอร์เป็นโค้ดสองสามร้อยบรรทัดดังนั้นถ้าคุณต้องการ Cassandra หรือ อย่างอื่นมันไม่ใช่งานที่ต้องทำมากมาย) โดยพื้นฐานแล้วการยก Web Framework นั้นไม่ได้ขึ้นอยู่กับว่าวัตถุจะถูกทำให้เป็นรูปเป็นร่างได้อย่างไร นอกจากนี้เซสชั่นและรอบการร้องขอจะเปิดขึ้นเช่นการแทรก hooks การทำธุรกรรมลงในวงจรการร้องขอ / การตอบสนองเป็นเรื่องง่าย
- ปรัชญาของลิฟต์คือ "ทีมเซิร์ฟเวอร์จำเป็นต้องรู้ภาษาเดียวไม่ใช่หลายภาษา" ซึ่งหมายความว่าการกำหนดค่าจะทำผ่าน Scala ซึ่งหมายความว่าเราไม่ต้องใช้ 40% ของการสร้างภาษาของ Java ในไวยากรณ์ XML เพื่อสร้างตัวเลือกการกำหนดค่าที่ยืดหยุ่น หมายความว่าไวยากรณ์คอมไพเลอร์และตรวจสอบข้อมูลการกำหนดค่าเพื่อให้คุณไม่ได้รับการแยกวิเคราะห์ XML ที่แปลกประหลาดหรือข้อมูลที่ไม่ถูกต้องตอนรันไทม์ หมายความว่าคุณไม่จำเป็นต้องมี IDE ที่เข้าใจรายละเอียดของคำอธิบายประกอบที่คุณใช้โดยอ้างอิงจากไลบรารีที่คุณใช้งานอยู่
- ใช่แล้วเอกสารของลิฟต์ไม่ได้เป็นจุดแข็ง
จากที่กล่าวมาข้างต้นให้ฉันพูดเกี่ยวกับปรัชญาการออกแบบของลิฟต์
ฉันเขียนWeb Framework Manifestoก่อนที่จะเริ่มเขียน Lift ในระดับที่ดีและในระดับที่สูงกว่าความเป็นจริงสำหรับเว็บเฟรมเวิร์กอื่น ๆ ที่ฉันรู้จัก Lift จะบรรลุเป้าหมายเหล่านี้
ยกที่แกนของมันพยายามที่จะทำให้นามธรรมรอบคำขอ / การตอบสนองของ HTTP มากกว่าการวางวัตถุล้อมรอบคำขอ HTTP ในระดับการปฏิบัติซึ่งหมายความว่าการกระทำส่วนใหญ่ที่ผู้ใช้สามารถทำได้ (การส่งองค์ประกอบแบบฟอร์มการทำ Ajax และอื่น ๆ ) จะถูกแสดงด้วย GUID ในเบราว์เซอร์และฟังก์ชั่นบนเซิร์ฟเวอร์ เมื่อมีการนำเสนอ GUID เป็นส่วนหนึ่งของคำขอ HTTP ฟังก์ชันจะถูกนำไปใช้ (เรียกว่า) พร้อมกับพารามิเตอร์ที่ให้มา เนื่องจาก GUID นั้นยากต่อการคาดเดาและเฉพาะเซสชันการโจมตีซ้ำและการโจมตีที่มีพารามิเตอร์หลายตัวนั้นทำได้ยากกว่าการใช้ Lift มากกว่าเฟรมเวิร์กเว็บอื่น ๆ รวมถึง Spring นอกจากนี้ยังหมายความว่านักพัฒนาซอฟต์แวร์มีประสิทธิผลมากขึ้นเนื่องจากพวกเขามุ่งเน้นไปที่การกระทำของผู้ใช้และตรรกะทางธุรกิจที่เกี่ยวข้องกับการกระทำของผู้ใช้มากกว่าการวางระบบการบรรจุและการร้องขอ HTTP
ajaxButton("Accept", () => {request.accept.save;
SetHtml("acceptrejectspan", <span/>}) ++
ajaxButton("Reject", () => {request.reject.save;
SetHtml("acceptrejectspan", <span/>})
มันง่ายมาก เนื่องจาก friendRequest อยู่ในขอบเขตเมื่อมีการสร้างฟังก์ชันฟังก์ชันจึงปิดเหนือขอบเขต ... ไม่จำเป็นต้องเปิดเผยคีย์หลักของคำขอเป็นเพื่อนหรือทำสิ่งอื่น ... เพียงแค่กำหนดข้อความของปุ่ม (มัน สามารถแปลเป็ ลิฟท์ดูแลการกำหนด GUID ตั้งค่าการโทร Ajax (ผ่าน jQuery หรือ YUI และใช่คุณสามารถเพิ่มไลบรารี JavaScript ที่คุณชื่นชอบ) ทำการลองใหม่ด้วยการถอยกลับอัตโนมัติ
ดังนั้นความแตกต่างที่สำคัญอย่างหนึ่งระหว่างลิฟต์กับสปริงคือปรัชญาของ GUID ของลิฟต์ที่เกี่ยวข้องกับฟังก์ชั่นนั้นมีข้อดีสองประการคือการรักษาความปลอดภัยที่ดีขึ้นและผลผลิตของนักพัฒนาที่ดีขึ้นมาก GUID -> การเชื่อมโยงของฟังก์ชั่นได้รับการพิสูจน์แล้วว่ามีความทนทานมาก ... งานโครงสร้างเดียวกันสำหรับรูปแบบปกติอาแจ็กซ์ดาวหางพ่อมดหลายหน้าเป็นต้น
ชิ้นส่วนหลักของลิฟต์ถัดไปคือการเก็บภาพนามธรรมระดับสูงไว้ให้นานที่สุด ในด้านการสร้างหน้านั้นหมายถึงการสร้างหน้าเป็นองค์ประกอบ XHTML และทำให้หน้าเป็น XHTML จนกว่าจะได้รับการตอบกลับ ประโยชน์คือความต้านทานต่อข้อผิดพลาดการเขียนสคริปต์ข้ามไซต์ความสามารถในการย้ายแท็ก CSS ไปที่ส่วนหัวและสคริปต์ที่ด้านล่างของหน้าหลังจากสร้างหน้าเสร็จแล้วและความสามารถในการเขียนหน้าใหม่ตามเบราว์เซอร์เป้าหมาย ในด้านอินพุต URL สามารถเขียนใหม่เพื่อดึงพารามิเตอร์ (ทั้งพารามิเตอร์การสืบค้นและพารามิเตอร์พา ธ ) ในลักษณะที่ปลอดภัยระดับสูงข้อมูลการตรวจสอบความปลอดภัยพร้อมใช้งานสำหรับการประมวลผลเร็วมากในรอบคำขอ ตัวอย่างเช่นต่อไปนี้เป็นวิธีการกำหนดการให้บริการคำขอ REST:
serve {
case "api" :: "user" :: AsUser(user) :: _ XmlGet _ => <b>{user.name}</b>
case "api" :: "user" :: AsUser(user) :: _ JsonGet _ => JStr(user.name)
}
การใช้การจับคู่รูปแบบในตัวของ Scala เราจับคู่คำขอที่เข้ามาแยกส่วนที่สามของเส้นทางและรับผู้ใช้ที่สอดคล้องกับค่านั้นและใช้การตรวจสอบการควบคุมการเข้าถึง (เซสชันปัจจุบันหรือคำขอมีสิทธิ์ในการเข้าถึงที่กำหนดหรือไม่ บันทึกผู้ใช้งาน) ดังนั้นเมื่อเวลาที่อินสแตนซ์ผู้ใช้กระทบกับตรรกะของแอปพลิเคชัน
ด้วยชิ้นส่วนหลักสองชิ้นนี้ลิฟต์จึงมีข้อได้เปรียบอย่างมากในเรื่องความปลอดภัย เพื่อให้คุณทราบถึงความสำคัญของความปลอดภัยของลิฟต์ที่ไม่สามารถเข้าถึงฟีเจอร์ต่างๆได้Rasmus Lerdorgซึ่งทำหน้าที่รักษาความปลอดภัยให้กับ Yahoo! มีเรื่องนี้จะพูดเกี่ยวกับ FourSquare (หนึ่งในเว็บไซต์เด็กโปสเตอร์ยก):
สี่ดาวใน @foursquare - ไซต์ที่ 1 ในขณะที่ฉันดูดีว่าไม่มีปัญหาด้านความปลอดภัยเดียว (ที่ฉันสามารถหาได้) - http://twitter.com/rasmus/status/5929904263
ในขณะนั้น FourSquare มีวิศวกรคนหนึ่งทำงานเกี่ยวกับรหัส (ไม่ใช่ว่า @harryh ไม่ใช่คนฉลาดหลักแหลม) และเป้าหมายหลักของเขาคือการเขียนเวอร์ชัน PHP ของ FourSquare อีกครั้งในขณะที่ต้องรับมือกับปริมาณการใช้ข้อมูลที่เพิ่มขึ้นทุกสัปดาห์
ส่วนสุดท้ายของการรักษาความปลอดภัยของลิฟต์คือ SiteMap มันเป็นการควบคุมการเข้าถึงแบบครบวงจรการนำทางไซต์และระบบเมนู ผู้พัฒนากำหนดกฎการควบคุมการเข้าถึงสำหรับแต่ละหน้าโดยใช้รหัส Scala (เช่นIf(User.loggedIn _)
หรือIf(User.superUser _)
) และกฎการควบคุมการเข้าถึงเหล่านั้นจะถูกนำไปใช้ก่อนที่การแสดงผลหน้าเว็บใด ๆ จะเริ่มขึ้น นี่คล้ายกับ Spring Security ยกเว้นว่ามันถูกอบเข้ามาตั้งแต่เริ่มต้นของโครงการและกฎการควบคุมการเข้าถึงจะรวมเป็นหนึ่งเดียวกับส่วนที่เหลือของแอปพลิเคชันดังนั้นคุณไม่จำเป็นต้องมีกระบวนการในการปรับปรุงกฎความปลอดภัยใน XML เมื่อ URL เปลี่ยนแปลงหรือวิธีการที่คำนวณการเปลี่ยนแปลงการควบคุมการเข้าถึง
เพื่อสรุปจนถึงปัจจุบันปรัชญาการออกแบบของลิฟต์ช่วยให้คุณได้รับประโยชน์จากการอบการควบคุมการเข้าถึงการต่อต้านช่องโหว่ด้านความปลอดภัย OWASP 10 อันดับแรกการสนับสนุน Ajax ที่ดีขึ้นมากและผลผลิตของนักพัฒนาที่สูงกว่า Spring
แต่ลิฟท์ยังให้การสนับสนุน Comet ที่ดีที่สุดสำหรับกรอบงานเว็บใด ๆ นั่นเป็นเหตุผลที่ Novell เลือกใช้ Lift เพื่อเพิ่มพลังให้กับผลิตภัณฑ์ Pulseของพวกเขาและนี่คือสิ่งที่ Novell กล่าวถึงเกี่ยวกับ Lift:
Lift เป็นเว็บเฟรมเวิร์กที่ช่วยให้คุณในฐานะนักพัฒนาเพื่อมุ่งเน้นไปที่ภาพใหญ่ คุณสมบัติการพิมพ์ที่แข็งแกร่งแสดงออกอย่างชัดเจนและระดับสูงขึ้นเช่นการรองรับ Comet ในตัวช่วยให้คุณสามารถมุ่งเน้นไปที่การสร้างสรรค์แทนที่จะใช้ระบบประปา การสร้างเว็บแอปพลิเคชั่นที่สมบูรณ์แบบเรียลไทม์เช่น Novell Pulse ต้องการกรอบการทำงานที่มีประสิทธิภาพของ Lift ภายใต้หน้ากาก
ดังนั้นลิฟท์ไม่ได้เป็นเพียงกรอบ MVC ฉันเหมือนกัน มันเป็นเฟรมเวิร์กที่มีหลักการออกแบบหลักที่อยู่ด้านหลังซึ่งมีความสมบูรณ์มาก มันเป็นเฟรมเวิร์กที่ให้ข้อดีด้านความปลอดภัยและประสิทธิผลของนักพัฒนา Lift เป็นเฟรมเวิร์กที่สร้างขึ้นในเลเยอร์และให้ทางเลือกที่เหมาะสมกับนักพัฒนาตามความต้องการของพวกเขา ... ตัวเลือกสำหรับการสร้างมุมมองตัวเลือกสำหรับการคงอยู่เป็นต้น
Scala และ Lift ช่วยให้นักพัฒนาได้รับประสบการณ์ที่ดีกว่าการผสมผสานของ XML การเพิ่มความคิดเห็นและสำนวนอื่น ๆ ที่ประกอบกันเป็น Spring