@Persist
.discardPersistentFieldChanges()
method as demonstrated by this link:
To see what's currently stored in your session, see the Display Session Contents example.Caution
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!-- We need a doctype to allow us to use special characters like
We use a "strict" DTD to make IE follow the alignment rules. -->
<html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd">
<body class="container">
<h3>Storing Data in a Page</h3>
Sometimes there are fields in a page that you want the page to store for use next time you access the page.<br/>
To do this, annotate those fields with <code>@Persist</code>.<br/><br/>
In this example we use @Persist on a field called <em>count</em>. We increment <em>count</em> every time the page is rendered.<br/>
If you revisit this page or reload it, you will see that <em>count</em> has been remembered and incremented.
<div class="eg">
The number of times you have visited this page during this session: <strong>${count}</strong>
</div>
The default <em>strategy</em> for @Persist is "session", which means store the field's value server-side in your web session.
Alternative strategies for @Persist include "flash" and "client" - see
<a href="http://tapestry.apache.org/persistent-page-data.html">Persistent Page Data</a>. <br/><br/>
To remove a session-persisted field from the session, set it to null, or call ComponentResources'
<code>discardPersistentFieldChanges()</code> method as demonstrated by this link:
<div class="eg">
<a t:type="eventlink" t:event="clear" href="#">Remove count from the Session and go Home</a>.
</div>
To see what's currently stored in your session, see the Display Session Contents example.<br/><br/>
<p><strong>Caution</strong></p>
<ul>
<li>The "session" strategy is risky because many browsers share the same session across windows and tabs.
The danger is that the field will be overwritten if the user opens a new window or tab and visits the same page.
We address this issue in the Wizard examples by creating a "conversation".</li>
<li>"Session" persistence also has an impact on clustered servers. Howard discusses this in
<a href="http://thread.gmane.org/gmane.comp.java.tapestry.user/65410/focus=65426">Tapestry App Replication</a>
(note that <em>@ApplicationState</em> is the old name for <em>@SessionState</em>)
and the documentation discusses it in
<a href="http://tapestry.apache.org/persistent-page-data.html#PersistentPageData-ClusteringIssues">Clustering Issues</a>.</li>
</ul>
You can add your own persistence strategy: see
<a href="http://wiki.apache.org/tapestry/Tapestry5HowToUsePersistentFieldStrategy">How To Use Persistent Field Strategy</a>.<br/><br/>
References: <a href="http://tapestry.apache.org/persistent-page-data.html">Persistent Page Data</a>,
<a href="http://tapestry.apache.org/5.4/apidocs/org/apache/tapestry5/annotations/Persist.html">@Persist</a>,
<a href="http://tapestry.apache.org/5.4/apidocs/org/apache/tapestry5/PersistenceConstants.html">PersistenceConstants</a>,
<a href="http://tapestry.apache.org/persistent-page-data.html#PersistentPageData-ClusteringIssues">Clustering Issues</a>,
<a href="http://wiki.apache.org/tapestry/Tapestry5HowToUsePersistentFieldStrategy">How To Use Persistent Field Strategy</a>.<br/><br/>
<t:pagelink page="Index">Home</t:pagelink><br/><br/>
<t:tabgroup>
<t:sourcecodetab src="/web/src/main/java/jumpstart/web/pages/examples/state/StoringDataInAPage.tml"/>
<t:sourcecodetab src="/web/src/main/java/jumpstart/web/pages/examples/state/StoringDataInAPage.java"/>
<t:sourcecodetab src="/web/src/main/resources/META-INF/assets/css/examples/olive.css"/>
</t:tabgroup>
</body>
</html>
package jumpstart.web.pages.examples.state;
import jumpstart.web.pages.Index;
import org.apache.tapestry5.ComponentResources;
import org.apache.tapestry5.annotations.Import;
import org.apache.tapestry5.annotations.Persist;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.ioc.annotations.Inject;
@Import(stylesheet="css/examples/olive.css")
public class StoringDataInAPage {
// Screen fields
@Property
@Persist
private int count;
// Generally useful bits and pieces
@Inject
private ComponentResources componentResources;
// The code
void setupRender() {
count++;
}
Object onClear() {
componentResources.discardPersistentFieldChanges();
return Index.class;
}
}
.eg {
margin: 20px 0;
padding: 14px;
color: olive;
border: 1px solid #ddd;
border-radius: 6px;
-webkit-border-radius: 6px;
-mox-border-radius: 6px;
}