- 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 - 高階特性
本章將詳細討論 Apache Tapestry 的一些高階特性。
控制反轉 (Inversion of Control)
Tapestry 提供了內建的控制反轉庫。Tapestry 深度整合到 IoC 中,並將其用於所有功能。Tapestry IoC 配置基於 Java 本身,而不是像許多其他 IoC 容器那樣基於 XML。Tapestry 基於 IoC 的模組被打包到 JAR 檔案中,只需將其放入類路徑即可,無需任何配置。Tapestry IoC 的使用基於輕量級,這意味著:
兩個或三個方法的小介面。
具有兩個或三個引數的小方法。
透過事件進行匿名通訊,而不是顯式的方法呼叫。
模組
模組是擴充套件 Tapestry 應用程式功能的一種方式。Tapestry 既有內建模組,也有大量的第三方模組。Hibernate 是 Tapestry 提供的一個熱門且非常有用的模組。它還具有整合 JMX、JPA、Spring 框架、JSR 303 Bean 驗證、JSON 等的模組。一些值得注意的第三方模組包括:
- Tapestry-Cayenne
- Tapestry5-googleanalytics
- Gang of tapestry 5 - Tapestry5-HighCharts
- Gang of tapestry 5 - Tapestry5-jqPlot
- Gang of tapestry 5 - Tapestry5-Jquery
- Gang of tapestry 5 - Tapestry5-Jquery-mobile
- Gang of tapestry 5 - Tapestry5-Portlet
執行時異常
Tapestry 最好的特性之一是**詳細的錯誤報告**。Tapestry 透過提供最先進的異常報告來幫助開發者。Tapestry 異常報告是簡單的 HTML,包含詳細資訊。任何人都可以輕鬆理解該報告。Tapestry 以 HTML 顯示錯誤,並以純文字格式儲存異常,其中包含異常發生的日期和時間。這將幫助開發者檢查生產環境中的異常。開發者可以更有信心地修復任何問題,例如損壞的模板、意外的空值、不匹配的請求等。
即時類和模板過載
修改模板和類後,Tapestry 將自動重新載入它們。此功能使應用程式更改能夠立即反映出來,而無需經過構建和測試周期。此外,此功能極大地提高了應用程式開發的生產力。
假設應用程式的根包是**org.example.myfirstapp**。然後,將掃描以下路徑中的類以進行重新載入。
- org.example.myfirstapp.pages
- org.example.myfirstapp.components
- org.example.myfirstapp.mixins
- org.example.myfirstapp.base
- org.example.myfirstapp.services
可以透過在**AppModule.java**中將生產模式設定為**true**來停用即時類過載。
configuration.add(SymbolicConstants.PRODUCTION_MODE,”false”);
單元測試
單元測試是一種測試單個頁面和元件的技術。Tapestry 提供了輕鬆單元測試頁面和元件的選項。
頁面單元測試:Tapestry 提供了一個名為**PageTester**的類來測試應用程式。它充當瀏覽器和 servlet 容器。它在伺服器端本身渲染頁面而無需瀏覽器,並且可以檢查生成的文件是否渲染正確。考慮一個簡單的頁面**Hello**,它渲染 hello,並且 hello 文字包含在 id 為**hello_id** 的 html 元素內。為了測試此功能,我們可以使用 PageTester,如下所示:
public class PageTest extends Assert {
@Test
public void test1() {
Sring appPackage = "org.example.myfirstapp"; // package name
String appName = "App1"; // app name
PageTester tester = new PageTester(appPackage, appName, "src/main/webapp");
Document doc = tester.renderPage("Hello");
assertEquals(doc.getElementById("hello_id").getChildText(), "hello");
}
}
除了渲染頁面外,PageTester 還提供包含上下文資訊、表單提交、連結導航等的選項。
整合測試
整合測試有助於將應用程式作為一個模組進行測試,而不是像單元測試那樣檢查各個頁面。在整合測試中,可以將多個模組作為一個單元一起測試。Tapestry 提供了一個名為**Tapestry Test Utilities**的小型庫來進行整合測試。此庫與 Selenium 測試工具整合以執行測試。該庫提供了一個基類**SeleniumTestCase**,它啟動並管理 Selenium 伺服器、Selenium 客戶端和 Jetty 例項。
整合測試的一個示例如下:
import org.apache.tapestry5.test.SeleniumTestCase;
import org.testng.annotations.Test;
public class IntegrationTest extends SeleniumTestCase {
@Test
public void persist_entities() {
open("/persistitem");
assertEquals(getText("//span[@id='name']").length(), 0);
clickAndWait("link = create item");
assertText("//span[@id = 'name']", "name");
}
}
開發儀表盤
開發儀表盤是用於識別/解決應用程式中問題的預設頁面。可以透過 URL **https://:8080/myfirstapp/core/t5dashboard** 訪問儀表盤。儀表盤顯示應用程式中可用的所有頁面、服務和元件庫。
響應壓縮
Tapestry 使用**GZIP 壓縮**自動壓縮響應並將其流式傳輸到客戶端。此功能將減少網路流量並有助於更快地交付頁面。可以使用 AppModule.java 中的符號**tapestry.min-gzip-size** 配置壓縮。預設值為 100 位元組。一旦響應大小超過 100 位元組,Tapestry 將壓縮響應。
安全性
Tapestry 提供了許多選項來保護應用程式免受 Web 應用程式中已知的安全漏洞的影響。其中一些選項列在下面:
**HTTPS** - 可以使用**@Secure**註解 Tapestry 頁面,使其成為安全頁面,並且只能透過**https 協議**訪問。
**頁面訪問控制** - 僅控制特定使用者可以訪問的頁面。
**白名單頁面** - 可以使用**@WhitelistAccessOnly**註解 Tapestry 頁面,使其只能透過**localhost**訪問。
**資源安全性** - 在 Tapestry 下,只有某些型別的檔案是可訪問的。其他檔案只有在提供檔案的**MD5 雜湊值**時才能訪問。
**序列化物件日期** - Tapestry 將 HMAC 整合到序列化的 Java 物件資料中並將其傳送到客戶端,以避免訊息篡改。
**跨站點請求偽造 (CSRF)** - Tapestry 提供了一個名為 tapestry-csrf-protection 的第三方模組來防止任何 CSRF 攻擊。
**安全框架整合** - Tapestry 不會鎖定到單個身份驗證/授權實現。Tapestry 可以與任何流行的身份驗證框架整合。
日誌記錄
Tapestry 提供了對日誌記錄的廣泛支援,即在應用程式執行時自動記錄其進度。Tapestry 使用事實上的 Java 日誌記錄庫**SLF4J**。可以在任何元件方法中使用**@Log**註解來發出方法的進入和退出以及可能的異常。此外,可以使用**@Inject**註解將 Tapestry 提供的日誌記錄器物件注入到任何元件中,如下所示:
public class MyPage {
@Inject
private Logger logger;
// . . .
void onSuccessFromForm() {
logger.info("Changes saved successfully");
}
@Log
void onValidateFromForm() {
// logic
}
}
最後,我們現在可以說 Apache Tapestry 提供了構建簡潔、可擴充套件、可維護、健壯且支援 Ajax 的應用程式的最佳方法。Tapestry 可以與任何第三方 Java 應用程式整合。它還可以幫助建立大型 Web 應用程式,因為它非常簡單快捷。