กลับไปหน้าบทความ

อ่าน 5 นาที

ไม่มีชื่อบทความ

Apache Tapestry เป็น เฟรมเวิร์กเว็บแอปพลิเคชัน Java แบบ โอเพนซอร์ส ที่เน้นส่วนประกอบ ซึ่งมี แนวคิดคล้ายกับ JavaServer Faces และ Apache Wicket [ 2 ] Tapestry ถูกสร้างขึ้นโดย Howard.

พรมทออะปาเช่

Apache Tapestryเป็นเฟรมเวิร์กเว็บแอปพลิเคชันJava แบบ โอเพนซอร์สที่เน้นส่วนประกอบ ซึ่งมี แนวคิดคล้ายกับJavaServer FacesและApache Wicket [ 2 ] Tapestryถูกสร้างขึ้นโดย Howard Lewis Ship และได้รับการยอมรับจากApache Software Foundationให้เป็นโครงการระดับสูงสุดในปี 2549 [ 3 ]

Tapestry เน้นความเรียบง่าย ใช้งานง่าย และเพิ่มประสิทธิภาพการทำงานของนักพัฒนา โดยยึด หลัก Convention over Configurationซึ่งช่วยลดการกำหนดค่าXML เกือบทั้งหมด [ 4 ] Tapestry ใช้แนวทางแบบโมดูลาร์ในการพัฒนาเว็บโดยการเชื่อมโยง อย่างแน่นหนา ระหว่าง ส่วนประกอบ อินเทอร์เฟซผู้ใช้ แต่ละส่วน (วัตถุ) บนหน้าเว็บกับ คลาส Java ที่เกี่ยวข้อง สถาปัตยกรรมแบบส่วนประกอบนี้ยืมแนวคิดหลายอย่างมาจากWebObjects [ 5 ]

คุณสมบัติเด่น

การบรรจุกระสุนในชั้นเรียนสด
Tapestry ตรวจสอบระบบไฟล์เพื่อหาการเปลี่ยนแปลงในคลาสหน้า Java คลาสคอมโพเนนต์ คลาสการใช้งานบริการ เทมเพลต HTML และไฟล์คุณสมบัติคอมโพเนนต์ และจะทำการ hot-swap การเปลี่ยนแปลงลงในแอปพลิเคชันที่กำลังทำงานอยู่โดยไม่ต้องรีสตาร์ท ซึ่งจะทำให้วงจรการบันทึกโค้ดและการดูผลตอบรับสั้นมาก ซึ่งอ้างว่าช่วยเพิ่มประสิทธิภาพการทำงานของนักพัฒนาได้อย่างมาก[ 6 ]
อิงตามส่วนประกอบ
สามารถสร้างหน้าเว็บโดยใช้ส่วนประกอบย่อยที่ซ้อนกันได้ โดยแต่ละส่วนประกอบจะมีเทมเพลตและคลาสส่วนประกอบ ส่วนประกอบแบบกำหนดเองนั้นสร้างได้ง่ายมาก[ 7 ]
ข้อตกลงสำคัญกว่าการกำหนดค่า
Tapestry ใช้รูปแบบการตั้งชื่อและคำอธิบายประกอบ แทนที่จะใช้ XML ในการกำหนดค่าแอปพลิเคชัน[ 8 ]
การใช้งาน HTTPSession อย่างประหยัด
ด้วยการใช้ HTTPSession น้อยที่สุด Tapestry จึงได้รับการออกแบบให้มีประสิทธิภาพสูงในสภาพแวดล้อมคลัสเตอร์ที่มีการจำลองเซสชัน[ 9 ]
โพสต์/เปลี่ยนเส้นทาง/รับข้อมูล
การส่งแบบฟอร์มส่วนใหญ่เป็นไปตาม รูปแบบ Post/Redirect/Get (PRG) ซึ่งช่วยลดอุบัติเหตุจากการส่งแบบฟอร์มหลายครั้งและทำให้ URL เป็นมิตรและน่าจดจำมากขึ้น รวมถึงทำให้ปุ่มย้อนกลับและรีเฟรชของเบราว์เซอร์ทำงานได้ตามปกติ[ 10 ]
การกลับด้านการควบคุม (Inversion of Control หรือ IoC)
Tapestry สร้างขึ้นบน เลเยอร์ Inversion of Control ที่มีน้ำหนักเบา และมีความคล้ายคลึงกับGoogle Guiceแต่ได้รับการออกแบบมาเพื่อให้พฤติกรรมเกือบทุกด้านของ Tapestry สามารถกำหนดค่าและเปลี่ยนทดแทนได้[ 8 ]

ตัวอย่าง "สวัสดีโลก"

แอปพลิเคชัน Tapestry ที่มีรูปแบบเรียบง่ายนั้นต้องการเพียงสามไฟล์เท่านั้น:

HelloWorld.tml
เทมเพลต (X)HTML สำหรับหน้า /helloworld เทมเพลตของ Tapestry สามารถบรรจุโค้ด (X)HTML ที่ถูกต้องได้ทุกรูปแบบ
<!DOCTYPE html> <html xmlns= "http://www.w3.org/1999/xhtml" xmlns:t= "http://tapestry.apache.org/schema/tapestry_5_3.xsd" > <body> <p>สวัสดี${username} </p> </body> </html>
HelloWorld.java
คลาสของหน้าเว็บที่เชื่อมโยงกับเทมเพลต ในที่นี้ มันเพียงแค่ให้คุณสมบัติ *ชื่อผู้ใช้* ที่เทมเพลตสามารถเข้าถึงได้
แพ็คเกจorg.example.demo.pages ;/** คลาสของหน้าเว็บ (เชื่อมโยงกับไฟล์เทมเพลตที่มีชื่อเดียวกันโดยอัตโนมัติ) */ public class HelloWorld {/** เมธอด getter ทั่วไป */ public String getUsername () { return "World" ; } }
เว็บ.xml
ไฟล์ Deployment Descriptorของแอปพลิเคชันเซิร์ฟเล็ตซึ่งติดตั้ง Tapestry เป็นตัวกรองเซิร์ฟเล็ต
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app  PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"  "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <display-name>ตัวอย่างTapestry </display-name> <context-param> <!-- บอก Tapestry 5 ว่าจะค้นหาเพจ คอมโพเนนต์ และมิกซ์อินได้ที่ไหน --> <param-name> tapestry.app-package </param-name> <param-value> org.example.demo </param-value> </context-param> <filter> <!-- กำหนดตัวกรองเซิร์ฟเล็ต Tapestry --> <filter-name> app </filter-name> <filter-class> org.apache.tapestry5.TapestryFilter </filter-class> </filter> <filter-mapping> <!-- บอกคอนเทนเนอร์เซิร์ฟเล็ตว่าควรส่งคำขอใดไปยังตัวกรองเซิร์ฟเล็ต Tapestry --> <filter-name> app </filter-name> <url-pattern> /* </url-pattern> </filter-mapping> </web-app>

การแปลงคลาส

Tapestry ใช้การจัดการไบต์โค้ดเพื่อแปลงคลาสเพจและคอมโพเนนต์ในขณะรันไทม์ วิธีนี้ช่วยให้สามารถเขียนคลาสเพจและคอมโพเนนต์เป็นPOJO ง่ายๆ ได้ โดยใช้ข้อกำหนดการตั้งชื่อและคำอธิบายประกอบเพียงเล็กน้อย ซึ่งอาจกระตุ้นพฤติกรรมเพิ่มเติมที่สำคัญในขณะโหลดคลาส Tapestry เวอร์ชัน 5.0, 5.1 และ 5.2 ใช้ไลบรารีการจัดการไบต์โค้ด Javassist เวอร์ชันต่อมาได้แทนที่ Javassist ด้วยเลเยอร์การจัดการไบต์โค้ดใหม่ที่เรียกว่าPlasticซึ่งใช้ObjectWeb ASMเป็น พื้นฐาน [ 11 ] [ 12 ]

การสนับสนุนฝั่งลูกค้า

Tapestry เวอร์ชัน 5 ถึง 5.3 ได้รวม เฟรมเวิร์ก JavaScript Prototypeและscript.aculo.us ไว้ ด้วย พร้อมด้วยไลบรารีเฉพาะของ Tapestry เพื่อรองรับการทำงานของ Ajax อย่างเต็มรูปแบบ นอกจากนี้ยังมีโมดูลจากผู้พัฒนาภายนอกให้เลือกใช้เพื่อผสานรวม jQuery แทนหรือเพิ่มเติมจาก Prototype/Scriptaculous ได้อีกด้วย

ตั้งแต่เวอร์ชัน 5.4 เป็นต้นไป Tapestry มีเลเยอร์ JavaScript ใหม่ที่ลบการพึ่งพา Prototype ของส่วนประกอบในตัว ทำให้สามารถเสียบ jQuery หรือเฟรมเวิร์ก JavaScript อื่นๆ เข้าไปได้[ 13 ]

เวอร์ชัน 5.4 ยังเพิ่มการรองรับโมดูล JavaScript โดยใช้ระบบการโหลดโมดูล RequireJS อีกด้วย

หลักการพื้นฐาน

เอกสารโครงการ Tapestry อ้างถึง "หลักการ" สี่ประการที่ควบคุมการตัดสินใจในการพัฒนา Tapestry ทั้งหมด โดยเริ่มตั้งแต่เวอร์ชัน 5 ในปี 2551: [ 14 ]

  • โครงสร้างคงที่ พฤติกรรมไดนามิก—โครงสร้างของหน้าเว็บและส่วนประกอบนั้นโดยพื้นฐานแล้วคงที่ ทำให้ไม่จำเป็นต้องสร้าง (และจัดเก็บในหน่วยความจำเซสชัน) โครงสร้างต้นไม้ขนาดใหญ่ของหน้าเว็บและส่วนประกอบ
  • API ที่ปรับเปลี่ยนได้—เฟรมเวิร์กนี้ได้รับการออกแบบให้ปรับตัวเข้ากับโค้ด แทนที่จะให้โค้ดปรับตัวเข้ากับเฟรมเวิร์ก
  • แยกแยะความแตกต่างระหว่าง API สาธารณะและ API ภายใน—โดยชัดแจ้งว่า API ทั้งหมดเป็น "ภายใน" (ส่วนตัว) ยกเว้น API ที่จำเป็นต้องเปิดเผยต่อสาธารณะ
  • รับประกันความเข้ากันได้กับเวอร์ชันก่อนหน้า—มีรายงานว่าผู้พัฒนา Tapestry มุ่งมั่นที่จะทำให้การอัปเกรดเป็น Tapestry เวอร์ชันล่าสุดเป็นเรื่องง่ายเสมอ

การวิจารณ์

Tapestry ถูกวิพากษ์วิจารณ์ว่าไม่สามารถใช้งานร่วมกับเวอร์ชันก่อนหน้าได้ โดยเฉพาะอย่างยิ่งในช่วงการเปลี่ยนจากเวอร์ชัน 4 ไปเป็นเวอร์ชัน 5 ซึ่งไม่มีเส้นทางการย้ายข้อมูลที่ชัดเจนสำหรับแอปพลิเคชันที่มีอยู่[ 15 ]สมาชิกทีมโครงการยอมรับว่านี่เป็นปัญหาสำคัญสำหรับผู้ใช้ Tapestry ในอดีต และความเข้ากันได้กับเวอร์ชันก่อนหน้าจึงกลายเป็นเป้าหมายหลักในการออกแบบ Tapestry ต่อไป ตั้งแต่ช่วงแรกของการพัฒนาเวอร์ชัน 5 ความเข้ากันได้กับเวอร์ชันก่อนหน้าถูกระบุว่าเป็นหนึ่งในสี่ "หลักการหลัก" ใหม่ของ Tapestry และอีกสองในสามหลักการที่เหลือมีจุดประสงค์เพื่อให้การพัฒนาเฟรมเวิร์กเป็นไปได้โดยไม่กระทบต่อความเข้ากันได้กับเวอร์ชันก่อนหน้า สมาชิกทีมโครงการอ้างว่า Tapestry ทุกเวอร์ชันตั้งแต่ 5.0 เป็นต้นมามีความเข้ากันได้กับเวอร์ชันก่อนหน้าสูง

ข้อวิจารณ์ในระยะแรกของ Tapestry 5 ยังกล่าวถึงข้อบกพร่องด้านเอกสารประกอบการใช้งานด้วย ปัจจุบัน สมาชิกโครงการอ้างว่าข้อบกพร่องนี้ได้รับการแก้ไขไปมากแล้ว ด้วยคู่มือผู้ใช้และเอกสารประกอบการใช้งานอื่นๆ ที่ได้รับการปรับปรุงและอัปเดตอย่างละเอียดถี่ถ้วน

ตั้งแต่เวอร์ชัน 5.0 เป็นต้นมา Tapestry ได้รวมไลบรารี JavaScript Prototype และ Scriptaculous ไว้ด้วย ตามที่ Howard Lewis Ship กล่าวไว้ ในช่วงปี 2008-2009 ไลบรารีเหล่านี้เป็นตัวเลือกที่เหมาะสม อย่างไรก็ตาม ตั้งแต่นั้นมา ความนิยมของ Prototype ก็ลดลง ในขณะที่ jQuery ได้รับความนิยมเพิ่มขึ้นอย่างมาก ด้วยเหตุนี้ ชุมชน Tapestry จึงได้พัฒนาโมดูลที่อนุญาตให้ใช้ jQuery ควบคู่ไปกับหรือแทนที่ Prototype ในขณะเดียวกัน Tapestry เวอร์ชันปัจจุบัน 5.4 ได้ลบการพึ่งพา Prototype ออกไปโดยสิ้นเชิง และแทนที่ด้วยเลเยอร์ความเข้ากันได้ ซึ่งสามารถเสียบ jQuery หรือ Prototype (หรือเฟรมเวิร์ก JavaScript อื่นๆ) เข้าไปได้

ความสัมพันธ์กับกรอบงานอื่นๆ

ตามที่ Howard Lewis Ship กล่าวไว้ Tapestry เริ่มแรกถูกคิดค้นขึ้นเพื่อพยายามนำแนวคิดและวิธีการทั่วไปบางส่วนที่พบใน WebObjects ซึ่งในขณะนั้นเขียนด้วยObjective-Cและเป็นซอฟต์แวร์ปิด มา ใช้ในภาษา Java [ 16 ]

Apache Wicketได้รับการพัฒนาขึ้นเพื่อตอบสนองต่อความซับซ้อนของ Tapestry เวอร์ชันแรกๆ ตามที่ Jonathan Locke ผู้คิดค้น Wicket กล่าวไว้[ 17 ]

Faceletsซึ่งเป็นเทคโนโลยีการแสดงผลเริ่มต้นในJavaServer Facesได้รับแรงบันดาลใจจาก Tapestry เวอร์ชันแรกๆ โดยมีจุดประสงค์เพื่อตอบสนองความต้องการ "เฟรมเวิร์กเช่น Tapestry ซึ่งได้รับการสนับสนุนจาก JavaServer Faces ในฐานะมาตรฐานอุตสาหกรรม" [ 18 ] [ 19 ]

ประวัติศาสตร์

เวอร์ชั่นวันที่คำอธิบาย
ไม่รองรับ: 1.02000พัฒนาโดยบริษัท Howard Lewis Ship เพื่อใช้ภายในองค์กร
ไม่รองรับ: 2.02545-2545เผยแพร่ครั้งแรกบนSourceForgeภายใต้สัญญาอนุญาตสาธารณะทั่วไป GNU Lesser [ 20 ]
ไม่รองรับ: 3.02547-04การเผยแพร่ครั้งแรกภายใต้ Apache ในฐานะโครงการย่อยของ Jakarta [ 21 ]
ไม่รองรับ: 4.02549-01แนะนำการสนับสนุนคำอธิบายประกอบ JDK 1.5 ระบบย่อยการตรวจสอบความถูกต้องของอินพุตใหม่ และการรายงานข้อผิดพลาดที่ได้รับการปรับปรุง[ 22 ]
รองรับเวอร์ชัน: 5.02551-2555เป็นการเขียนโค้ดใหม่เกือบทั้งหมดจาก Tapestry 4 โดยนำเสนอโมเดลส่วนประกอบแบบใหม่ที่ใช้ POJO ซึ่งเน้นการใช้ข้อตกลงร่วมกันมากกว่าการกำหนดค่า และแทนที่ Hivemind ด้วยเลเยอร์ Inversion of Control แบบใหม่ที่ไม่ใช้ XML
รองรับเวอร์ชัน: 5.12552-04มีการปรับปรุงประสิทธิภาพและการประหยัดหน่วยความจำ การบีบอัด GZIP อัตโนมัติ การรวม JavaScript แต่ยังคงใช้งานร่วมกับ Tapestry 5.0 ได้
รองรับเวอร์ชัน: 5.22010-12เพิ่มการตรวจสอบความถูกต้องของ Bean JSR 303 [ 23 ] ขยายการโหลดคลาสสดไปยังการใช้งานบริการ ลบพูลเพจ[ 24 ]
รองรับเวอร์ชัน: 5.32011-11เพิ่มการสนับสนุนสำหรับ doctype HTML5, คำอธิบายประกอบ JSR-330 สำหรับการแทรก[ 25 ]การปรับปรุงประสิทธิภาพและหน่วยความจำ ส่วนประกอบใหม่ เปลี่ยนจากการจัดการไบต์โค้ด JavaAssist เป็น ASM
รองรับเวอร์ชัน: 5.3.1 - 5.3.82012-2014แก้ไขข้อผิดพลาดและปรับปรุงเล็กน้อย
รองรับเวอร์ชัน: 5.4-5.4.52015-2019การปรับปรุงฝั่งไคลเอ็นต์ที่สำคัญ เลเยอร์ JavaScript ใหม่เพื่อรองรับ jQuery/Prototype ที่สลับได้ ใช้ Require.js สำหรับระบบโมดูล JavaScript และTwitter Bootstrapสำหรับการจัดสไตล์เริ่มต้น[ 26 ]
รองรับ: 5.52020-03รองรับ Java 12 bytecode, TypeScript และ Bootstrap 4
รองรับเวอร์ชัน: 5.62020-09รองรับไบต์โค้ด Java 14 และปรับปรุงการเข้าถึงในแบบฟอร์มด้วยการสร้างแอตทริบิวต์ WAI-ARIA โดยอัตโนมัติ
รองรับเวอร์ชัน: 5.72021-02รองรับโมดูล Java 9+ (JPMS) บางส่วน รองรับ Hibernate 5.4.32.Final
รองรับเวอร์ชัน: 5.82022-01รองรับการเขียน REST endpoint, รองรับคำขอแบบอะซิงโครนัสของ Servlet API 3.0 ขึ้นไป, รองรับ Java 17, รองรับ CORS (Cross-Origin Resource Sharing)
เวอร์ชันล่าสุด: 5.92025-02เวอร์ชันเสถียรปัจจุบัน รองรับ Jakarta EE

ดูเพิ่มเติม

  • เว็บไซต์อย่างเป็นทางการแก้ไขข้อมูลนี้ได้ที่วิกิดาต้า

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ ไม่มีชื่อบทความ

Apache Tapestry เป็น เฟรมเวิร์กเว็บแอปพลิเคชัน Java แบบ โอเพนซอร์ส ที่เน้นส่วนประกอบ ซึ่งมี แนวคิดคล้ายกับ JavaServer Faces และ Apache Wicket [ 2 ] Tapestry ถูกสร้างขึ้นโดย Howard.

คุณสมบัติเด่น

การบรรจุกระสุนในชั้นเรียนสด Tapestry ตรวจสอบระบบไฟล์เพื่อหาการเปลี่ยนแปลงในคลาสหน้า Java คลาสคอมโพเนนต์ คลาสการใช้งานบริการ เทมเพลต HTML และไฟล์คุณสมบัติคอมโพเนนต์ และจะทำการ hot-swap การเปลี่ยนแปลงลงในแอปพลิเคชันที่กำลังทำงานอยู่โดยไม่ต้องรีสตาร์ท...

ตัวอย่าง "สวัสดีโลก"

แอปพลิเคชัน Tapestry ที่มีรูปแบบเรียบง่ายนั้นต้องการเพียงสามไฟล์เท่านั้น:

การแปลงคลาส

Tapestry ใช้การจัดการไบต์โค้ดเพื่อแปลงคลาสเพจและคอมโพเนนต์ในขณะรันไทม์ วิธีนี้ช่วยให้สามารถเขียนคลาสเพจและคอมโพเนนต์เป็น POJO ง่ายๆ ได้ โดยใช้ข้อกำหนดการตั้งชื่อและคำอธิบายประกอบเพียงเล็กน้อย ซึ่งอาจกระตุ้นพฤติกรรมเพิ่มเติมที่สำคัญในขณะโหลดคลาส Tapestry...