Apache Tapestry - Kiến trúc

Tapestry cố gắng sử dụng các tính năng có sẵn của Java càng nhiều càng tốt. Ví dụ: tất cả các trang Tapestry chỉ đơn giản là POJO. Nó không bắt buộc bất kỳ giao diện tùy chỉnh hoặc lớp cơ sở nào để viết ứng dụng. Thay vào đó, nó sử dụng Annotation (một tùy chọn trọng lượng nhẹ để mở rộng chức năng của một lớp Java) để cung cấp các tính năng. Nó dựa trên trận chiến đã được thử nghiệmJava Servlet APIvà được triển khai như một Bộ lọc Servlet. Nó cung cấp một khía cạnh mới cho ứng dụng web và lập trình khá đơn giản, linh hoạt, dễ hiểu và mạnh mẽ.

Quy trình làm việc

Hãy để chúng tôi thảo luận về trình tự hành động diễn ra khi một trang thảm được yêu cầu.

Step 1 - Sự Java Servletnhận được yêu cầu trang. Java Servlet này được cấu hình theo cách mà yêu cầu đến sẽ được chuyển tiếp đến tấm thảm. Cấu hình được thực hiện trongweb.xmlnhư được chỉ định trong chương trình sau. Bộ lọc và thẻ Ánh xạ bộ lọc chuyển hướng tất cả yêu cầu đến Bộ lọc Tapestry .

<!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 - Sự Tapestry Filter gọi cho HttpServletRequestHandler Dịch vụ của nó Service() phương pháp.

Step 3 - HttpServletRequestHandler lưu trữ yêu cầu và phản hồi trong RequestGlobals. Nó cũng bao bọc yêu cầu và phản hồi như một đối tượng Yêu cầu và Phản hồi và gửi nó tới RequestHandler.

Step 4 - Sự RequestHandler là một sự trừu tượng trên HttpServletRequestcủa API Servlet. Một số tính năng nổi bật của tấm thảm được thực hiện trongRequestHandlerphần. Tính năng của tấm thảm có thể được mở rộng bằng cách viết một bộ lọc trong RequestHandler. RequestHandler cung cấp một số bộ lọc tích hợp, bao gồm:

  • CheckForUpdates Filter- Chịu trách nhiệm tải lại lớp trực tiếp. Bộ lọc này kiểm tra các lớp java để tìm các thay đổi và cập nhật ứng dụng khi cần thiết.

  • Localization Filter - Xác định vị trí của người dùng và cung cấp hỗ trợ bản địa hóa cho ứng dụng.

  • StaticFiles Filter- Xác định yêu cầu tĩnh và hủy bỏ quá trình. Khi quá trình bị hủy bỏ, Java Servlet sẽ kiểm soát và xử lý yêu cầu.

  • Error Filter - Bắt trường hợp ngoại lệ không có và trình bày trang báo cáo ngoại lệ.

RequestHandler cũng sửa đổi và lưu trữ yêu cầu và phản hồi trong RequestQlobals và gọi ra dịch vụ MasterDispatcher.

Step 5 - Sự MasterDispatcherchịu trách nhiệm kết xuất trang bằng cách gọi một số người điều phối là một đơn đặt hàng cụ thể. Bốn điều phối viên chính được gọi bởi MasterDispatcher như sau:

  • RootPath Dispatcher - Nó nhận ra đường dẫn gốc “/” của yêu cầu và hiển thị giống như trang Bắt đầu.

  • Asset Dispatcher - Nó nhận ra yêu cầu nội dung (tài sản Java) bằng cách kiểm tra mẫu url / nội dung / và gửi nội dung được yêu cầu dưới dạng luồng byte.

  • PageRender Dispatcher- Hàng loạt hoạt động của tấm thảm được thực hiện trong PageRender Dispatcher và điều phối thành phần điều phối tiếp theo. Người điều phối này nhận ra trang cụ thể của yêu cầu đó và bối cảnh kích hoạt của nó (thông tin bổ sung). Sau đó, nó hiển thị trang cụ thể đó và gửi nó cho khách hàng. Ví dụ: nếu url yêu cầu là / product / 12123434, người điều phối sẽ kiểm tra xem có lớp nào có tên product / 12123434 hay không. Nếu được tìm thấy, nó sẽ gọi lớp product / 12123434, tạo phản hồi và gửi cho khách hàng. Nếu không, nó sẽ kiểm tra loại sản phẩm. Nếu được tìm thấy, nó gọi lớp sản phẩm với thông tin bổ sung 121234434, tạo phản hồi và gửi cho khách hàng. Thông tin bổ sung này được gọi là Bối cảnh kích hoạt. Nếu không tìm thấy lớp nào, nó chỉ cần chuyển tiếp yêu cầu tới Component Dispatcher.

  • Component Dispatcher- Bộ điều phối thành phần đối sánh URL của trang với mẫu - / <class_name> / <component_id>: <event_type> / <activation_context>. Ví dụ: / product / grid: sort / asc đại diện cho lớp sản phẩm, thành phần lưới, loại sortevent và ngữ cảnh kích hoạt asc. Ở đây, event_type là tùy chọn và nếu không có sự kiện nào được cung cấp, hành động loại sự kiện mặc định sẽ được kích hoạt. Thông thường, phản hồi của bộ điều phối thành phần là gửi một chuyển hướng đến máy khách. Hầu hết, chuyển hướng sẽ khớp với PageRender Dispatcher trong yêu cầu tiếp theo và phản hồi thích hợp sẽ được gửi cho khách hàng.