3

最新バージョンで利用可能なセキュリティ修正のため、2.1.6 から 2.3.15.1 にアップグレードしました。ただし、現在、フォーム フィールドの値は Action クラスにポストされません。基本的にHashMap props、フォームが送信されると、JSP から Action クラスにデータを取り込みます。Struts のバージョンを 2.3.15.1 にアップグレードすると、これが機能しません。コードの変更はありません。setPropsコードをデバッグしたところ、メソッドが呼び出されていないことに気付きました。これはもう許されませんか。回避策はありますか?Struts ライブラリの変更を元に戻すとすぐに、すべてが完璧に機能します。助けてください。

私のコードは次のようになります。

アクション クラス:

    private Map<String, Wall> props;

    public void prepare(){
          //fill up props map here.
        }
    public String view(){
        return INPUT;
    }

    public String save(){
        myService.setProps(props);
        return INPUT;
    }

    public void setProps(Map<String, Wall> props) {
        this.props = props;
    }

    public Map<String, Wall> getProps() {
        return props;
    }

JSP :

<s:iterator value="props.entrySet()" id="prop" status="propStatus">
    <s:textfield name="props['%{#prop.key}'].value" value="%{#prop.value.value}" />
</s:iterator>
4

2 に答える 2

1

解決しました。新しい Struts バージョンでは、パラメーター名がより制限されています。私の場合、 などのパラメーター名がありましprops['1.2.3'], props['a.b.c'] or props['a-b-c']た。これらは、新しいストラットによって除外されました。これを説明するリンクは次のとおりです: http://struts.apache.org/development/2.x/docs/s2-009.html。最後の部分では、コレクションが機能しなくなる理由を説明しています。

インターセプタースタックのacceptParamNamesをに変更し<param name="acceptParamNames">\w+((\.\w+)|(\[\d+\])|(\['\w+(\-\w+)*'\]))*</param>、問題を解決しました。プロパティ名をprops['a.b.c']削除したので、上記の正規表現ではカバーされませんが、props['a-b-c'].

私を助けてくれた@Roman Cに感謝します。

于 2013-08-08T07:25:07.553 に答える
1

Struts 2.1.6 から大きな変更がありました。明示的に指示しない限り、Struts 2 はオブジェクトを作成しません。インターセプターがアクションに設定する前にprepareメソッドが呼び出され、マップにデータを入力するとコメントしました paramsprops

// props マップをここに記入します。

当然のことながら、Struts はその setter を呼び出しませんsetProps。これは、マップ インスタンスが既に含まれているためです。したがって、単純に を呼び出しますgetProps。次に、インデックス付きのプロパティ値をマップに設定する必要があります。しかし、変換先のコレクションの要素であるオブジェクトの型を認識していませんnull。フィールドに注釈を付けることで、props送信時にマップに入力する問題を解決する必要があります。

@Element(value = Wall.class)
@CreateIfNull(value = true)
private Map<String, Wall> props = new HashMap<>();

キーは自動的に決定されると思います。で指定すると同じことができます。Action-conversion.properties

Element_props=Wall
CreateIfNull_props=true

次に、JSP を次のように置き換えることができます

<s:iterator value="props">
    <s:textfield name="props['%{key}'].value" />
</s:iterator>

最後に、Wall投稿していないクラスは次のようになります

public class Wall {
  String value;
  //getter and setter here
} 
于 2013-08-03T08:04:24.300 に答える