2009-03-12 10 views
2

それについてあまり考えずにsimpleformcontrollerに豆のリストへの結合に対処するための最良の方法は、私は次のようなものを行ってきましたデータベース呼び出し

2の結果)私のコマンドオブジェクト

3にそのリストを置く)は、ユーザーがアウトデータを抽出)SomeBeans

4の属性を変更することができ、そのコマンドオブジェクトに基づいてフォームを作成します送信後のコマンドオブジェクトと私のデータベースに更新データを書き込む

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

<form:form> 
    <c:forEach var="bean" items="${beans}" varStatus="status"> 
     <form:checkbox path="beans[${status.index}].someBooleanProperty" />${bean.name} <br>  
    </c:forEach> 
</form:form> 

コードが正常に動作しますが、それはちょうど夜が明けています:

public class UpdateThingsinListController extends SimpleFormController { 

    protected Object formBackingObject(final HttpServletRequest request) 
      throws Exception { 

    List<SomeBean> beans = database.getBeans(); 

    Command comamnd = new UpdateThingsCommand() 
    command.setList(beans); 

    return command; 

    } 

    protected ModelAndView onSubmit(final HttpServletRequest request, 
      final HttpServletResponse response, final Object commandArg, 
      final BindException errors) throws Exception { 

    database.setBeans(commandArg.getList());   

    } 


} 

を私のJSPは次のよ​​うにsomthethingに見えます私の "豆"リストは2回作成されています(セッションフォームは私の場合はfalseでなければなりません)。 2番目の作成時に何か変更があった場合(Beanが見つからない場合、結果の順序が変わる)、バインドが乱れてしまい、解雇されます。コマンドオブジェクトをフォーム提出とマージする必要があるバインディングスキームは非常に危険であると私は考え始めています。

私の質問は、 - フォーム提出がリストに正しくバインドされることをどうやって確認するのですか?リストの索引以外にもこれを行う別の方法はありますか?オブジェクトIDは多分でしょうか?

おかげで、

-Morgan

+0

私は、リストの代わりにMapを使用するべきだと考えているので、チェックボックスのタグは次のようになります: morgancodes

答えて

0

リストを取得するたびに常に同じリストに依存することができない場合は、別のコレクション、つまりマップを使用する必要があります。

もう1つの方法は、リストをどこかにキャッシュすることです。おそらくあなたのdatabase.getBeansメソッドの周りのいくつかのAOP。

0

は簡単な方法は、まず、データベースからすべての既存のSomeBeansを削除し、提出にバインドされたものを作成することです。

もっと洗練された方法は、隠されたフォームフィールドにSomeBeanの一意の識別子を入れることかもしれません。

2

sessionFormがfalseに設定されている場合、送信中にformBackingObjectメソッドでコマンドが再作成されます。 onSubmitメソッドのリストの順序は、ページ上のバインドされたオブジェクトの順序とまったく同じです。