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 是变量(要存储)名称。

广告

© . All rights reserved.