1

私のjspページには、フォームを送信した後、隠しタグを使用してArrayListデータのサイズをVector testVectorに割り当てようとするフォーム(struts2)がありますが、それでもtestVectorのサイズは0に等しくなります。

<s:hidden name="testVector.size" value="%{data.size}" />

Action クラスで data と testVector のセッターとゲッターを作成しました。

private Vector<String> testVector = new Vector<String>();
private ArrayList<String> data = new ArrayList<String>();
private String testName; // a field for testing the form. 

// getters and setters of testVector and data

VectorにはパブリックセッターsetSize(int size)があるため、これが機能するはずだと思いました。他のフィールド「testName」については、うまく送信されました..構文に問題がありますか?

本当にありがとうございました。

4

1 に答える 1

1

ベクターを使用しないでください。OGNL は、セキュリティ上の理由から、JSP をレンダリングするときと同じようにリクエストからは機能しないことに注意してください。単に強力すぎるだけです。Bean プロパティ、コレクション、配列、および組み込み型をリクエストから設定するだけです (型コンバーターは無視されます)。

この場合のリクエストから、ベクトルに値を入れようとしていると考えられます。新しい文字列を作成してベクターに入れ、文字列のサイズを設定しようとすると思います(そのメソッドが存在しないため、機能しません)。

これを確認するために、あなたが言っていることを実行しようとしましたが、ログには次のように記載されています。

WARNING: Error setting expression 'testVector.size' with value '[Ljava.lang.String;@5c7b2d2f'
ognl.OgnlException: Error converting given String values for Collection. [ognl.NoSuchPropertyException: java.lang.String.size] 

この動作が必要な場合は、アクション内に setSize() などの 2 番目のメソッドを作成してから、ベクトル サイズを変更する必要があります。これを外の世界に公開するのはあまり良いことではないと思います。誰かがあなたのアクションを何度も呼び出して膨大な数を渡したらどうしますか?

于 2012-09-03T06:40:48.310 に答える