使用form:复选框出错“请求方法POST不支持”

时间:2012-08-09 09:50:56

标签: forms spring-mvc checkbox

我想用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并返回检查过的答案吗?

2 个答案:

答案 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>