Apache Tapestry - 儲存



每個 Web 應用程式都應該有一些方法來儲存某些使用者資料,例如使用者物件、使用者偏好等。例如,在購物車應用程式中,使用者選擇的產品應儲存在臨時儲存區(購物車)中,直到使用者選擇購買這些產品。我們可以將商品儲存在資料庫中,但這將過於昂貴,因為並非所有使用者都會購買所選商品。因此,我們需要一個臨時的安排來儲存/持久化這些商品。Apache Tapestry 提供兩種持久化資料的方式,它們分別是:

  • 持久化頁面資料
  • 會話儲存

兩者都有其自身的優點和侷限性。我們將在以下部分中進行檢查。

持久化頁面資料

持久化頁面資料是一個簡單的概念,用於在請求之間持久化單個頁面中的資料,也稱為**頁面級持久化**。可以使用**@Persist** 註解來實現。

@Persist 
public int age; 

一旦某個欄位使用 @Persist 進行註釋,該欄位的值將在請求之間持久化,並且如果在請求期間更改了該值,則下次訪問時將反映更改。Apache Tapestry 提供五種型別的策略來實現 @Persist 概念。它們如下:

  • **會話策略** - 資料使用會話持久化,這是預設策略。

  • **快閃記憶體策略** - 資料也使用會話持久化,但它非常短暫。資料僅在下一個請求中可用。

@Persist(PersistenceConstants.FLASH) 
private int age;
  • **客戶端策略** - 資料持久化在客戶端,例如 URL 查詢字串、表單中的隱藏欄位等。

@Persist(PersistenceConstants.FLASH) 
private int age; 
  • **Hibernate 實體策略** - 資料使用 Hibernate 模組作為實體持久化。實體將儲存在 Hibernate 中,其引用(Java 類名及其主鍵)將作為令牌儲存在**HttpSession** 中。實體將透過使用 HttpSession 中可用的令牌進行恢復。

@Persist(HibernatePersistenceConstants.ENTITY) 
private Category category;
  • **JPA 實體策略** - 資料使用 JPA 模組持久化。它只能儲存實體。

@Persist(JpaPersistenceConstants.ENTITY) 
private User user; 

會話儲存

會話儲存是一個高階概念,用於儲存需要跨頁面可用資料,例如多頁面嚮導中的資料、登入使用者的詳細資訊等。會話儲存提供兩種選項,一種用於儲存複雜物件,另一種用於儲存簡單值

  • **會話儲存物件** - 用於儲存複雜物件。

  • **會話屬性** - 用於儲存簡單值。

會話儲存物件 (SSO)

可以使用**@SessionStore** 註解建立 SSO。SSO 將使用物件的型別來儲存物件。例如,**購物車物件**將使用 Cart 類名作為令牌儲存。因此,任何複雜的物件都可以在應用程式中儲存一次(每個使用者一個)。

public class MySSOPage { 
   @SessionState 
   private ShoppingCart cart; 
}

SSO 是一個專門的儲存,應該僅用於儲存複雜/特殊物件。簡單資料型別也可以使用 SSO 儲存,但是儲存諸如 String 之類的簡單資料型別只會使應用程式中儲存一個“String”值。在應用程式中使用單個“String”值根本不可能。您可以使用簡單資料型別,因為 Apache Tapestry 提供了會話屬性。

會話屬性

會話屬性允許按名稱而不是按型別儲存資料。

public class MyPage { 
   @SessionAttribute  
   private String loggedInUsername; 
}

預設情況下,會話屬性使用欄位名稱在會話中引用資料。我們可以透過註釋引數更改引用名稱,如下所示:

public class MyPage { 
   @SessionAttribute("loggedInUserName") 
   private String userName; 
}

使用名稱作為會話引用的主要問題之一是,我們可能會意外地在多個類/頁面中使用相同的名稱。在這種情況下,儲存的資料可能會意外更改。為了解決此問題,最好將名稱與類/頁面名稱和包名稱一起使用,例如**com.myapp.pages.register.email**,其中 com.myapp.pages 是包名稱,register 是頁面/類名稱,最後 email 是變數(要儲存)名稱。

廣告

© . All rights reserved.