2012-04-12 4 views
6

Strutsイテレータ内のValueStackオブジェクトにアクセスするには?私は次のコードしている

<s:iterator value="reviews"> 

    <img src="<s:property value="#request.restaurant.portalImage.url" />" /> 

    <s:property value="user.firstName" /> 
    <s:property value="user.lastName" /> 
    <s:property value="rating" /> 
    <s:property value="review" /> 

</s:iterator> 

レビューは、ユーザーの評価や名前などの見直しの内容が含まれているレビュー・オブジェクトのリストです。

私の問題は、ループ内のValueStackに存在するオブジェクトにアクセスできないということです。

ループの外側<s:property value="#request.restaurant.portalImage.url" />が正しく機能します。しかし、ループ内ではnullを出力します。

AFAIKイテレータはValueStackにそのコレクションをプッシュし、すべてのOGNL式がそれに対して解決するようにします。しかし、私は#を使用しました。つまり、解決のためにルートオブジェクトを明示的に指定しています。

まだ動作しないのはなぜですか?

答えて

1

あなたは以下のようにそれを変更する必要があります。

<s:iterator value="reviews" var="varrequest"> 

    <img src="<s:property value="#varrequest.restaurant.portalImage.url" />" /> 

    <s:property value="#varrequest.user.firstName" /> 
    <s:property value="#varrequest.user.lastName" /> 
    <s:property value="#varrequest.rating" /> 
    <s:property value="#varrequest.review" /> 

</s:iterator> 

ユニークインデックスオブジェクトを取得するイテレータの参照変数を使用します。

+0

varrequestとは何ですか? –

+0

これは、アクセスするための現在のインデックスオブジェクトを保持する変数です。詳細については、このドキュメントを参照してください。 http://struts.apache.org/2.0.11/docs/iterator.html – Phani

+0

現在インデックスされているオブジェクトは、リストのレビューオブジェクトになります。私はリストの外にあるものにアクセスしたい。リクエストスコープに格納されているレストランオブジェクト。 –

1

私はそれを意味し、値スタックの一番上にオブジェクトをプッシュしますあなたはS2イテレータタグを使用してコレクションを反復処理するときに、イテレータあたりIterator.Asで使用しているコレクションに含まれているものオブジェクトわかりませんあなたは

<s:iterator value="userCollection"> 

</s:iterator> 

のように反復されている、これが繰り返されますときに我々はのnameプロパティを参照したい場合ので、S2のイテレータは値スタックの一番上にuserオブジェクトをプッシュしますあなたはユーザーオブジェクトのコレクションを持っていると言いますuserオブジェクト、名前プロパティを参照する必要があります。

<s:property name="userName"/> 

OGNLは、値スタックにuserNameを解決しようとすると、私たちはすでに値stack.Iのトップレベルのオブジェクトとしてユーザーオブジェクトを持っているので、イテレータタグのドキュメントを通過することをお勧めし、それはどのように値

+0

トップレベルオブジェクトは問題ではありません。 #は、上にあるかどうかに関係なく、解決するオブジェクトを明示的に指定するために使用されます。 –

0

は、私はそれがあなたの問題を解決すると思う

s:iterator value="reviews" status="position"> 
    <img src="<s:property value="#request.restaurant.portalImage.url"/>"/> 
    <s:property value="#position.user.firstName"/> 
    <s:property value="#position.user.lastName"/> 
    <s:property value="#position.rating"/> 
    <s:property value="#position.review"/> 
</s:iterator> 

あなたの要件は少し混乱しています

2

私はちょうど私の午後を同じような問題に対して戦って過ごしました。 私のケースでは、イテレータ変数(あなたのケースではreviews)が外部変数と同じ名前のフィールドを持っていたという問題がありました。

イテレータのローカルスタックから抜け出そうとしても、外部変数にはアクセスしませんでした。イテレータがそのは関係なく、あなたがしよういかに難しいか、外レストラン変数を上書きしないために起こってレストランと呼ばれるフィールドを持っているあなたの件の場合

:(

私は単に外側の名前を変更することがわかったソリューション変数(例:theRestaurant)。。

私はそれを名前を変更すると、それはもはや内部変数と衝突し、私はイテレータ内からアクセスすることができました

+1

ありがとう、これは多くの助けになりました!別の解決策は、タグを使用してイテレータの前にローカル変数に "外側の値"を格納し、代わりにこのローカル変数を参照することです(または$ {theRestaurant})。 – mmuller

関連する問題