0

私はstruts 1.2に取り組んできましたが、strut 2は初めてです。既存のプロジェクトjspファイルの1つに、次のコードがあります。

<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>

CustomerRelationAction.javaメソッドgetCustomerRelations()とを持つリクエストが来ていgetRelationId()ます。

ここに質問があります:-

  1. メソッド内にブレークポイントを配置getCustomerRelations()しました。このメソッド内でフローが 4 回来ていることがわかります。行 3 で 2 回、行 4 で別の 2 回。それは次に参照されますか (14 行目で再び参照されているように)?

  2. getCustomerRelations()メソッドは、クラスにもメソッドが含まれているCustomerRelationDataオブジェクトのリストを返します。5 行目で、5 行目で value="relationId を参照しています。どのオブジェクト (CustomerRelationAction.java または CustomerRelationData) で、getRelationId() メソッドが呼び出されますか?リスト オブジェクト CustomerRelationData が値スタックに存在するかどうかわからない?存在する場合、どの行に値スタックに配置されるか?CustomerRelationDatagetRelationId()

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

4

1 に答える 1

2

1)のプロパティを呼び出してからiterator タグでcustomerRelations使用すると、一度しか呼び出されないと思う理由がわかりません。2 回使用しているため、少なくとも 2 回呼び出されます。customerRelationsgetCustomerRelations()

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

同じ動作は見られません。質問の<script>スニペットが与えられると、次のようにレンダリングされます (サンプル データを含むダミーの 3 要素リストを想定):

<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>

getter に debug ステートメントを含むログ出力は次のとおりです。

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

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

2) iterator タグは、タグ docsで説明されているように、各オブジェクトをスタックの一番上に置きます。スタックの一番上は、 の値を取得するために使用される最初のオブジェクトですrelationId。スタックの一番上に見つからない場合、OGNL は、プロパティが見つかるかスタックがなくなるまで値スタックをトラバースします。

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

于 2012-01-19T19:01:58.093 に答える