2

春に複数選択リストをバインドしています。アイテムはDAOからデータを取得せず、データは別の選択オプションリストから追加されます。ユーザーがボタンをクリックすると、jquery を使用してデータが複数選択オプション リストに送信されます。

フォームが投稿されたときに、アイテムのデータバインディングは複雑なデータ型であるため発生しません。そのため、CustomEditor を登録して @initbinder にアタッチしました。

編集済みCollectionEditorが市民のリストをビューに返す コードを更新しましたが、リスト内のデータを取得して選択オプションを埋めることができません。リストに要素を追加しようとしていますが、サーバーから戻ったときに jsp が引き続き null を選択します。

以下はコードです:

CustomCollectionEditor

@InitBinder("crime")    
    protected void initBinder(WebDataBinder binder, HttpServletRequest request, ServletRequestDataBinder victimbinder){
     victimbinder.registerCustomEditor(List.class, "victims", new CustomCollectionEditor(List.class){
         protected Object convertElement(Object element){

             Citizens victims = new Citizens();

             String ssNumber = "";

             if (element instanceof String){
                ssNumber = (String) element;

             }                      

             logger.debug("element is ;" +element);

             try {

                int socialSecurityNumber = Integer.parseInt(ssNumber);
                victims = citizenManager.getCitizen(socialSecurityNumber);

            } catch (NumberFormatException e) {                     
                logger.error(e.getMessage());
            } catch (Exception e) {
                logger.error(e.getMessage());
            }

             return victims;        
         }

    }); 

DAO からコントローラーに入力された Jsp

これには、ボタンがクリックされたときにDAOクラスからデータが入力されたデータが含まれ、リストからデータが取得され、POJOにバインドされている他のリストに追加されます

<label>Victims List</label><buttonid="addVictimBtn">/button>
<form:select path="" id="dbvictims" title="Victims Of Crime" class="victimLst">
<form:options items="${dbvictims.dbvictimList}" itemValue="socialSecurityNumber" itemLabel="name"/>
</form:select>  

POJOにバインドされたJsp選択項目

<label>Victims In Crime</label><button id="removeVictimBtn">-</button> 
<form:select path="victims" id="victims" title="Victims Of Crime"  multiple="multiple" class="victimLst">
<form:options items="${victimList}" itemValue="socialSecurityNumber" itemLabel="name"/>
</form:select><form:errors path="victims" class="errors" />                            
4

1 に答える 1

2

この問題の解決策は非常に簡単で、すべての作業はCustomCollectionEditorで既に行われています。これは、上記のような複雑なデータ型をバインドする場合に重要です。これを行うには他のアプローチがあるかもしれませんが、これは非常にクリーンでシンプルなアプローチだと思います。

return ステートメントは、ビュー内の要素の item 属性にバインドされるため、非常に重要です。CustomCollectionEditorはオブジェクトのリストを返します (犠牲者) DAOを使用すると、データベースからオブジェクトが取得されます。ポストはラベルではなく選択値のみを送信するため、これは重要です。したがって、リストを再構築してビューに再送信します。

私が省略したこの部分は、List オブジェクトをコントローラーからビューに戻すことでした。

コントローラ

@RequestMapping(value="save.htm", method = RequestMethod.POST)
    public ModelAndView handleSave(@Valid @ModelAttribute Crime crime, 
    BindingResult result,
    ModelMap m,
    Model model) throws Exception {


    if(result.hasErrors()){
           model.addAttribute("victimList",crime.getVictims());

    return new ModelAndView("*Your View*");
...............
于 2013-04-03T02:13:00.500 に答える