处理动态表格

时间:2015-12-09 07:36:41

标签: jsp spring-mvc jstl

我正在尝试处理动态弹簧形式。关键是,在运行之前,我不确切知道有多少输入形式。我不知道输入的名称或可以与@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,而不提供表单中的任何信息。如果有办法以另一种方式处理这个问题,我将非常感谢能指出正确的方向。

2 个答案:

答案 0 :(得分:1)

目前还不清楚你究竟在问什么,但如果它是绑定一个集合你需要进行以下更改。

  1. 答案需要存储在List而不是Set中。即qaForm.getAnswers()必须返回一个List,因为Spring只能绑定到索引可访问的集合。

  2. 更改JSP标记以使用索引属性,如下所示:

  3. <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

    1. 在表单中添加一个提交surveyId的隐藏字段。

    2. 在控制器中添加一个方法,如下所示,它将加载指定的调查并将提交的数据绑定到此现有实例。

    3. @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" />
 ....