我想用Spring mvc做一个mcq。我有一个与课程问题有一个OneToMany关系的Mcq课程,该课程与课程答案有一个OneToMany关系。因此,Mcq将Arraylist ListOfQuestions作为属性,并将问题列为Arraylist ListOfAnswers。
我的控制器是
@RequestMapping(value="displayMcq", method = RequestMethod.GET)
public String showMcq(Model model) {
Mcq mcq = mcqService.findById(new Long(1));
model.addAttribute("mcq", mcq);
return "displayMcq";
}
@RequestMapping(method = RequestMethod.POST)
public String displayQcmRepondu(@ModelAttribute("mcq2") Mcq mcq, BindingResult binding, SessionStatus status) {
if (binding.hasErrors()) {
return "displayMcq";
} else {
status.setComplete();
return "redirect:/mcqSuccess/";
}
}
我的视图displayMcq.jsp是
<form:form modelAttribute="mcq" method="POST">
<ol>
<c:forEach items="${mcq.listOfQuestions}" var="question">
<li>
<c:out value="${question.label}" />
<br />
<ul>
<c:forEach var="answer" items="${question.listOfAnswers}">
<form:checkbox path="listOfQuestions" value="answer.id" label="${answer.label}" />
<br />
</c:forEach>
</ul>
</li>
</c:forEach>
</ol>
<input type="submit" value="Validate" />
</form:form>
我的mcq显示良好,但表单处理失败。我留在displayMcq外观,错误“Etat HTTP 405 - 不支持请求方法'POST'。”
那么,你能解释一下这个问题,帮我正确处理我的mcq并返回检查过的答案吗?
答案 0 :(得分:1)
请注意,您的控制器方法会映射到不同的URL(由于POST方法中缺少value
属性)。
由于action
中没有<form:form>
属性,它会在提交时向当前页面的URL发送POST请求,但是您没有控制器方法来处理对该URL的POST请求
因此,您需要将POST方法映射到与GET方法相同的URL:
@RequestMapping(value="displayMcq", method = RequestMethod.POST)
public String displayQcmRepondu(...) { ... }
答案 1 :(得分:0)
谢谢,这解决了一个问题,但是当我验证时,我有一个消息错误,例如“无法将类型为java.lang.String []的属性值转换为所需类型java.util.List for property ...”
所以我将控制器方法修改为
@RequestMapping(value="displayQcm", method = RequestMethod.POST)
public String displayQcmRepondu(@ModelAttribute ("mcqProcess") Mcq mcq, BindingResult binding, Model model, SessionStatus status) {
model.addAttribute("mcqProcess", mcq);
status.setComplete();
return "mcqSuccess";
}
我想在mcqSuccess.jsp中显示已检查的答案,但未提交mcq。我显示了该页面,但是书面文字仍然存在。
如果可以提供帮助,则mcqSuccess为
<h2>MCQ submitted</h2>
<ol>
<c:forEach items="${mcqProcess.listOfQuestions}" var="question">
<li>
<c:out value="${question.label}" />
<br/>
<ul>
<c:forEach var = "answer" items = "${question.listOfAnswers}">
<c:if test = "${answer.correct}">
<c:out value = "${answer.label}" />
</c:if>
<br/>
</c:forEach>
</ul>
</li>
</c:forEach>
</ol>
</div>