Struts2内でデータがたどるパスを理解しようとしていますが、データはどのようにValueStackに配置されますか?現在ValueStackに存在するオブジェクトを確認するにはどうすればよいですか?さまざまなスコープのアプリケーション、セッション、リクエスト、ページから他にどのようなデータにアクセスできますか?変数が持つべきスコープを決定する方法は?
2 に答える
それはたくさんの質問です。
値スタックは単なるデータ構造であり、マップとスタックの組み合わせのようなものです。名前付きオブジェクト(#
OGNLのタグを介してアクセス)はマップ内にあり(たとえば、リクエストスコープなど)、プロパティ/メソッドを検索するオブジェクトはスタック上にあります。
<s:debug>
タグは、値スタックにあるものを見つける最も簡単な方法です。また、JSPの「裸の」配列表記を使用して、スタック上の任意のオブジェクトにアクセスすることもできます。たとえば、"[0]"
最上位のオブジェクト、"[1]"
次のオブジェクトなどです。これは、実際にはほとんどありません。
各スコープにあるものは何でもアクセスできます。
ほとんどの場合、独自のオブジェクトは、アクション自体を介して、または実装している場合ModelDriven
はモデルを介して、値スタックに配置する必要があります。それ以外は、他のJava EEアプリケーションと同じです。クライアントのセッション中に必要なオブジェクトはセッションスコープ内にある必要があり、アプリケーション間で共有されるオブジェクトはアプリケーションスコープ内にある必要があります。
値スタック自体はリクエストスコープ内にあります。
具体的には、「データの移動方法」要素と、ValueStackのスタック性について説明します。利用可能なデータについては、コンテキストによって変わる可能性があります。「スタック」を持つことの全体的なポイントは、スコープ内のデータのコンテキストの変更をサポートすることです。さらに、スタック上の特定のデータは、strutsのWebサイトにあるような参考資料でより適切にカバーされています。
Struts2のアーキテクチャは非常にクリーンです。これは、ソフトウェアの関心事を個別のコンポーネントに分離するという素晴らしい仕事をします。これの主な特徴の1つは、アクションがPOJOであるという事実です。ポジョとしてのアクションの主な任務は、データの伝達です。これは主要なデータ転送オブジェクトです。すべての名前が並んでいる場合、プロパティは着信要求データを受け取ります。データを移動し、いつデータを移動するかを考えるというタスクは、別のコンポーネントであるインターセプターに取り込まれます。
ValueStackへのデータの移動は、ほぼ排他的にインターセプターを使用して行われます。リクエストを処理するときにフレームワークが最初に行うことの1つは、新しく作成されたアクションオブジェクトを値スタックの一番上に配置することです。これにより、アクションのプロパティへのOGNLアクセスがサポートされます。次に、インターセプターはデータをバリュースタックに移動します。アクションがそこにあるため、そのプロパティは一致するセッターに関するデータを受け取ります。検証インターセプターなど、他のインターセプターも同様の方法で値スタックにデータを移動します。エラーが見つかった場合、そのエラーメッセージもスタックに送られます。
一元化されたデータコンテナであることに加えて、ValueStackはもちろんスタックです。スタックの一番上にあるプロパティがスタックの一番下にあるプロパティを隠すことができるこのスタック性は、イテレータタグなどを検討するときに役立ちます。たとえば、ユーザーのコレクションを反復処理する場合、各ユーザーはスタックの最上位に移動し、反復の本体の間そこに留まります。これにより、OGNLプロパティ参照が個々のユーザーのプロパティに順番にヒットするようになります。さらに重要なことに、同様の名前のプロパティを持つ他の何かがスタックのさらに下で見つかった場合、それは一番上のユーザーオブジェクトによって非表示になります。これを考慮して、プッシュタグを使用すると、好きなオブジェクトをスタックにプッシュできるため、独自のコンテキストを強制する必要がある場合に優れた柔軟性が得られます。