使用Spring MVC进行动态表单和数据绑定

在我的Spring MVC应用程序中,我需要实现一个动态的问卷表单:我有N个问题,每个我有3个选项。

所以在我的页面中我会有这样的事情:

| Question 1 | 1 | 2 | 3 | | Question 2 | 1 | 2 | 3 | | Question 3 | 1 | 2 | 3 | | ... | 1 | 2 | 3 | | Question N | 1 | 2 | 3 | 

问题存储在数据库中,对于选项,我将使用单选按钮。 我将使用forEach标记来创建动态行,但我不知道如何发布数据并在此场景中处理ModelAttribute绑定…

对于我的模型属性类,这可能是一个很好的结构? 是否可以使用Spring MVC的动态forms绑定?

如何在此方案中发布数据并处理ModelAttribute绑定

你可以做,

我正在考虑Question类,如:

 public class Question { private String question; private Map optionMap; private Integer selectedOptionKey; //getters and setters } 

Option类如:

 public class Option { private Integer optionKey; private String optionText; //getters and setters } 

和一个用于表单绑定的QuestionsModel类,如:

 public class QuestionsModel { private Map questionMap; //getters and setters } 

在Controller类GET处理程序方法中,填充问题例如:

 @RequestMapping(method=RequestMethod.GET) public String index(Model model){ Option optionA = new Option(1, "A"); Option optionB = new Option(2, "B"); Option optionC = new Option(3, "C"); Map optionMap = new HashMap(); optionMap.put(optionA.getOptionKey(),optionA); optionMap.put(optionB.getOptionKey(),optionB); optionMap.put(optionC.getOptionKey(),optionC); Question question1 = new Question("AQ", optionMap, 1); Question question2 = new Question("BQ", optionMap, 1); Question question3 = new Question("CQ", optionMap, 1); Map questionMap = new HashMap(); questionMap.put(1, question1); questionMap.put(2, question2); questionMap.put(3, question3); model.addAttribute("questionsModel", new QuestionsModel(questionMap)); return "index"; } 

最后在jsp页面中使用来保存旧值,并渲染表单元素,如:

    
Question Options

您可以在POST中接收绑定和模型,如:

 @RequestMapping(value="/questionPost", method=RequestMethod.POST) public String indexPost(@ModelAttribute("questionsModel") QuestionsModel questionModel, BindingResult result){ System.out.println(questionModel.getQuestionMap()); return "redirect:/"; } 

这个类是我的模型属性

 public class Questionnaire { private List questions = new ArrayList<>(); private List answers = new ArrayList<>(); // set + get } 

和:

 public class Question { private int id; private String text; // set+ get } public class Answer { private int questionId; private int value; // set + get } 

在我把它放入模型之前,我填写questions列表。

在我的页面中,我使用以下代码:

  
${question.text}

发布此表单我在控制器中获得了一个完全填充的questionnaire实例。

注意我发现这篇文章对解决我的问题很有帮助。