2

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

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

但是如果我的表单 reloads通过 的POST方法controller,下拉列表中没有值。

我的弹簧控制器

@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 模式

@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 回答
0

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

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

  if(result.hasErrors()){
            System.out.println("It has some errors !!!!!!!!");
            return "ApplicationForm";
   }
于 2013-07-24T15:17:58.250 回答
0

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

@Controller
public class FormController {

    @Autowired //annotation added
    private ListStore getList;
    -----
于 2013-07-24T16:34:57.617 回答