web-dev-qa-db-ja.com

Strutsタグの#記号、%記号、および$記号の違いは何ですか?

私はStruts2で作業しており、値スタック変数にアクセスしているとき、%または#または$を使用するかどうかわかりません。正しいものが見つかるまで、すべて試してみます。

誰でもこれらの違いを説明できますか?

69
Khashayar

#(シャープ記号)の使用

OGNLは、次のようにActionContextのオブジェクトを参照するために使用されます。

  • objectName:ValueStackのオブジェクト(OGNLコンテキストのデフォルト/ルートオブジェクト)(Actionプロパティなど)
  • #objectName:ActionContext内のオブジェクト、ただしValueStackの外部、具体的には...
    • #objectName:デフォルトのアクションスコープでStruts2データタグを使用して作成されたActionContextオブジェクト(たとえば、<s:set name="foo" value="'Testing'" />で参照される<s:property value="#foo" />
    • #parameters.objectName:要求パラメーター
    • #request.objectName:要求スコープ属性
    • #session.objectName:セッションスコープの属性
    • #application.objectName:アプリケーションスコープの属性
    • #attr.objectName:ページ、リクエスト、セッション、またはアプリケーションスコープの属性(この順序で検索)

上記のスコープマップ参照(パラメーター、要求、セッション、およびアプリケーション)は、次の2つの方法のいずれかで作成できます。

  • #scopeName.objectNameまたは
  • #scopeName['objectName']

%(パーセント記号)の使用

%{ OGNL expression }は、通常文字列リテラルとして解釈される属性のOGNL評価を強制するために使用されます。

例:<s:property value="myProperty" default="%{myDynamicDefaultValue}" />

@(アットマーク)の使用

@記号は、静的なプロパティとメソッドへの参照を作成するために使用されます。 Struts2プロパティでこれを有効にする必要がある場合があることに注意してください:struts.ognl.allowStaticMethodAccess=true

例:

@my.package.ClassName@MY_STATIC_PROPERTY
@my.package.ClassName@myStaticMethod

$(ドル記号)の使用

Struts2 OGNLは、ドル記号を特別に使用しません。ただし、通常のJSTL式の評価には使用できます。例えば:

Struts2:<h1><s:property value="#pageTitle" /></h1>
(...と同等)
JSTL:<h1>${pageTitle}</h1>

108
Devon Biere

フレームワークは、標準の命名コンテキストを使用してOGNL式を評価します。 OGNLを処理する最上位のオブジェクトはマップです(通常、コンテキストマップまたはコンテキストと呼ばれます)。 OGNLには、コンテキスト内にルート(またはデフォルト)オブジェクトがあるという概念があります。式では、ルートオブジェクトのプロパティは、特別な「マーカー」概念なしで参照できます。他のオブジェクトへの参照には、ポンド記号(#)が付いています。

フレームワークは、OGNLコンテキストをActionContextに設定し、値スタックをOGNLルートオブジェクトに設定します。 (値スタックは複数のオブジェクトのセットですが、OGNLからは単一のオブジェクトのように見えます。)フレームワークは、値スタックとともに、アプリケーション、セッション、リクエストコンテキストを表すマップなど、他のオブジェクトをActionContextに配置します。これらのオブジェクトは、値スタック(私たちのOGNLルート)とともに、ActionContextに共存します。

                 |
                 |--application
                 |
                 |--session
   context map---|
                 |--value stack(root)
                 |
                 |--request
                 |
                 |--parameters
                 |
                 |--attr (searches page, request, session, then application scopes)

詳細はこちらをご覧ください

OGNL基準

基本的に、struts2はオブジェクト値Stackを最上位オブジェクトとして配置し、OGNLを使用してそれらを参照します。ルートオブジェクトは、特別な「マーカー」または%一方、他のオブジェクトへの参照にはポンド記号(#)が付いています。 #は基本的に、アプリケーション/セッションなどからオブジェクト/値を参照するために使用されます。

10
Umesh Awasthi

@Devon Biereを完了するためだけに...

$(ドル記号)の使用

リソースファイルでも${}を使用できます。ストラットは${}を解析するためにOGNLを自動的に使用します。例えば

sample.foo.bar=This is some ${someProperty} //If the someProperty is in valueStack
sample.welcome.message=Welcome dear ${#session.CurrentUser.farsiFirstName}

ここの$記号は、OGNLに対して文字列を評価するようにStrutsに要求する単なるトリガーであることに注意してください。JSTLの${}と混同しないでください。

OGNLを使用したStruts 2の動的メッセージ

0
Alireza Fattahi