2012-01-19 22 views
0

私は、コードを次しているpexistingプロジェクトのJSPファイルの1 1.2.In支柱の上に働いているのに、私は2ストラットに新しいです:ストラット2のバリュースタックに関するいくつかの基本的なクエリ?

<script type="text/javascript"> 
    var relationshipData = { // line1 
    page : '<s:property value="displayPage" />', // line2 
    records : '<s:property value="customerRelations.size" />', // line3 
    rows : [ <s:iterator value="customerRelations" status="iterStatus"> // line4 
     { id : '<s:property value="relationId" />', 
     cell : [ '<s:property value="relationDesc" escapeJavaScript="true" />' ] } <s:if test="!#iterStatus.last">,</s:if> //line5 
     </s:iterator>] // line6 
    }; 
</script> 

要求が法getCustomerRelations()getRelationId()を有しているCustomerRelationAction.javaが来ています。

はここに質問です: -

  1. 私は流れが、このメソッド内で4時間を来ている参照.I方法getCustomerRelations()内のブレークポイントを置きます。行3で2回、行4で2回。 私の理解によると、フローは3行目で1回だけになるはずです。3行目のgetCustomerRelationsを完了したら、その値を値スタックに入れないでください。 それが次に参照されることを参照してください(それは再び14行目でrefferedされています)?

  2. getCustomerRelations()方法は、CustomerRelationDataクラスはまた、我々がどのオブジェクト上行5で値= "relationIdを参照のうえれる線 5にgetRelationId() method.Nowが含まCustomerRelationDataオブジェクトのリストを返す(CustomerRelationAction.java又はCustomerRelationData)、getRelationId ? でもリストオブジェクトCustomerRelationDataが値のスタックに存在するかどうかわからないのですか?はいの場合は、値のスタックに入れられますか?

  3. ここでイテレータはそれから、コード<s:property value="relationId" />をもう一度参照して、どのオブジェクト(CustomerRelationA ction.javaまたはCustomerRelationData)、 getRelationId()メソッドが呼び出されますか?

答えて

2

1)あなたがcustomerRelationsの財産を呼びかけ、その後イテレータタグにcustomerRelationsを使用すると、一度だけgetCustomerRelations()を呼び出すと思う理由を私は知りません。 2回使用しているので、少なくとも2回呼び出されます。

参照を保持する場合は、<s:set>を使用してコレクションへの新しい参照を作成します。しかし、あなたのゲッターが何か時間を費やしていない限り、そうすることについてのポイントはありません。

同じ現象はありません。質問の<script>スニペットを考えると、それは以下のようなものをレンダリングする(サンプルデータと、3要素のリストダミーを想定):

2012-01-19 13:58:10,552 DEBUG [TextExampleAction.java:18] : Enter. 
2012-01-19 13:58:10,571 DEBUG [TextExampleAction.java:18] : Enter. 

<script type="text/javascript"> 
    var relationshipData = { // line1 
    records : '3', // line3 
    rows : [ // line4 
     { id : '1', 
     cell : [ 'desc 1' ] } , //line5 
     // line4 
     { id : '2', 
     cell : [ 'desc 2' ] } , //line5 
     // line4 
     { id : '3', 
     cell : [ 'desc 3' ] } //line5 
     ] // line6 
    }; 
</script> 

とゲッターにデバッグ文を使用してログ出力することは、これです

私はJSP/JS /などを信じる可能性が高いです。この時点で。

2)イテレータタグは、tag docsで説明されているように、各オブジェクトをスタックの先頭に配置します。スタックの先頭は、relationIdの値を取得するために使用される最初のオブジェクトです。スタックトップに見つからなければ、OGNLはそのプロパティが見つかるか、スタックがなくなるまでバリュースタックをたどります。

3)前回の回答を参照してください。いったんイテレータを終了すると、スタック上に顧客関係はなくなり、アクションに戻ります。

+0

あなたの答えと忍耐力をお寄せいただきありがとうございます。あなたが言ったように、iteratorタグは各オブジェクトをスタックの最上部に置きます。 s:propertyタグは、取り出したオブジェクトをvalue stackに入れます( ''タグはdisplayPageの値をvalueスタックに入れます)?デバッガモードでの私の見解によると、そうではありませんでした。 –

+0

@Mach:propertyタグはvaluestack.iniの値をフェッチします。イテレータの場合は、値スタックの上にオブジェクトをプッシュして、同じものをページ内で取得できるようにします –

関連する問題