31

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

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

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

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

ありがとう。

4

2 に答える 2

28

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

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

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

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

また、どのように計算されますか - richfaces は myfaces とは異なる方法で計算される可能性があることは理解していますが、アイデアはいいでしょう。

各コンポーネントは、その状態を保持する責任がsaveStateありrestoreStateます (このチュートリアルを参照してください)。したがって、コンポーネント スイートが異なれば、ビュー ステートも異なります。同様に、JSF 実装が異なれば、ビュー ステートも異なる可能性があります。

于 2010-05-26T07:37:12.057 に答える
13

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

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

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

UIView
 - UIForm
    - UICommand
    - UIInput

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

于 2010-05-26T07:48:04.860 に答える