ActionContext、ValueStack、OGNL
1697 ワード
もっと読む
ここではstruts 2のいくつかのコアのコンポーネントActionContext、ValueStack、OGLL式について簡単に説明します.
1、ActionContext
struts 2フレームワークがHTTP要求を受信すると、すぐにActionContext、Value Stack、Actionオブジェクトが作成されます.
ActionContextには、valueStack、parameters、request、session、アプリケーション、attrの6つのオブジェクトがあります
OGLL式では、ActionContextの1つのオブジェクトをルートオブジェクト(root)として選択する必要があります.デフォルトでは、valueStackをルートオブジェクトとして選択し、他の5つのオブジェクトをルートオブジェクトとして使用する必要がある場合は、#接頭辞を付ける必要があります.
たとえば:
接頭辞を付けない場合、デフォルトではvalueStackがルートオブジェクトとして使用されます.これも最も一般的な状況です.すなわち、xxxに相当するvalueStack.xxxです.
2、Value Stack(値スタック)
ValueStackには多くのオブジェクトを格納できます.その1つの特性は、自分が持っているオブジェクトの属性を自分の属性と見なすことができる仮想オブジェクトです.
たとえば、ValueStackにはActionオブジェクトがあり、Actionオブジェクトにはnameフィールドがあります.OGLL式でnameの値をとる場合、${action.name}は不要ですが、直接${name}
ValueStackはスタックのデータ構造(FILO)であり、最後に値スタックのオブジェクトに入り、常にValueStackのスタックトップにある.この結論は重要である.スタックトップの要素の値は、スタックベースの同名要素の値を上書きするからである.
たとえば、ValueStackのスタックの底にはActionオブジェクトがあり、nameフィールドがあります.スタックトップはModelオブジェクトであり、nameフィールドも持っている場合、${name}を使用して、常にModelオブジェクトのnameフィールドが取り出され、Actionオブジェクトのnameフィールドは表示されません.
3、OGLL式
これは2つのシーンに分けることができて、1つはラベルの属性の中で(例えば)、1つはjspページの他の場所で
ラベルのプロパティでは、このプロパティ定義のタイプが何なのかを見て、stringタイプであれば、プロパティの値は普通のstringとして扱われ、stringタイプでなければ、プロパティの値はOGLLの式として直接扱われます.
例えば、このラベルのvalue属性のタイプがobjectである場合、このvalueの値は、直接OGLNL式として解析されます
stringタイプのプロパティでOGLL式を使用するには、${}または%{}を追加する必要があります.
jspページの他の場所で(つまりラベルの内部にない)場合は、いずれの場合もstringとして処理されますが、OGLL式を使用するには${}または%{}を付ける必要があります.
4、${}と%{}の違いについて
ドキュメントの説明によると、OGLL式は%{}で表すべきです.しかし、私は実際のアプリケーションでは、ラベルはほとんど使用されず、${}で値を取っています.何の不適切も見つかりません.バージョンの原因かどうか分かりません.
ここではstruts 2のいくつかのコアのコンポーネントActionContext、ValueStack、OGLL式について簡単に説明します.
1、ActionContext
struts 2フレームワークがHTTP要求を受信すると、すぐにActionContext、Value Stack、Actionオブジェクトが作成されます.
ActionContextには、valueStack、parameters、request、session、アプリケーション、attrの6つのオブジェクトがあります
OGLL式では、ActionContextの1つのオブジェクトをルートオブジェクト(root)として選択する必要があります.デフォルトでは、valueStackをルートオブジェクトとして選択し、他の5つのオブジェクトをルートオブジェクトとして使用する必要がある場合は、#接頭辞を付ける必要があります.
たとえば:
接頭辞を付けない場合、デフォルトではvalueStackがルートオブジェクトとして使用されます.これも最も一般的な状況です.すなわち、xxxに相当するvalueStack.xxxです.
2、Value Stack(値スタック)
ValueStackには多くのオブジェクトを格納できます.その1つの特性は、自分が持っているオブジェクトの属性を自分の属性と見なすことができる仮想オブジェクトです.
たとえば、ValueStackにはActionオブジェクトがあり、Actionオブジェクトにはnameフィールドがあります.OGLL式でnameの値をとる場合、${action.name}は不要ですが、直接${name}
ValueStackはスタックのデータ構造(FILO)であり、最後に値スタックのオブジェクトに入り、常にValueStackのスタックトップにある.この結論は重要である.スタックトップの要素の値は、スタックベースの同名要素の値を上書きするからである.
たとえば、ValueStackのスタックの底にはActionオブジェクトがあり、nameフィールドがあります.スタックトップはModelオブジェクトであり、nameフィールドも持っている場合、${name}を使用して、常にModelオブジェクトのnameフィールドが取り出され、Actionオブジェクトのnameフィールドは表示されません.
3、OGLL式
これは2つのシーンに分けることができて、1つはラベルの属性の中で(例えば)、1つはjspページの他の場所で
ラベルのプロパティでは、このプロパティ定義のタイプが何なのかを見て、stringタイプであれば、プロパティの値は普通のstringとして扱われ、stringタイプでなければ、プロパティの値はOGLLの式として直接扱われます.
例えば、このラベルのvalue属性のタイプがobjectである場合、このvalueの値は、直接OGLNL式として解析されます
stringタイプのプロパティでOGLL式を使用するには、${}または%{}を追加する必要があります.
jspページの他の場所で(つまりラベルの内部にない)場合は、いずれの場合もstringとして処理されますが、OGLL式を使用するには${}または%{}を付ける必要があります.
4、${}と%{}の違いについて
ドキュメントの説明によると、OGLL式は%{}で表すべきです.しかし、私は実際のアプリケーションでは、ラベルはほとんど使用されず、${}で値を取っています.何の不適切も見つかりません.バージョンの原因かどうか分かりません.