使用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
实例。
注意我发现这篇文章对解决我的问题很有帮助。