1

我想用 Spring mvc 做一个 mcq。我有一个类 Mcq,它与类 Question 具有 OneToMany 关系,它与类 Answer 具有 OneToMany 关系。因此,Mcq 有一个 Arraylist ListOfQuestions 作为属性,而 Question 有一个 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 并返回检查的答案吗?

4

2 回答 2

1

请注意,您的控制器方法映射到不同的 URL(由于valuePOST 方法上没有属性)。

由于您没有actionin 属性<form:form>,因此它会在提交时向当前页面的 URL 发送 POST 请求,但您没有控制器方法来处理对该 URL 的 POST 请求。

因此,您需要将 POST 方法映射到与 GET 方法相同的 URL:

@RequestMapping(value="displayMcq", method = RequestMethod.POST)
public String displayQcmRepondu(...) { ... }
于 2012-08-09T10:33:55.037 回答
0

谢谢,这解决了一个问题,但是当我验证时,我收到一条消息错误,例如“无法将 java.lang.String[] 类型的属性值转换为所需的 java.util.List 类型以获取属性...”。

所以我将控制器方法修改为

    @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>
于 2012-08-09T21:36:11.657 回答