- 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 - 儲存
每個 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 是變數(要儲存)名稱。