每个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模块作为Entity持久保存数据.该实体将存储在Hibernate中,其引用(Java类名称及其主键)将作为标记保存在 HttpSession 中.将使用HttpSession中可用的令牌恢复该实体.
@Persist(HibernatePersistenceConstants.ENTITY) private Category category;
JPA实体策略 : 使用JPA模块保留数据.它只能存储实体.
@Persist(JpaPersistenceConstants.ENTITY) private User user;
会话存储
会话存储是一种高级概念,用于存储需要跨数据等页面提供的数据在多页向导中,登录用户详细信息等.会话存储提供两个选项,一个用于存储复杂对象,另一个用于存储简单值
会话商店对象 : 用于存储复杂对象.
会话属性 : 用于存储简单值.
会话存储对象(SSO)
SSO可以是使用 @SessionStore 注释创建. 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是页面/类名,最后email是变量(待存储)名称.