Ajax отправляет объект JSON с двумя массивами в сервлет и выполняет синтаксический анализ в java-сервлете без jQuery

#javascript #java #json #ajax

Вопрос:

Я должен отправить сервлету два массива, я использую вызов Ajax POST, который отправляет объект JSON, а затем я должен прочитать данные, отправленные в двух списках или массивах в классе сервлета на java. Я предпочитаю не использовать jQuery для вызова Ajax. Я не очень хорошо знаком с json, я использовал некоторый код, найденный в stackoverflow, и я не могу понять, есть ли проблема с отправкой или анализом данных.

Вот метод для выполнения вызова Ajax в Javascript, где cback-это функция обратного вызова, метод = «POST», а url-адрес-URL сервлета:

 function makeCall(method, url, from, to, cback) {
    var req = new XMLHttpRequest(); 
    req.onreadystatechange = function() {
        cback(req)
    }; 
    req.open(method, url);
  
    var obj = {};
    obj["from"] = from;
    obj["to"] = to;
    var data = JSON.stringify(obj);
    req.send(data);
    

} 

Вот метод doPost в контроллере сервлета, указанный в URL-адресе. Вот где я обнаружил проблему: после выполнения getParameter строки json1 и json2 равны нулю:

        
protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
            
       //...
            
       String json1 = request.getParameter("from");
       String json2 = request.getParameter("to");

       Gson gson = new Gson();
       ArrayList<Double> listFrom = gson.fromJson(json1,
                new TypeToken<ArrayList<Categoria>>() {}.getType());

       ArrayList<Double> listTo = gson.fromJson(json2,
                new TypeToken<ArrayList<Double>>() {}.getType());
                
      //...
} 

Ответ №1:

Ваш ajax отправляет JSON, но ваш сервелет ожидает данные формы, в которых есть JSON.
Чтобы отправить данные, как ожидает ваш сервер, закодируйте каждый массив в JSON и отправьте их в виде данных формы

 function makeCall(method, url, from, to, cback) {
    var req = new XMLHttpRequest(); 
    req.onreadystatechange = function() {
        cback(req)
    }; 
    req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    req.open(method, url);
  
    var params = new URLSearchParams({to: JSON.stringify(to), from: JSON.stringify(from)});
    req.send(params.toString());            
}