我正在尝试处理动态弹簧形式。关键是,在运行之前,我不确切知道有多少输入形式。我不知道输入的名称或可以与@RequestParam一起使用的任何信息。
这是我的控制器:
@RequestMapping(value = "/surveys/{id}", method = RequestMethod.GET)
public String survey(@PathVariable int id, ModelMap model) {
model.addAttribute("surveyForm", getQAForm(id));
return "user/survey";
}
@RequestMapping(value = "/submitSurvey", method = RequestMethod.POST)
public String submitSurvey(@ModelAttribute("surveyForm") QAForm qaForm, ModelMap modelMap){
Set<Answer> answers = qaForm.getAnswers();
modelMap.addAttribute("answers", answers);
return "test";
}
和jsp的:
<f:form method="post" modelAttribute="surveyForm" action="/submitSurvey">>
<h2>${surveyForm.survey.title}</h2>
<h5>${surveyForm.survey.description}</h5>
<c:forEach items="${surveyForm.answers}" var="answer">
<div class="panel panel-default">
<div class="panel-heading">
${answer.question.text}
</div>
<div class="panel-body">
<f:input path="${answer.answerText}" type="text" />
</div>
</div>
</c:forEach>
<input class="btn btn-default" type="submit" value="Submit"/>
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
</f:form>
处理/ submitSurvey请求后,将其简单重定向到test.jsp,而不提供表单中的任何信息。如果有办法以另一种方式处理这个问题,我将非常感谢能指出正确的方向。
答案 0 :(得分:1)
目前还不清楚你究竟在问什么,但如果它是绑定一个集合你需要进行以下更改。
答案需要存储在List而不是Set中。即qaForm.getAnswers()必须返回一个List,因为Spring只能绑定到索引可访问的集合。
更改JSP标记以使用索引属性,如下所示:
<c:forEach items="${surveyForm.answers}" var="answer" varStatus="status">
<div class="panel panel-default">
<div class="panel-heading">
${answer.question.text}
</div>
<div class="panel-body">
<f:input path="answer[${status.index}].answerText" type="text" />
</div>
</div>
</c:forEach>
要填写现有的提交调查,请进行以下更改(根据http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-modelattrib-method-args)
在表单中添加一个提交surveyId的隐藏字段。
在控制器中添加一个方法,如下所示,它将加载指定的调查并将提交的数据绑定到此现有实例。
@ModelAttribute("surveyForm")
public SurveyForm getSurveyForm(@RequestParam(required = false) Integer surveyId){
if(id != null){
//load the form required by id
}
}
答案 1 :(得分:0)
你可以这样做:
@RequestMapping(value = "/surveys/{id}", method = RequestMethod.GET)
public String survey(@PathVariable int id, ModelMap model,@RequestParam("description") String desc) {
// here you can handl the param description
model.addAttribute("surveyForm", getQAForm(id));
return "user/survey";
}
但是你应该在你的页面jsp中使用这个参数:
<f:form method="post" modelAttribute="surveyForm" action="/submitSurvey">>
<input type="text" name="description" />
....