Отправка массива и других данных одним запросом ajax с помощью jquery - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть Java-сервлет, который получает все запросы от моих страниц и возвращает некоторые данные в виде json.Я вполне уверен, что с сервлетом все в порядке, но я не понимаю, где мне не удается в сценарии.В скрипте есть параметр действия, представляющий собой строку, которая мне нужна в сервлете, чтобы понять, что делать, и в этом случае мне также необходимо передать 2 массива (1 массив int и 1 String).Сервлет говорит мне, что JSON массива искажен.js script:

$(document).ready(
$.ajax({
        url: "Controller",
        type: "POST",
        data: {action: "load",
               subjects: getSubjects(),
               days: getDays()
              },
        dataType: "json",
        success: function (result) {
            //do stuff

            }
        },
        error: function (xhr, thrownError) {
            alert(xhr.status);
            alert(thrownError);
        }
    }));

Разбор Json выполняется с помощью gson:

Integer[] days = gson.fromJson(request.getParameter("days"), Integer[].class);
String[] subjects = gson.fromJson(request.getParameter("subjects"), String[].class);

Я попытался с пустыми обоими массивами, и он работает, но если один или оба содержат что-то, то этого нет.Ps: я создаю массивы в функциях и возвращаю их Ps2: элементы добавляются в массив нажатием Ps3: я много искал в интернете, но в новейшей версии jquery многое изменилось, а прошлые ответы неработа.

РЕДАКТИРОВАТЬ: я пытался с JSON.stringify (getSubjects) и JSON.stringify (getDays), но это не сработало

Спасибо за внимание:)

1 Ответ

0 голосов
/ 10 декабря 2018

Я думаю, что ваши getSubjects() и getDays() функции возвращают массив, пока вы хотите строку JSON.Вы можете создать действительную строку JSON, используя JSON.stringify().

При работе с серверными запросами обязательно проверьте вкладку сети инструментов разработчика вашего браузера (нажмите F12, чтобы открыть их в таких браузерах, как Firefox и Chrome).

/*
Wrong Way - Passing array as a parameter
In this way you send the parameters:

  action: load
  subjects[]: 1
  subjects[]: 2
  subjects[]: 3
  days[]: 1
  days[]: 2
  days[]: 3

*/

$.ajax({
    url: "Controller",
    type: "POST",
    data: {
        action: "load",
        subjects: [1, 2, 3],
        days: [1, 2, 3]
    },
    dataType: "json",
    success: function (result) {
        //do stuff
        console.log(result);
    },
    error: function (xhr, thrownError) {
        console.error(xhr.status, thrownError);
    }
});

/*
Correct Way - Passing JSON string as a parameter
In this way you send the parameters:

  action: load
  subjects: [1,2,3]
  days: [1,2,3]

*/
$.ajax({
    url: "Controller",
    type: "POST",
    data: {
        action: "load",
        subjects: JSON.stringify([1, 2, 3]),
        days: JSON.stringify([1, 2, 3])
    },
    dataType: "json",
    success: function (result) {
        //do stuff
        console.log(result);
    },
    error: function (xhr, thrownError) {
        console.error(xhr.status, thrownError);
    }
});

РЕДАКТИРОВАТЬ

Полный рабочий пример кода:

Файл Test.java

// Import required java libraries
import java.util.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import com.google.gson.*;
import com.google.gson.Gson;

// Extend HttpServlet class
@WebServlet("/Test")
public class Test extends HttpServlet {

    public void init() throws ServletException {}

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // Set response content type
        response.setContentType("text/html");

        // Actual logic goes here.
        PrintWriter out = response.getWriter();
        out.println("Test");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Gson gson = new Gson();
        Integer[] days = gson.fromJson(request.getParameter("days"), Integer[].class);
        String[] subjects = gson.fromJson(request.getParameter("subjects"), String[].class);

        // Set response content type
        response.setContentType("text/html");

        // Actual logic goes here.
        PrintWriter out = response.getWriter();
        out.println(
            "days : \"" + Arrays.toString(days) + "\"<br>" +
            "subjects : \"" + Arrays.toString(subjects) + "\"<br>"
        );
    }

    public void destroy() {
        // do nothing.
    }
}

Файл text-ajax.html

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title>Test</title>
    </head>
    <body>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
        <script type="text/javascript">
            jQuery.ajax({
                url: "http://localhost:8080/Test",
                type: "POST",
                data: {
                    action: "load",
                    subjects: JSON.stringify(["a", "b", "c"]),
                    days: JSON.stringify([1, 2, 3])
                },
                /*Just to be sure*/
                contentType : "application/x-www-form-urlencoded; charset=UTF-8",
                dataType: "json",
                success: function (result) {
                    console.log(result);
                },
                error: function (xhr, thrownError) {
                    console.error(xhr.status, thrownError);
                }
            });
        </script>
    </body>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...