- Apache Tapestry 教程
- Apache Tapestry - 首頁
- Apache Tapestry - 概述
- Apache Tapestry - 架構
- Apache Tapestry - 安裝
- Apache Tapestry - 快速入門
- Apache Tapestry - 專案佈局
- 約定優於配置
- Apache Tapestry - 註解
- 頁面和元件
- Apache Tapestry - 模板
- Apache Tapestry - 元件
- 內建元件
- 表單和驗證元件
- Apache Tapestry - Ajax 元件
- Apache Tapestry - Hibernate
- Apache Tapestry - 儲存
- 高階特性
- Apache Tapestry 有用資源
- Apache Tapestry - 快速指南
- Apache Tapestry - 有用資源
- Apache Tapestry - 討論
Apache Tapestry - 架構
Tapestry 儘可能地利用 Java 的現有特性。例如,所有 Tapestry 頁面都只是簡單的 POJO(普通 Java 物件)。它不需要強制使用任何自定義介面或基類來編寫應用程式。相反,它使用註解(一種輕量級的擴充套件 Java 類功能的方法)來提供功能。它基於經過實戰檢驗的Java Servlet API,並作為 Servlet 過濾器實現。它為 Web 應用程式帶來了新的維度,程式設計非常簡單、靈活、易懂且健壯。
工作流程
讓我們討論一下請求 Tapestry 頁面時發生的一系列操作。
步驟 1 - Java Servlet接收頁面請求。此 Java Servlet 的配置方式是將傳入請求轉發到 Tapestry。配置在web.xml中完成,如下程式所示。Filter 和 Filter Mapping 標籤將所有請求重定向到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>
步驟 2 - Tapestry 過濾器透過其Service()方法呼叫HttpServletRequestHandler服務。
步驟 3 - HttpServletRequestHandler將請求和響應儲存在RequestGlobals中。它還將請求和響應包裝為 Request 和 Response 物件,並將其傳送到 RequestHandler。
步驟 4 - RequestHandler是 Servlet API 的HttpServletRequest之上的抽象層。Tapestry 的一些主要特性是在RequestHandler部分完成的。可以透過在 RequestHandler 中編寫過濾器來擴充套件 Tapestry 的功能。RequestHandler 提供了幾個內建過濾器,包括:
CheckForUpdates 過濾器 - 負責即時類重新載入。此過濾器檢查 Java 類是否有更改,並在必要時更新應用程式。
Localization 過濾器 - 識別使用者的地理位置,併為應用程式提供本地化支援。
StaticFiles 過濾器 - 識別靜態請求並中止程序。程序中止後,Java Servlet 將接管並處理請求。
Error 過濾器 - 捕獲未捕獲的異常並顯示異常報告頁面。
RequestHandler 還修改並存儲 RequestGlobals 中的請求和響應,並呼叫 MasterDispatcher 服務。
步驟 5 - MasterDispatcher負責透過按特定順序呼叫多個分發器來呈現頁面。MasterDispatcher 呼叫的四個主要分發器如下:
RootPath 分發器 - 它識別請求的根路徑“/”並將該路徑呈現為起始頁面。
Asset 分發器 - 它透過檢查 url 模式 /assets/ 來識別資源(Java 資源)請求,並將請求的資源作為位元組流傳送。
PageRender 分發器 - Tapestry 的大部分操作都在 PageRender 分發器和下一個分發器 Component 分發器中完成。此分發器識別該請求的特定頁面及其啟用上下文(額外資訊)。然後它呈現該特定頁面並將其傳送給客戶端。例如,如果請求 url 是 /product/12123434,分發器將檢查是否存在名為 product/12123434 的類。如果找到,它將呼叫 product/12123434 類,生成響應並將其傳送給客戶端。如果沒有找到,它將檢查 product 類。如果找到,它將使用額外資訊 121234434 呼叫 product 類,生成響應並將其傳送給客戶端。此額外資訊稱為啟用上下文。如果找不到任何類,它只需將請求轉發到 Component 分發器。
Component 分發器 - Component 分發器將頁面的 URL 與模式 /<class_name>/<component_id>:<event_type>/<activation_context> 匹配。例如,/product/grid:sort/asc 表示 product 類、grid 元件、sort 事件型別和 asc 啟用上下文。這裡,event_type 是可選的,如果沒有提供,將觸發預設事件型別操作。通常,元件分發器的響應是向客戶端傳送重定向。大多數情況下,重定向將在下一個請求中匹配 PageRender 分發器,並將正確的響應傳送給客戶端。