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 應用程式,因為它非常簡單快捷。

廣告
© . All rights reserved.