5

このパラメーターを Struts アクションに送信しています

cdata[1]=バー

私の行動では、インデックスと値に興味があります。OGNLCDATAのドキュメントが示唆するように、ゲッター/セッターのペアを定義しました:

public void setCdata(int index, String value){
    LOG.info("setData; key="+ key +"; value="+ value);
    // store index and value;
}

public String getCdata(int index){
    return null; // don't really need a setter
}

これは私が得る例外です:

2013-04-29 15:38:49,792 [http-apr-8080-exec-3] WARN  com.opensymphony.xwork2.util.logging.commons.CommonsLogger.warn(CommonsLogger.java:60) - Error setting expression 'cdata[1]' with value '[Ljava.
lang.String;@4223d2a4'
ognl.OgnlException: target is null for setProperty(null, "1", [Ljava.lang.String;@4223d2a4)
        at ognl.OgnlRuntime.setProperty(OgnlRuntime.java:2309)
        at ognl.ASTProperty.setValueBody(ASTProperty.java:127)
        at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:220)
        at ognl.SimpleNode.setValue(SimpleNode.java:301)
        at ognl.ASTChain.setValueBody(ASTChain.java:227)
        at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:220)
        at ognl.SimpleNode.setValue(SimpleNode.java:301)
        at ognl.Ognl.setValue(Ognl.java:737)
        ...

パブリック メンバー変数を定義するString[] cdata = new String[1000]と、ログに例外は表示されませんが、セッターも呼び出されません。メンバー変数がプライベートの場合、別の例外が再び発生します。

4

3 に答える 3

2

次のセットアップを使用します

List<String> cdata = new ArrayList<String>();

public List<String> getCdata() {
   return cdata;
}

public void setCdata(final List<String> cdata) {
    if (cdata == null) {
        this.cdata = new ArrayList<String>();
    } else {
        this.cdata = cdata;
    }
}

cdata[1]=value などのように JSP から値を送信します

唯一の要件は、ゲッター/セッターを持つことです。Java 1.6 で動作するこの Tomcat7 をテストしました。同様に cdata[0]、cdata[1] のような値を送信できます

または、マップを使用できます

private Map<String, String> data = new HashMap<String, String>();

public Map<String, String> getData() {
    return data;
}

public void setData(Map<String, String> data) {
    this.data = data;
}

JSPは持つことができます

<s:form action="indexProperty">

    <h3>Test The Map</h3>
    <input type="text" name="data['0']"/>
    <input type="text" name="data['1']"/>

    <s:iterator value="data.entrySet()" var="aData">
        <s:property value="#aData.key" />-<s:property value="#aData.value" />
    </s:iterator>

    <input type="submit" name="submit" value="submit"/>
</s:form>

問題なく入力されます

于 2013-04-30T11:35:52.513 に答える
1

私の解決策(むしろ醜いハック):

アクションクラスを実装ServletRequestAwareし、アクションで からパラメーターマップを反復処理し、そこからcdataHttpServletRequestをフェッチし、インデックスと値を解析します

送信されたパラメーターを変更してエンコードする必要がありました。配列フィールドのストラットのcdata[999]=foobarようcdata_999_=foobarに見える場合、アクションクラスにセッター/ゲッターが必要なためです。

于 2013-04-30T16:33:18.067 に答える
0

ドキュメントによると、OGNL は JavaBeans のプロパティのインデックス作成をサポートしています: OGNL リファレンス ガイド:

JavaBeans は、インデックス付きプロパティの概念をサポートしています。具体的には、オブジェクトが次のパターンに従う一連のメソッドを持っていることを意味します。

public PropertyType[] getPropertyName();
public void setPropertyName(PropertyType[] anArray);
public PropertyType getPropertyName(int index);
public void setPropertyName(int index, PropertyType value);

これらのメソッドのすべてを実装したわけではありません。また、配列を初期化していない場合、値を設定できませんでした。

インデックス付きプロパティの詳細については、こちらをご覧ください。

インデックス付きプロパティ

インデックス付きプロパティは、単一の値ではなく配列です。この場合、Bean クラスは、配列全体を取得および設定するためのメソッドを提供します。int[]と呼ばれるプロパティの例を次に示しtestGradesます。

public int[] getTestGrades() {
    return mTestGrades;
}

public void setTestGrades(int[] tg) {
    mTestGrades = tg;
}

インデックス付きプロパティの場合、Bean クラスは、配列の特定の要素を取得および設定するためのメソッドも提供します。

public int getTestGrades(int index) {
    return mTestGrades[index];
}

public void setTestGrades(int index, int grade) {
    mTestGrades[index] = grade;
}
于 2013-04-29T18:53:21.583 に答える