Apache Tapestry - 存储

每个 Web 应用程序都应该有某种方式来存储某些用户数据,例如用户对象、用户首选项等。 例如,在购物车应用程序中,用户选择的商品/产品应保存在临时存储桶(购物车)中,直到用户愿意购买该产品为止。 我们可以将商品保存在数据库中,但这会太昂贵,因为并不是所有用户都会购买所选商品。 因此,我们需要临时安排来存储/保留这些项目。 Apache Tapestry 提供了两种保存数据的方法,它们是 −

  • 持久性页面数据
  • 会话存储

两者都有各自的优点和局限性。 我们将在以下部分中对其进行检查。

持久化页面数据

持久化页面数据是一个简单的概念,用于在请求之间将数据持久化在单个页面中,也称为页面级持久化。 可以使用 @Persist 注解来完成。

@Persist 
public int age; 

一旦某个字段被@Persist注解,该字段的值将在请求中保留,如果该值在请求期间发生变化,它将在下次访问时反映出来。 Apache Tapestry 提供了五种类型的策略来实现 @Persist 概念。 它们如下 −

  • 会话策略 − 数据使用Session进行持久化,这是默认策略。

  • Flash 策略 − 数据也使用 Session 进行持久化,但它的生命周期非常短暂。 该数据仅在一次后续请求中可用。

@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 将使用对象的类型来存储对象。 例如,购物车对象将使用购物车类名作为标记来存储。 因此,任何复杂的对象都可以在应用程序中存储一次(每个用户一个)。

public class MySSOPage { 
   @SessionState 
   private ShoppingCart cart; 
}

SSO 是一种专门的存储,应该仅用于存储复杂/特殊的对象。 简单的数据类型也可以使用 SSO 来存储,但是存储简单的数据类型(例如字符串)使其在应用程序中仅存储一个"字符串"值。 在应用程序中使用单个"字符串"值是根本不可能的。 您可以使用简单的数据类型,因为 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 是包name ,register 是页面/类名称,最后 email 是变量(要存储)名称。