Мне нужно передать список объекта (который содержит ссылку на себя) в моем контроллере из моего представления. Я прошел так много ссылок, но не получил удовлетворительного решения. Ниже приведен мой сценарий и фрагмент кода. У меня есть пользовательский интерфейс со списком вопросов и ответов. У каждого вопроса могут быть и суб-вопросы, которые будут ребенком основного вопроса.
Я хочу передать полные данные как Список вопросов к моему контроллеру. Мой пользовательский интерфейс: https://i.stack.imgur.com/yA8hN.png
Модели:
Модель вопроса:
public class Question {
private String question;
private String question_type;
private List<String> answers;
private List<Question> subQuestions;
.. getter and setter and constructors...
}
public class SurveyData {
private List<Question> data = new ArrayList<Question>();
... getter and setter and constructors...
}
Контроллер:
@RequestMapping(value = "save", method = RequestMethod.POST)
public ModelAndView saveData( HttpServletRequest request, HttpServletResponse response, @ModelAttribute("surveyData") SurveyData data) {
// code to save the data....
}
В моем jsp у меня есть метод javascript, который извлекает все данные и сохраняет их в скрытом входном значении.
JSP/Вид:
<form id="surveyForm" modelAttribute="surveyData" method="POST">
<table style="height: 200px;" border="0" width="70" cellspacing="0">
<tbody>
<tr style="height: 50px;">
<td>
<h2>
<span style="color: #00ccff;"> ADD NEW CALL </span>
</h2>
</td>
</tr>
<tr style="height: 30px;">
<td>
<div id="question-container">
<p style="padding-left: 1000px;">
<span style="color: #999999;"><a style="color: #999999;"
title="+ ADD NEW QUESTION" href="javascript:void(0);"
onclick="javascript:addNewQuestion();">+ ADD NEW QUESTION</a></span>
</p>
</div>
</td>
</tr>
<tr style="height: 70px;">
<td>
<input type="hidden" id="surveyData" name="surveyData" value="" />
<input type = "submit" value = "Save" onclick="javascript:saveData();"/>
<input type = "submit" value = "Cancel" onclick="javascript:cancel();"/>
</td>
</tr>
</tbody>
</table>
</form>
<script>
function saveData() {
var surveyData = {};
var questions = [];
// code to fetch the data and save it in questions array
.
.
.
surveyData.data = questions;
$("#surveyData").val(surveyData);
$("#surveyForm").submit();
}
</script>
Я не получаю никаких данных в параметре modelAttribuite. Как передать эти данные моему контроллеру?
Заранее спасибо!!
Вы можете использовать вложенное свойство для элементов списка, которое описано в документе Spring MVC.
В вашем случае вы можете сгенерировать вопрос и подзапрос в JSP с помощью JSTL forEach
итерации с соответствующим индексом элемента. Чтобы добавить новый элемент, используйте JavaScript для добавления нового набора элементов ввода с новым индексом.
Кроме того, вы можете surveyData
свой surveyData
в JavaScript и преобразовать в правильный HTTP-запрос, который может использовать Spring:
var surveyData = {
data: [{
question: "question1",
question_type: "type1",
answers: [
"answer1",
"answer2"
],
subQuestions: []
}, {
question: "question1",
question_type: "type1",
answers: [
"answer1",
"answer2"
],
subQuestions: []
}]
}
var mapData = function (data, prefix) {
if (Array.isArray(data)) {
// map array data
return data
.map((e, i) => mapData(e, prefix + '[' + i + ']'))
.reduce((a, b) => a.concat(b), []);
} else if ((typeof data === "object") && data !== null) {
// map object data
return Object.getOwnPropertyNames(data)
.map(k => mapData(data[k], prefix + '.' + k))
.reduce((a, b) => a.concat(b), []);
}
return [{
key: prefix,
value: data
}]
}
var surveyDataInputs = mapData(surveyData, "surveyData");
// remove old nodes
document.querySelectorAll('input[type=hidden][name^=surveyData]').forEach(i => i.remove());
// add new nodes
var surveyForm = document.querySelector("#surveyForm");
surveyDataInputs.map(d => {
var input = document.createElement('input');
input.setAttribute("type", "hidden");
input.setAttribute("name", d.key);
input.setAttribute("value", d.value);
surveyForm.appendChild();
})
$("#surveyData").val(surveyData);
$("#surveyForm").submit();
addNewQuestion()
функцию JavaScript?