📅  最后修改于: 2020-10-27 03:08:22             🧑  作者: Mango
每个Web应用程序都应该有某种方式来存储某些用户数据,例如用户对象,用户首选项等。例如,在购物车应用程序中,用户选择的项目/产品应保存在临时存储桶(购物车)中,直到用户喜欢为止。购买产品。我们可以将项目保存在数据库中,但是由于所有用户都不会购买所选项目,因此这太昂贵了。因此,我们需要临时安排存储/保留项目。 Apache Tapestry提供了两种保留数据的方法,它们是-
两者都有其自身的优点和局限性。我们将在以下各节中对其进行检查。
持久性页面数据是在请求之间的单个页面中持久性存储数据的简单概念,也称为页面级持久性。可以使用@Persist批注完成。
@Persist
public int age;
用@Persist注释字段后,该字段的值将在请求中保留,并且如果在请求期间更改了该值,则下次访问该字段时将反映该值。 Apache Tapestry提供了五种策略来实现@Persist概念。它们如下-
会话策略-使用会话保留数据,这是默认策略。
Flash策略-数据也可以使用Session持久化,但这是短暂的。该数据仅在随后的一个请求中可用。
@Persist(PersistenceConstants.FLASH)
private int age;
客户策略-数据保留在客户端,例如URL查询字符串,表单中的隐藏字段等。
@Persist(PersistenceConstants.FLASH)
private int age;
休眠实体策略-使用休眠模块作为实体持久保存数据。该实体将存储在Hibernate中,并且其引用(Java类名称及其主键)将作为令牌保存在HttpSession中。将使用HttpSession中可用的令牌还原该实体。
@Persist(HibernatePersistenceConstants.ENTITY)
private Category category;
JPA实体策略-使用JPA模块保留数据。它只能存储实体。
@Persist(JpaPersistenceConstants.ENTITY)
private User user;
会话存储是一种高级概念,用于存储需要跨页面访问的数据,例如多页向导中的数据,已登录的用户详细信息等。会话存储提供两个选项,一个用于存储复杂对象,另一个用于存储简单值
会话存储对象-用于存储复杂对象。
会话属性-用于存储简单值。
可以使用@SessionStore批注创建SSO。 SSO将使用对象的类型存储对象。例如,将使用Cart类名称作为令牌存储Cart对象。因此,任何复杂对象都可以在应用程序中存储一次(每个用户一个)。
public class MySSOPage {
@SessionState
private ShoppingCart cart;
}
SSO是专门的存储,应仅用于存储复杂/特殊对象。也可以使用SSO来存储简单数据类型,但是存储诸如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是页面/类名称,最后电子邮件是变量(要存储)的名称。