Spring MVC表单 - 下拉列表中没有项目?

时间:2013-07-24 15:07:31

标签: java spring jsp spring-mvc spring-annotations

我的表单有一个text field和一个dropdown list。当我第一次加载表单时,会有一个list of values in the dropdown list

如果我正在提交form,而我的表单中有errors,我会尝试返回相同的表单以显示错误并重新提交错过的数据。

但如果我的表单reloads通过POST的{​​{1}}方法,则下拉列表中没有值。

我的弹簧控制器

controller

我的 ListStore 类将是,

@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";
    }
}

当我的表单通过控制器的POST方法重新加载时,如何恢复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解决了这个问题,

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

但有没有其他方法可以轻松完成这项工作?

希望我们的堆叠成员能帮助我。

4 个答案:

答案 0 :(得分:1)

我通常从动作(POST)方法调用display方法来避免代码重复。请参阅下面的略微修改的代码。我还对您的代码做了一些小改动,以跟随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";
    }
}

答案 1 :(得分:0)

我可以从你的代码中看到,

如果您的表单有错误,那么它只是返回“ApplicationForm”视图名称,没有显示模型数据以查看将显示哪个视图

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

答案 2 :(得分:0)

在getList属性上添加@Autowired注释。

@Controller
public class FormController {

    @Autowired //annotation added
    private ListStore getList;
    -----

答案 3 :(得分:0)

@ModelAttribute会帮助你。

@ModelAttribute
    public ModelMap setupForm(ModelMap modelMap) {

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

This is a nice article了解处理Spring表单。