Как я могу передать список сложных объектов в контроллер с моей точки зрения (JSP)

1

Мне нужно передать список объекта (который содержит ссылку на себя) в моем контроллере из моего представления. Я прошел так много ссылок, но не получил удовлетворительного решения. Ниже приведен мой сценарий и фрагмент кода. У меня есть пользовательский интерфейс со списком вопросов и ответов. У каждого вопроса могут быть и суб-вопросы, которые будут ребенком основного вопроса.

Я хочу передать полные данные как Список вопросов к моему контроллеру. Мой пользовательский интерфейс: 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;">&nbsp;ADD NEW CALL&nbsp;</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>&nbsp;&nbsp;
                <input type="hidden" id="surveyData" name="surveyData"  value="" />
                <input type = "submit" value = "Save" onclick="javascript:saveData();"/>&nbsp; 
                <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. Как передать эти данные моему контроллеру?

Заранее спасибо!!

  • 0
    Не могли бы вы показать addNewQuestion() функцию JavaScript?
Теги:
jsp
spring
spring-mvc

1 ответ

0

Вы можете использовать вложенное свойство для элементов списка, которое описано в документе 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();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню