0

次のコードを検討してください。

public class SampleAction {
  private  String[] sampleArray1 = new String[]{"item1","item2","item3"};
  private  String[] sampleArray2 = new String[]{"a","b","c"};
  private List lst = new ArrayList();
  lst.add(1)
  lst.add(2)
  //Getters and setters
}

ここで、JSPでアクセスしようとすると、上記の属性のどれが値スタックに含まれますか?通常のスタックのように機能しますか?つまり、読み取った属性をプッシュし続けますか?

4

2 に答える 2

7

あなたはこれを混乱させていると思います。Struts2がスタックに置くのはプロパティではなく、それらのプロパティを保持するオブジェクトです。

あなたのjspであなたが書いたとしましょう

 <s:property value="xxx" />

次に、Struts2はスタック内で反復処理を行い、プロパティを持つオブジェクトxxx、つまりパブリックメソッドを持つクラスを見つけますgetXxx()。また、Struts2は、現在のアクション(のインスタンスSampleAction)をスタックの一番上に配置します。したがって、最初にSampleAction.getXxx()メソッドを検索します。見つからない場合は、スタックをさらに下に検索します。(実際には、他のオブジェクトをスタックのアクションの上に置くことができます-おそらく同じjps-ですが、シンプルに保つことができます)。

次に、あなたの例では、すべてsampleArray1 sampleArray2 lst(パブリックゲッターがある場合)がjspでアクセス可能になります。しかし、それsampleArray1は「スタック内」ではなく(その要素はさらに少ないです!)、アクションはスタック内にあります。

したがって、たとえば、次のように書くことができます。

<s:iterator value="sampleArray1">
  <p>item is: <s:property/></p>
</s:iterator>

ここで、最初の行で、sampleArray1プロパティはアクション、つまりスタックにあります。iteratorタグは、sampleArray1内の各値を値スタックの最上位に配置します。これは2行目で取得され、出力されます。

于 2011-04-15T15:35:19.220 に答える
1

バリュースタック

値スタックは、重要なオブジェクトを格納するためにStruts-2によって使用されます。ActionInstanceとメンバー変数は値スタックに格納され、JSPは値スタックを介してそれにアクセスできます。

注:値スタックは仮想オブジェクトとして動作します。

2つのメンバー変数の名前が同じ場合、値スタックは競合をどのように処理しますか? 値スタックは、メンバー変数の要求を受信し、メンバー変数名が一致する場合は最初から最後まで検索し、値をJSPに送信します。アクセスする特定のメンバー変数については、オブジェクトグラフにアクセスまたはトラバースする必要があります。

于 2017-10-02T09:31:39.100 に答える