存储(Storage)
每个Web应用程序都应该有一些方法来存储某些用户数据,如用户对象,用户首选项等。例如,在购物车应用程序中,用户选择的项目/产品应保存在临时存储桶(购物车)中,直到用户更喜欢购买产品。 我们可以将项目保存在数据库中,但由于所有用户都不打算购买所选项目,因此会过于昂贵。 因此,我们需要临时安排来存储/保留项目。 Apache Tapestry提供了两种持久化数据的方法 - 它们是 -
- 持久性页面数据
- 会话存储
两者都有自己的优点和局限。 我们将在以下部分进行检查。
持久性页面数据
持久性页面数据是一种简单的概念,用于在请求之间的单个页面中保存数据,它也称为Page Level Persistence 。 可以使用@Persist注释完成。
@Persist
public int age;
一旦使用@Persist对字段进行注释,字段的值将在请求中保持不变,如果在请求期间更改了值,则在下次访问时将反映该字段。 Apache Tapestry提供了五种类型的策略来实现@Persist概念。 它们如下 -
Session Strategy - 使用会话持久保存数据,这是一种默认策略。
Flash Strategy - 数据也使用Session持久化,但它是一个非常短暂的数据。 数据仅在一个后续请求中可用。
@Persist(PersistenceConstants.FLASH)
private int age;
Client Strategy - 数据在客户端持久化,例如URL查询字符串,表单中的隐藏字段等。
@Persist(PersistenceConstants.FLASH)
private int age;
Hibernate Entity Strategy - 使用Hibernate模块作为Entity持久保存数据。 该实体将存储在Hibernate中,其引用(Java类名及其主键)将作为令牌保存在HttpSession 。 将使用HttpSession中可用的令牌恢复该实体。
@Persist(HibernatePersistenceConstants.ENTITY)
private Category category;
JPA Entity Strategy - 使用JPA模块持久保存数据。 它只能存储实体。
@Persist(JpaPersistenceConstants.ENTITY)
private User user;
会话存储
会话存储是一种高级概念,用于存储需要跨页面的数据,如多页向导中的数据,登录的用户详细信息等。会话存储提供两个选项,一个用于存储复杂对象,另一个用于存储简单值
Session Store Object - 用于存储复杂对象。
Session Attributes - 用于存储简单值。
Session Store Object (SSO)
可以使用@SessionStore注释创建SSO。 SSO将使用对象的类型存储对象。 例如, Cart Object将使用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;
}
使用name作为会话引用的主要问题之一是我们可能会在多个类/页面中意外使用相同的名称。 在这种情况下,存储的数据可能会意外更改。 要解决此问题,最好使用名称以及类/页面名称和包名称,如com.myapp.pages.register.email ,其中com.myapp.pages是包名称,register是页面/类名称,最后电子邮件是变量(待存储)名称。