0

スタック オーバーフローの皆さん、こんにちは。最近、Struts アプリケーションで問題が発生しました。一部のBean値を正しく表示するjspがあります(コードの関連部分のみを貼り付け、極端に単純化しました):

<table>
    <logic:iterate name="bean" property="list1" id="listItem">
    <tr>
        <td>
            <html:checkbox name="listItem" property="selected">
            </html:checkbox>
        </td>
    </logic:iterate>
</table>

私の Bean には、getter と setter を持つ list1 プロパティがあります

private List<RandomObject> list1;

public List getList1() {
    return list1;
    }


public void setList1(List list1) {
    this.list1=list1;
    }

私のサブビーンには選択されたプロパティがあります:

private boolean selected;
public boolean isSelected() {
    return selected;
}

public void setSelected(boolean selected) {
    this.selected = selected;
}

ここで、この JSP を入力すると、正しい値が取得されます。つまり、DB 内のマップされたオブジェクトが selected=true の場合、チェックボックスがオンになっています。私が得られないのは、このフォームで行った変更を保存する方法です。送信すると、すべての変更が失われます。送信にリンクされた StrutsAction をデバッグで入力すると、取得した ActionForm はすべての興味深い値を既に失っているため、これは純粋な Struts 関連です。また、保持したい値がメインBeanに直接保存されているのではなく、サブBeanのプロパティであるという事実に関係しているように感じます。同じページには他にもたくさんあるからです問題なく保存できるメイン Bean のプロパティ。

私は何を取りこぼしたか ?

4

2 に答える 2

0

nameレンダリングされた HTML で間違った属性を宣言している可能性があります。ページの生成されたソース コードを見ると、おそらく次のようになります。

<input type="checkbox" name="selected" ...>

selectedフォーム Bean クラスでフィールドを検索します。

フォーム Bean のフィールドであるコレクションを使用している場合は、 `タグではなく<nested:form><nested:iterate>および<nested:checkboxStruts タグを使用する必要があります。<html:form>,andしたがって、次のようになります。

<nested:form action="foo">
...

    <nested:iterate property="list1" id="listItem">
    <tr>
        <td>
            <nested:checkbox property="selected">
            </nested:checkbox>
        </td>
    </tr>
    </nested:iterate>

...
</nested:form>

Struts タグから属性を削除したことに注意してください。これらのname属性は必要ないためです (私の経験では、実際にはあらゆる種類の問題を引き起こします。<nested:*>タグを使用する場合は、属性を使用しないでくださいname)。入れ子のレベルの場合、フォーム Bean 自体であるため、フォーム Bean でプロパティ<nested:iterate>を検索する必要があることがわかります。list1

そのタグは独自のネスト レベルを作成するため、反復で現在の要素<nested:checkboxのプロパティを探す必要があることがわかります。selected

レンダリングされた HTML は次のようになります (最初の要素の場合)。

<input type="checkbox" name="list1[0].selected" ...>

これは、フォーム Beanselectedのフィールドによって参照されるコレクション内の最初の要素 (インデックス 0)のフィールドを意味します。list1

そしてもちろん、リクエスト スコープのフォーム Bean ではなく、セッション スコープのフォーム Bean を使用していることを確認する必要があります。

于 2014-02-05T13:32:43.720 に答える
0

私の場合、名前属性を繰り返しに入れる必要がありました。そうしないと、エラーが発生します(どのBeanにもプロパティが見つかりません...)

属性名をチェックボックスに削除することを解決しました。フォームに接続されていないページスコープで新しいオブジェクトを作成しているようです。

これは私のコードです:

<nested:iterate id="apertura" type="it.puglia.innova.view.actionform.AperturaForm" indexId="index"  name="strutturaRuraleForm"  property="listAperturaForm">
     <nested:checkbox styleId="checkbox_${index}" property="flagContinuato" onchange="changeOrarioContinuato(${index})"/>

それだけです :-) html:form をネストされたものに変更する必要もありませんでした。

さよなら

于 2014-05-22T09:32:28.590 に答える