Чистый метод Javascript fetch () для java сервлета, как мне получить и передать данные? - PullRequest
1 голос
/ 26 мая 2020

У меня возникают проблемы, когда я пытаюсь получить данные из сервлета. Когда я вызываю сервлет:

function urlFetchRequest(str, body = null, RequestType = 'GET'){
    try
    {
        asyncRequest = new XMLHttpRequest();
        asyncRequest.addEventListener("readystatechange", stateChange, false);
        asyncRequest.open(RequestType, str, true);    //   /Test is url to Servlet!
        asyncRequest.send(body);
    }
    catch(exception)
    {
        alert("Request failed");
    }
}

, я получаю нужную мне информацию от сервлета и могу использовать ее:

jsonRes = JSON.parse(asyncRequest.responseText)

, что работает. Моя проблема в том, что мне нужно передать данные сервлету. поэтому я пытаюсь сделать это с помощью fetch (), так как я прочитал, что могу использовать объекты JSON для сервлета (опять же, я не могу использовать какие-либо библиотеки javascript, такие как jquery), и я не могу использовать данные что сервлет возвращается. Он получает значение «undefined».

Область javascript, которую я использую:

 function newFetch(url, options){
    fetch(url, options).then(async (res) => {
        if(res.ok){
            jsonRes = res.
            if(theSurvey === null) {
                surveyLength = Object.keys(jsonRes).length;
                theSurvey = jsonRes;
            }
        }
    });
}

Я называю ее отсюда:

returnedObject.SurveyLoader = async () => {
    //urlFetchRequest("/SurveyServlet");
    //await SurveyResults();
    newFetch("/SurveyServlet", {
        method: "GET",
        headers: headers,
    })
}

Мой сервлет:

@WebServlet(name = "SurveyServlet", urlPatterns = {"/SurveyServlet"} )
public class SurveyServlet extends HttpServlet {
    public static final Logger LOGGER = Logger.getLogger("SurveyServlet");
    private BufferedReader m_reader;
    private String m_line;
    public String convertWithStream(Map<String, String> map) {
        String mapAsString = map.keySet().stream()
                .map(key -> '\"' + key + '\"' +  ":" + '\"' + map.get(key) + '\"')
                .collect(Collectors.joining(", ", "{", "}"));
        return mapAsString;
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Map<String, String> SurveyObj = new LinkedHashMap<>();
        m_reader = new BufferedReader(new FileReader(getServletContext().getRealPath("/poll.txt")));
        m_line = m_reader.readLine();
        SurveyObj.put(Integer.toString(0), m_line);

        int id = 1;
        while((m_line = m_reader.readLine())!=null) {
            SurveyObj.put(Integer.toString(id), m_line);
            ++id;
        }
        String str = convertWithStream(SurveyObj);
        response.setContentType("application/json");
        response.setCharacterEncoding("UTF-8");


        //request.setAttribute("ArraySize", id);
       // getServletContext().getRequestDispatcher("ResultServlet").forward(request,response);
        PrintWriter out = response.getWriter();
        out.write(str);
        out.flush();
        out.close();

    }
}

У меня вопрос по методу выборки. Я знаю, что он получает объекты из REST API. как использовать его для передачи и получения данных от сервлета? как использовать данные, которые я отправляю сервлету? Если это невозможно, как мне использовать XMLHttpRequest для передачи данных сервлету? (без использования $)

Спасибо.

1 Ответ

0 голосов
/ 27 мая 2020

Это не полностью отвечает на мой вопрос, но большая его часть: мне удалось найти способ отправить объект JSON моему ajax клиенту.

Я использовал это на своей стороне клиента ( URL-адрес - это имя моего сервлета, а параметры содержат только заголовки (тип содержимого et c):

 function newFetch(url, options){
    fetch(url, options).then(res => res.json()
    ).then((resp) => {
        jsonRes = resp;
        if (theSurvey === null) {
            surveyLength = Object.keys(jsonRes).length;
            theSurvey = jsonRes;
            SurveyResults();
        }
    });

}

И в сервлете я использовал библиотеку javax для использования методов объекта JSON, которые способ:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    Map<String, String> SurveyObj = new LinkedHashMap<>();
    m_reader = new BufferedReader(new FileReader(getServletContext().getRealPath("/poll.txt")));
    m_line = m_reader.readLine();
    SurveyObj.put(Integer.toString(0), m_line);

    int id = 1;
    while((m_line = m_reader.readLine())!=null) {
        SurveyObj.put(Integer.toString(id), m_line);
        ++id;
    }
    JsonObjectBuilder builder = Json.createObjectBuilder();
    SurveyObj.forEach(builder::add);
    JsonObject obj = builder.build();
   // String str = convertWithStream(SurveyObj);
    response.setContentType("application/json");
    response.setCharacterEncoding("UTF-8");
    try (OutputStream out = response.getOutputStream()) {
        JsonWriter jsonW = Json.createWriter(out);
        jsonW.write(obj);
        jsonW.close();
    }
}

Надеюсь, это поможет кому-то в будущем. В любом случае, я все еще сталкиваюсь с проблемой отправки объекта JSON сервлету и доступа к нему через мой запрос. Если кто-то может помочь - это будет идеально. Если я найду ответ, я отредактирую сообщение.

Спасибо.

Редактировать: После множества поисков и попыток я нашел лучший способ, в на мой взгляд, чтобы передать данные сервлету: 1. Добавьте к своему сервлету эту аннотацию: @MultipartConfig 2. На стороне клиента используйте «FormData», и его можно будет отправить через выборку в теле запроса:

    let formData = new FormData();
    formData.append("size", surveyLength.toString());
    newFetch('ServletResults', {
        method: "POST",
        //headers: headers,
        body: formData

И поскольку аннотация @MultipartConfig, сервлет знает, как получить доступ к параметру через "request.getParameter"

Я надеюсь, что это поможет кому-то в будущем. Всем спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...