gpt4 book ai didi

java - 使用 Spring MVC 的动态表单和数据绑定(bind)

转载 作者:IT老高 更新时间:2023-10-28 13:46:19 26 4
gpt4 key购买 nike

在我的 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 绑定(bind)...

哪种结构适合我的模型属性类?是否可以通过 Spring MVC 对动态表单使用绑定(bind)?

最佳答案

how to post data and handle ModelAttribute binding in this scenario

你可以的,

我正在考虑 Question类如:

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

Option类如:

public class Option {

private Integer optionKey;
private String optionText;

//getters and setters
}

还有一个 QuestionsModel表单绑定(bind)类,如:

public class QuestionsModel {
private Map<Integer, Question> questionMap;
//getters and setters
}

在 Controller 类中GET handler 方法,例如填充问题:

@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<Integer, Option> optionMap = new HashMap<Integer, Option>();
optionMap.put(optionA.getOptionKey(),optionA);
optionMap.put(optionB.getOptionKey(),optionB);
optionMap.put(optionC.getOptionKey(),optionC);

Question question1 = new Question("A Q", optionMap, 1);
Question question2 = new Question("B Q", optionMap, 1);
Question question3 = new Question("C Q", optionMap, 1);
Map<Integer, Question> questionMap = new HashMap<Integer, Question>();
questionMap.put(1, question1);
questionMap.put(2, question2);
questionMap.put(3, question3);

model.addAttribute("questionsModel", new QuestionsModel(questionMap));

return "index";
}

终于在jsp页面使用<form:hidden..保留旧值,并渲染表单元素,例如:

<c:url value="/questionPost" var="postUrl"/>

<form:form action="${postUrl}" modelAttribute="questionsModel" method="post">
<table>
<tr>
<th>Question</th>
<th>Options</th>
</tr>
<c:forEach items="${questionsModel.questionMap}" var="currQue" varStatus="queIndex">
<tr>
<td>
<form:hidden path="questionMap[${queIndex.count}].question"/>
<label>Question:</label><c:out value="${currQue.value.question}"/><br/>
</td>
<td>
<c:forEach items="${currQue.value.optionMap}" var="opt" varStatus="optionIndex">
<form:hidden path="questionMap[${queIndex.count}].optionMap[${optionIndex.count}].optionText"/>
<form:hidden path="questionMap[${queIndex.count}].optionMap[${optionIndex.count}].optionKey"/>

<form:radiobutton path="questionMap[${queIndex.count}].selectedOptionKey"
value="${opt.value.optionKey}" label="${opt.value.optionText}"/>

</c:forEach>

</td>
</tr>
</c:forEach>
</table>
<input type="submit"/>
</form:form>

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

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

return "redirect:/";
}

关于java - 使用 Spring MVC 的动态表单和数据绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23272807/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com