У меня проблемы с динамическими формами весной.В нашей форме мы хотим указать заголовок и добавить ряд вопросов.У нас есть кнопка «добавить», чтобы добавить форму ввода вопроса с помощью jquery.
Наша форма имеет одно поле вопроса, когда оно запрашивается.Дополнительные поля добавляются каждый раз, когда нажимается кнопка «Добавить».При отправке кажется, что дополнительные поля не отправляются (первое получено контроллером).Почему дополнительные поля не получены отправляются?
Я примерно основал свой код на этом примере списка динамического связывания .
Моя модель состоит изкласс «Report», который имеет «title» и список «Researchquestion» s.
Ниже приведена краткая версия двух модельных классов.Roo заботится обо всех методах получения и установки
@Entity
@RooJavaBean
@RooEntity
public class Report{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;
@NotEmpty
private String title;
@OneToMany(mappedBy="report")
private List<Researchquestion> researchquestions;
}
@Entity
@RooJavaBean
@RooEntity
public class Researchquestion {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;
@NotEmpty
private String question;
}
Здесь jspx для формы
<div xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:form="http://www.springframework.org/tags/form"
xmlns:jsp="http://java.sun.com/JSP/Page"
xmlns:fn="http://java.sun.com/jsp/jstl/functions"
xmlns:spring="http://www.springframework.org/tags"
version="2.0">
<jsp:output omit-xml-declaration="yes"/>
<spring:url value="/admin/report/appendquestion" var="insert_url"/>
<script type="text/javascript">
$(document).ready(function() {
var questionPosition = 0;
$("#addQuestionButton").click(function() {
questionPosition++;
$.get("${insert_url}", { fieldId: questionPosition},
function(data){
$("#insertAbove").before($(data));
});
});
});
</script>
<div class="list_overview_box span-19">
<spring:url value="/admin/report/" var="form_url"/>
<div class="list_overview_content">
<table>
<form:form action="${form_url}" method="post" modelAttribute="report">
<tr>
<th class="span-3">Veld</th>
<th>Waarde</th>
<th class="span-5">Errors</th>
</tr>
<!-- Title -->
<tr class="row">
<td class="vmiddle aleft">Title</td>
<td><form:input path="title" /></td>
<td></td>
</tr>
<!-- the "add" button -->
<tr class="row">
<td class="vmiddle aleft">Researchquestions</td>
<td colspan="2"><input type="button" id="addQuestionButton" value="Add question" /></td>
</tr>
<!-- First Researchquestion -->
<spring:bind path="researchquestions[0].question">
<tr class="row">
<td class="vmiddle aleft">Question 1</td>
<td><form:input path="${status.expression}" /></td>
<td></td>
</tr>
</spring:bind>
<!-- Save button, extra question's are added here -->
<tr id="insertAbove" class="row">
<spring:message code="button.save" var="form_submit"/>
<td colspan="3"><input id="proceed" type="submit" value="${form_submit}" /></td>
</tr>
</form:form>
</table>
</div>
</div>
</div>
Ниже находится страница, которую контроллер возвращает после запроса jquery .get У меня есть идеячто мне нужно использовать <spring:bind>
, как в форме выше.Однако, когда я делаю это, я получаю сообщение об ошибке:
java.lang.IllegalStateException: ни BindingResult, ни простой целевой объект для имени компонента «researchquestions [1]» не доступны в качестве атрибута запроса
appendquestion.jspx
<jsp:root version="2.0"
xmlns:jsp="http://java.sun.com/JSP/Page"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:tiles="http://tiles.apache.org/tags-tiles"
xmlns:form="http://www.springframework.org/tags/form"
xmlns:spring="http://www.springframework.org/tags"
xmlns:roo="urn:jsptagdir:/WEB-INF/tags" >
<tr class="row">
<jsp:directive.page contentType="text/html;charset=UTF-8" />
<td class="vmiddle aleft">Question ${questionNumber +1}</td>
<td>
<form:input path="report.researchquestions[${questionNumber}].question" size="40" />
</td>
<td></td>
</tr>
</jsp:root>
Здесь соответствующие методы @ModelAttribute и @requestmapping в нашем контроллере. Метод @ModelAttribute гарантирует, что List в экземпляре AutoPopulationList не уверен, действительно ли этоТребуется, однако.
Если я добавлю @RequestParam Map formdata
к методу create()
(POST), тогда данные формы содержат researchquestions[0].question
, но не researchquestions\[1\].question
или любые другие поля вопросов, которые были добавлены после нажатия кнопки «Добавить»
@ModelAttribute("report")
public Report getReport(Long id) {
Report result;
if(id != null){
result = Report.findReport(id);
} else{
result = new Report();
}
//Make sure the List in result is an AutoPopulatingList
List<Researchquestion> vragen = result.getResearchquestions();
if(vragen == null){
result.setResearchquestions(new AutoPopulatingList<Researchquestion>(Researchquestion.class));
} else if(!(vragen instanceof AutoPopulatingList)){
result.setResearchquestions(new AutoPopulatingList<Researchquestion>(
vragen, Researchquestion.class));
}
return result;
}
/**
* Aanmaken Report
* @param report
* @param result
* @param modelMap
* @return
*/
@RequestMapping(method = RequestMethod.POST)
public String create(@Valid @ModelAttribute("report") Report report,
BindingResult result, ModelMap modelMap) {
if (report == null) throw new InvalidBeanException("A report is required");
if (result.hasErrors()) {
modelMap.addAttribute("report", report);
return "admin/report/create";
}
report.persist();
//create questions
for(Researchquestion question : report.getResearchquestions()){
question.setProfielwerkstuk(report);
question.persist();
}
report.merge();
return "redirect:/admin/report";
}
@RequestMapping(value = "/appendquestion", method = RequestMethod.GET)
public String appendResearchquestionField(@RequestParam Integer fieldId, ModelMap modelMap){
modelMap.addAttribute("questionNumber", fieldId);
return "admin/report/appendquestion";
}
Дополнительная информация (по запросу Ральфа) * 1038 *
Ниже HTML-кода, который генерирует Spring, исследовательские вопросы [0] .question по умолчанию в форме, исследовательские вопросы[1]. Вопрос добавляется после нажатия кнопки «Добавить»
<tr class="row">
<td class="vmiddle aleft">Question 1</td>
<td>
<input id="researchquestions0.question" type="text" value=""
name="researchquestions[0].question">
</td>
<td></td>
</tr>
<tr class="row">
<td class="vmiddle aleft">Question 2</td>
<td>
<input id="researchquestions1.question" type="text" size="40" value="" name="researchquestions[1].question">
</td>
<td></td>
</tr>
ниже соответствующей информации из заголовков Live HTTP
Я намеревался "Это заголовок "в поле" заголовок "," Это первый вопрос "в поле" Вопрос 1 "и" Это второй вопрос "в поле" Вопрос 2 "(который был добавлен нажатием кнопкикнопка «добавить».
Ясно, что исследовательские вопросы [0] .question отправляются, но исследовательские вопросы [1] .question вообще не отправляются в запросе POST.
Content-Type: application/x-www-form-urlencoded
Content-Length: 73
title=This+is+the+title&researchquestions%5B0%5D.question=This+is+the+first+question
Мои подозрения Разница между первым вопросом (то есть в форме по умолчанию) и последующими вопросами состоит в том, что первый вопрос использует <spring:bind>
, а последующие - нет.Когда я удаляю тег <spring:bind>
для первого вопроса, исследовательские вопросы [0] также не отправляются.
Как я объяснил выше, я получаю исключение IllegalStateException при добавлении <spring:bind>
в appendquestion.jspx.Похоже, что Spring ищет объект researchquestions[1]
вместо report.researchquestions[1]
java.lang.IllegalStateException: ни BindingResult, ни простой целевой объект для имени бина «researchquestions [1]» не доступны в качестве атрибута запроса