Tapestryでは、通常のインスタンス変数は各リクエストの終了時に自動的に消去されます。
これはとても重要な事で、Tapestryのページが多くのユーザーによってどうプールされ共有されるかと関係しています。
しかし、ページのデータの中には、後のリクエストでもそのデータにアクセスするために永続的に格納したいものがしばしばあります。
このために Persistアノテーション があります。
このアノテーションはプライベートなインスタンス変数に対して用いる事ができます。
@Persist private int value;
アノテーションされたフィールドの値は、リクエストを跨いで維持されます。 通常、この値はセッション内に格納されます(しかし、他の方式を用いる事も可能です)。
永続フィールドを変更するたびにその値が格納されます。
後のリクエストにおいて、その永続フィールドの値は格納場所から再ロードされます。
各フィールドのアノテーションの値には、リクエストを跨いでフィールドの値を格納するために用いる 方式 を指定します。
session方式はフィールドの値をセッションに格納します; セッションは必要に応じて生成されます。
適宜に長いセッションアトリビュート名が使用されます; それは、ページ名とコンポーネントID、フィールド名を結合したものです。
他の方式を指定しなければ、session方式がデフォルトになります。
flash方式も同様にセッションに情報を格納しますが、長い間格納されません。 セッションに格納された値は、ページの状態を復元するために一度使用されるとセッションから削除されます。
ユーザーに一度だけ表示する必要がある一時的なメッセージを格納するのが、flash方式の典型的な使い方です。
クライアント上に永続化されるフィールドです; 各URL中にクエリパラメータが追加されるのを(また、各フォームにhiddenフィールドが追加されているのを)目にするでしょう。
クライアント上への永続化はいくぶん高く付きます。各リンクに多数の文字を加える事になり、レンダリングされたページのサイズを膨らませます。 また、各リクエストのクエリパラメータにエンコードされた値をデシリアライズする余分な処理も発生します。
クライアント上への永続化は十分にスケールすることができません; クエリパラメータに多くの情報を格納するため、クエリパラメータの長さが問題となるかもしれません。 多くの場合、Webブラウザやファイアウォール、その他のサーバが黙ってURLを切り詰めてしまい、アプリケーションを壊してしまうでしょう。
クライアント上への永続化を使用するには十分な注意が必要で、最小限のデータだけを格納するようにしてください。 オブジェクトそのものを格納するのではなく、オブジェクトのアイデンティティ(つまり、主キー)を格納するようにしてください。
Persistアノテーションの値のデフォルトは空文字です。 この場合、コンポーネントの階層を上って現在使用中の方式を検索します。
各コンポーネントのメタデータ tapestry.persistence-strategy がチェックされます。 これは Meta アノテーションを用いて指定します。
その値がブランクでなければ、それが永続化方式として使用されます。 これによって、コンポーネントは(異なる方式を明示的に用いていない)サブコンポーネントの永続化方式を制御する事が可能となります。
どのコンポーネントにもメタデータが与えられていなければ、最終的には "session" がデフォルトとして用いられます。
@Persist でマークしたフィールドは、(インラインでの初期化やコンストラクタ内での初期化をしたとしても)デフォルト値を持つことはできません。
ページのデータを全て破棄することができる状態になったときには、永続フィールドをクリアすることができます。
ComponentResources のメソッド discardPersistentFieldChanges() は、ページの永続フィールド全てを破棄します。 どの永続化方式を用いていても破棄します。これは、メモリ上のページには影響せず、後のリクエストに対して効果があります。