Java Servlet的纯Javascript fetch()方法,如何获取和传递数据?

问题描述 投票:1回答:1

当我试图从Servlet中获取数据时,我遇到了问题。当我通过以下方式调用servlet时:

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");
    }
}

我从Servlet中获取了我需要的信息,并且可以通过以下方式使用它:

jsonRes = JSON.parse(asyncRequest.responseText)

这是工作。我的问题是何时需要将数据传递到servlet。因此,我尝试使用fetch()做到这一点,因为我已经知道可以对Servlet使用JSON对象(再次,我不能使用任何JavaScript库,例如jquery),也不能使用Servlet返回的数据。它变得“未定义”。

我使用的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,
    })
}

我的servlet是:

@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获取对象的。如何使用它传递和从servlet获取数据?如何使用发送到servlet的数据?如果不可能,如何使用XMLHttpRequest将数据传递到servlet? (无$使用)

谢谢。

javascript java servlets
1个回答
0
投票

它不能完全回答我的问题,但其中大多数:我成功找到了一种将JSON对象发送到我的Ajax客户端的方法。

我在客户端使用了它(URL是我的servlet名称,并且选项仅包含标头(内容类型等):

 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();
        }
    });

}

并且在servlet中,我使用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对象发送到servlet并通过我的请求访问它的问题。如果有人可以帮助-它将是完美的。如果我能找到答案,我会编辑帖子。

谢谢。

编辑:经过大量搜索和尝试,我认为将数据传递到servlet的最佳方法是:1.在您的servlet中添加以下注释:@MultipartConfig2.在客户端,使用“ FormData”,可以通过请求主体中的提取将其发送:

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

并且因为@MultipartConfig的注释,所以Servlet知道如何通过“ request.getParameter”访问参数

我希望这对以后的人有所帮助。谢谢大家。

© www.soinside.com 2019 - 2024. All rights reserved.