Apache Tapestry - สถาปัตยกรรม

Tapestry พยายามใช้คุณสมบัติที่มีอยู่ของ Java ให้มากที่สุด ตัวอย่างเช่นหน้า Tapestry ทั้งหมดเป็นเพียง POJO ไม่บังคับใช้อินเทอร์เฟซที่กำหนดเองหรือคลาสพื้นฐานใด ๆ ในการเขียนแอปพลิเคชัน แต่จะใช้ Annotation (ตัวเลือกน้ำหนักเบาเพื่อขยายการทำงานของคลาส Java) เพื่อให้คุณสมบัติต่างๆ มันขึ้นอยู่กับการทดสอบการต่อสู้Java Servlet APIและใช้งานเป็นตัวกรอง Servlet เป็นมิติใหม่ของเว็บแอปพลิเคชันและการเขียนโปรแกรมนั้นค่อนข้างเรียบง่ายยืดหยุ่นเข้าใจได้และมีประสิทธิภาพ

เวิร์กโฟลว์

ให้เราพิจารณาลำดับของการดำเนินการที่เกิดขึ้นเมื่อมีการร้องขอหน้าเทป

Step 1 - Java Servletได้รับการร้องขอหน้า Java Servlet นี้ได้รับการกำหนดค่าในลักษณะที่คำขอที่เข้ามาจะถูกส่งต่อไปยัง tapestry การกำหนดค่าเสร็จสิ้นในไฟล์web.xmlตามที่ระบุไว้ในโปรแกรมต่อไปนี้ แท็กตัวกรองและไส้กรองแมปเปลี่ยนเส้นทางทุกการร้องขอไปยังผ้ากรอง

<!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>My Tapestry Application</display-name> 
   <context-param> 
      <param-name>tapestry.app-package</param-name> 
      <param-value>org.example.myapp</param-value> 
   </context-param> 
   <filter> 
      <filter-name>app</filter-name> 
      <filter-class>org.apache.tapestry5.TapestryFilter</filter-class> 
   </filter> 
   <filter-mapping> 
      <filter-name>app</filter-name> 
      <url-pattern>/*</url-pattern> 
   </filter-mapping> 
</web-app>

Step 2 - Tapestry Filter เรียกไฟล์ HttpServletRequestHandler บริการโดย Service() วิธี.

Step 3 - HttpServletRequestHandler จัดเก็บคำขอและการตอบกลับใน RequestGlobals. นอกจากนี้ยังรวมการร้องขอและการตอบกลับเป็นอ็อบเจ็กต์ Request and Response และส่งไปยัง RequestHandler

Step 4 - RequestHandler เป็นนามธรรมที่อยู่ด้านบนของ HttpServletRequestของ Servlet API คุณสมบัติเด่นบางประการของพรมทำในRequestHandlerมาตรา. คุณสมบัติของ Tapestry สามารถขยายได้โดยการเขียนตัวกรองใน RequestHandler RequestHandler มีตัวกรองในตัวหลายตัวซึ่งรวมถึง -

  • CheckForUpdates Filter- รับผิดชอบในการโหลดคลาสสด ตัวกรองนี้ตรวจสอบคลาส java สำหรับการเปลี่ยนแปลงและอัปเดตแอปพลิเคชันตามความจำเป็น

  • Localization Filter - ระบุตำแหน่งของผู้ใช้และให้การสนับสนุนการแปลสำหรับแอปพลิเคชัน

  • StaticFiles Filter- ระบุคำขอคงที่และยกเลิกกระบวนการ เมื่อกระบวนการถูกยกเลิก Java Servlet จะเข้าควบคุมและดำเนินการตามคำขอ

  • Error Filter - ตรวจจับข้อยกเว้นที่ไม่ถูกจับและแสดงหน้ารายงานข้อยกเว้น

นอกจากนี้ RequestHandler ยังแก้ไขและจัดเก็บคำขอและการตอบกลับใน RequestQlobals และเรียกใช้บริการ MasterDispatcher

Step 5 - MasterDispatcherมีหน้าที่รับผิดชอบในการแสดงผลเพจโดยเรียกผู้มอบหมายงานหลายคนเป็นคำสั่งเฉพาะ ผู้แจกจ่ายหลักสี่ตัวที่เรียกโดย MasterDispatcher มีดังต่อไปนี้ -

  • RootPath Dispatcher - มันรับรู้เส้นทางราก“ /” ของคำขอและแสดงผลเหมือนกับหน้าเริ่มต้น

  • Asset Dispatcher - รับรู้คำขอเนื้อหา (สินทรัพย์ Java) โดยตรวจสอบรูปแบบ URL / สินทรัพย์ / และส่งเนื้อหาที่ร้องขอเป็นไบต์สตรีม

  • PageRender Dispatcher- การดำเนินการ Tapestry จำนวนมากจะดำเนินการใน PageRender Dispatcher และผู้มอบหมายงาน Component Dispatcher ถัดไป ผู้มอบหมายงานนี้รับรู้หน้าเฉพาะของคำขอนั้นและบริบทการเปิดใช้งาน (ข้อมูลเพิ่มเติม) จากนั้นจะแสดงเพจนั้นและส่งไปยังไคลเอนต์ ตัวอย่างเช่นหาก url คำขอคือ / product / 12123434 ผู้มอบหมายงานจะตรวจสอบว่ามีคลาสที่มีชื่อผลิตภัณฑ์ / 12123434 หรือไม่ หากพบจะเรียกคลาส product / 12123434 สร้างการตอบสนองและส่งไปยังไคลเอนต์ หากไม่เป็นเช่นนั้นจะตรวจสอบระดับผลิตภัณฑ์ หากพบจะเรียกคลาสผลิตภัณฑ์ที่มีข้อมูลเพิ่มเติม 121234434 สร้างการตอบสนองและส่งไปยังไคลเอนต์ ข้อมูลเพิ่มเติมนี้เรียกว่าบริบทการเปิดใช้งาน หากไม่พบคลาสก็เพียงส่งต่อคำขอไปยัง Component Dispatcher

  • Component Dispatcher- Component Dispatcher จับคู่ URL ของเพจด้วยรูปแบบ - / <class_name> / <component_id>: <event_type> / <activation_context> ตัวอย่างเช่น / product / grid: sort / asc แสดงถึงคลาสผลิตภัณฑ์ส่วนประกอบกริดประเภทการจัดเรียงเหตุการณ์และบริบทการเปิดใช้งาน asc ที่นี่ event_type เป็นทางเลือกและหากไม่มีการระบุการดำเนินการประเภทเหตุการณ์เริ่มต้นจะถูกทริกเกอร์ โดยปกติการตอบสนองของผู้มอบหมายงานคอมโพเนนต์คือการส่งการเปลี่ยนเส้นทางไปยังไคลเอนต์ ส่วนใหญ่การเปลี่ยนเส้นทางจะตรงกับ PageRender Dispatcher ในคำขอถัดไปและการตอบกลับที่เหมาะสมจะถูกส่งไปยังไคลเอนต์