Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migration of unmigrated content due to installation of a new plugin


 

Persistent Page Data

Info

The use of the term "persistence" here refers to page-level persistence, NOT database persistence.

Most instance variables in Tapestry are automatically cleared at the end of each request. This is important, as it pertains to how Tapestry pages are shared, over time, by many users.

{
Div
Wiki Markup
style
float:right
titleRelated Articles
classaui-label
Content by Label
showLabelsfalse
showSpacefalse
titleRelated Articles
cqllabel = "persistence" and space = currentSpace()
|background=#eee} {contentbylabel:title=Related Articles|showLabels=false|showSpace=false|space=@self|labels=persistence} {float}

However, you often want to store some data on a single page, and have access to it in later requests to that same page, without having to store it in a database between requests. (To store values across multiple pages, see Session Storage.)

Making page data persist across requests to a single page is accomplished with the @Persist annotation. This annotation is applied to private instance fields of components:

Code Block
java
languagejava
  @Persist
  private int value;

...

Wiki Markup
{float:right|background=#eee|padding=0 1em}
    *JumpStart Demo:*
    [Storing Data in a Page|httphttps://tapestry-jumpstart.doublenegative.com.auorg/jumpstart/examples/state/storingdatainapage]
    [Passing Data Between Pages|httphttps://tapestry-jumpstart.doublenegative.com.auorg/jumpstart/examples/state/passingdatabetweenpages]
{float}

...

A suitably long session attribute name is used; it incorporates the name of the page, the nested component id, and the name of the field.

Code Block
languagejava
titleExample: Session Strategy
  @Persist
  private int value;

...

The flash is typically used to store temporary messages that should only be displayed to the user once.

Code Block
languagejava
titleExample: Flash Strategy
  @Persist(PersistenceConstants.FLASH)
  private int value;

...

Use client persistence with care, and store a minimal amount of data. Try to store the identity (that is, primary key) of an object, rather than the object itself.

Code Block
languagejava
titleExample: Client Strategy
  @Persist(PersistenceConstants.CLIENT)
  private int value;

Hibernate Entity Strategy

Entity persistence is provided by either the tapestry-hibernate modules module (which extend extends Tapestry with new features).

In Entity persistence, the field should store a Hibernate entity instance.

Code Block
languagejava
title"Hibernate Entity Strategy"
  @Persist(HibernatePersistenceConstants.ENTITY)
  private User user;

...


The value stored in the HttpSession is a token for the entity: its Java class name and primary key. When the field is restored in a later request, the entity is re-instantiated using that data.

...

JPA Entity Strategy

The tapestry-jpa module introduces uses a similar strategy (also with the name "entity"). However, at the current time it may can only store a persisted entity (one that has been saved to the database and has a primary key).

Code Block
languagejava
title"Example: JPA Entity Strategy"
  @Persist(JpaPersistenceConstants.ENTITY)
  private Account account;

Persistence Strategy Inheritance

By default the value for the Persist annotation is the empty string. When this is true, then the actual strategy to be used is determined by a search up the component hierarchy.

For each component, the meta-data property tapestry.persistence-strategy is checked. This can be specified using the @Meta annotation.

If the value is non-blank, then that strategy is used. This allows a component to control the persistence strategy used inside any sub-components (that don't explicitly use a different strategy).

...

Include Page
Clustering Issues
Clustering Issues

Code Block
languagejava
titleExample: Entity Session Strategy
  @Persist(HibernatePersistenceConstants.ENTITY)
  private User user;


Code Block
languagejava
title"Example:JAP Session Strategy"
  @Persist(JpaPersistenceConstants.ENTITY)
  private Account account;

...