2

私のフォームには1つと1つtext fieldがあります.dropdown list私のフォームが最初に読み込まれるとlist of values in the dropdown list.

を送信していてform、フォームに が含まれている場合errors、同じフォームを返してエラーを表示し、欠落したデータを再送信しようとしています。

しかし 、 の方法でフォームreloadsを作成すると、ドロップダウン リストに値がありません。POSTcontroller

私のスプリングコントローラー

@Controller
public class FormController {

    private ListStore getList;

    @RequestMapping(value="/ApplicationForm.html",method=RequestMethod.GET)
    public String displayForm(@ModelAttribute UserData userData,ModelMap map){

        map.addAttribute("age",(ArrayList<String>)getList.ageList());
        return "ApplicationForm";
    }

    @RequestMapping(value="/ApplicaitonForm.html",method=RequestMethod.POST)
    public String displayFormDetails(@Valid UserData data,BindingResult result,ModelMap map,@RequestParam(value="name",required=true) String name,@RequestParam("age") String age){

        if(result.hasErrors()){
            System.out.println("It has some errors !!!!!!!!");
            return "ApplicationForm";
        }
        map.addAttribute("name", name);
        map.addAttribute("age", age);

        return "DisplayFormDetails";
    }
}

私のListStoreクラスは、

public class ListStore {

    public List<String> ageList(){
        LinkedList<String> list = new LinkedList<String>();
        list.add("20 to 25 years");
        list.add("25 to 35 years");
        list.add("above 35 years");
        return list;
    }
 }

dropdownコントローラーの POST メソッドを介してフォームがリロードされたときに、リストの値を復元する方法は?

しかし map.addAttribute("age",(ArrayList<String>)getList.ageList());、コードにasを追加することでこの問題を解決しました。

    if(result.hasErrors()){
        System.out.println("Form has some errors !!!!!!!!");
        map.addAttribute("age",(ArrayList<String>)getList.ageList());
        return "ApplicationForm";
    }

しかし、これを簡単に行う他の方法はありますか?

私たちのスタックメンバーが私を助けてくれることを願っています。

4

4 に答える 4

1

私は通常、コードの重複を避けるためにアクション (POST) メソッドから表示メソッドを呼び出しています。以下のわずかに変更されたコードを参照してください。Post/Redirect/Get patternに従うようにコードを少し変更しました。

@Controller
public class FormController {

    private ListStore getList;

    @RequestMapping(value="/ApplicationForm.html", method=RequestMethod.GET)
    public String displayForm(@ModelAttribute UserData userData, Model model){

        model.addAttribute("age", getList.ageList());
        return "ApplicationForm";
    }

    @RequestMapping(value="/ApplicaitonForm.html", method=RequestMethod.POST)
    public String processForm(@Valid UserData data, 
                              BindingResult result, 
                              Model model, 
                              @RequestParam(value="name", required=true) String name, 
                              @RequestParam("age") String age, 
                              RedirectAttributes redirectAttributes) {

        if(result.hasErrors()){
            System.out.println("It has some errors !!!!!!!!");
            return displayForm(data, model); /* THIS IS THE TRICK :) */
        }

        redirectAttributes.addFlashAttribute("name", name);
        redirectAttributes.addFlashAttribute("age", age);

        return "redirect:/DisplayFormDetails.html"; // Redirect here to follow Post/Redirect/Get pattern
    }

    @RequestMapping(value="/DisplayFormDetails.html", method=RequestMethod.GET)
    public String displayFormDetails(Model model){
        // name and age are already in model due to use of RedirectAttributes
        return "DisplayFormDetails";
    }
}
于 2013-08-06T22:16:26.777 に答える
0

@ModelAttributeが手伝う。

@ModelAttribute
    public ModelMap setupForm(ModelMap modelMap) {

        modelMap.put("age",(ArrayList<String>)getList.ageList());
        return modelMap;
    }

これは、 Spring フォームの処理について理解するための優れた記事です。

于 2013-07-25T09:48:13.297 に答える