web-dev-qa-db-ja.com

JSFのビューステートとは何ですか?それはどのように使用されますか?

JSFでは、各ページに関連付けられたビューステートがあり、送信などでやり取りされます。

Viewstateはページ上のさまざまなコントロールの状態を使用して計算され、クライアント側またはサーバー側のいずれかに保存できることを知っています。

問題は、この値はどのように使用されるのかということです。同じリクエストが2回送信されないようにするために、送信時に送信される値を検証するために使用されますか?

また、それはどのように計算されますか-リッチフェイスはマイフェイスとは異なる方法で計算される可能性があることを理解していますが、アイデアはいいでしょう。

ありがとう。

26
Matthew Farwell

問題は、この値はどのように使用されるのかということです。同じリクエストが2回送信されないようにするために、送信時に送信される値を検証するために使用されますか?

ビューステートが存在する最初の理由は、HTTPがステートレスであるためです。リクエスト全体のコンポーネントの状態は、何らかの方法で維持する必要があります。状態をサーバーのメモリに保存してセッションにバインドするか、毎回リクエスト/レスポンスで状態をシリアル化/非シリアル化します。

申し訳ありませんが、ビューステートは二重送信の検出には使用されませんが、タイムスタンプまたはそれに類似したものを添付すると検出される可能性があります。

ビューステートを暗号化して、クライアントがビューステートを変更しないようにすることもできます。

また、計算方法-リッチフェイスはマイフェイスとは異なる方法で計算される可能性があることに気づきましたが、アイデアはいいでしょう。

各コンポーネントは、その状態をsaveStateおよびrestoreStateで永続化する責任があります(これを参照 tutorial )。したがって、コンポーネントスイートが異なると、ビューステートも異なります。同様に、JSF実装が異なると、ビューステートも異なる場合があります。

25
ewernli

JavaScriptに精通している場合、JSFコンポーネントツリーは、HTMLページが初期状態を定義するHTML DOMのように考えることができますが、実行時に変更できます。

ビューテクノロジ(通常はJSPまたはFacelets)は初期状態を定義しますが、その後はプログラムで操作できます。たとえば、 component を追加したり、 property を設定したりできます。これが適切に機能するためには、リクエスト間でビューステートを保持する必要があります。

ビューステートは2つの部分に分かれています。 1つ目は、コンポーネントツリーの構造を定義します。

UIView
 - UIForm
    - UICommand
    - UIInput

2番目の部分は、コンポーネントの状態を定義します。これらは、UIDataなどのコンポーネントのために分離されています。UIDataでは、子が(たとえば)行ごとの状態を持つことができます。これは StateHolder メカニズムによってマーシャリング/アンマーシャリングされます。

12
McDowell