当前位置: 首页 > 知识库问答 >
问题:

纯JavaScript获取()方法到java Servlet,我如何获取和传递数据?

须捷
2023-03-14

当我试图从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()来实现这一点,因为我已经了解到我可以将JSON对象用于servlet(同样,我不能使用任何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();

    }
}

我这里的问题是关于fetch方法的。我知道它从RESTAPI获取对象。如何使用它从servlet传递和获取数据?如何使用发送到servlet的数据?如果不可能,如何使用XMLHttpRequest将数据传递给servlet?(不用$use)

谢谢

共有1个答案

井洲
2023-03-14

它并没有完全回答我的问题,但大部分问题是:我成功地找到了一种向ajax客户端发送JSON对象的方法。

我在我的客户端使用了这个(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:@MultipartConfig 2。在客户端中,使用“FormData”,可以通过请求正文中的fetch发送:

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

由于@MultipartConfig的注释,servlet知道如何通过“request.get参数”访问参数

我希望这将有助于在未来的人。谢谢大家。

 类似资料:
  • 问题内容: 是否可以使用反射API将参数传递给Java中的方法? 是否可以使用诸如AspectJ之类的AOP库来实现这一目标? 我在Android上运行。 。 问题答案: 是否可以使用诸如AspectJ之类的AOP库来实现这一目标? 当然可以。这是AspectJ中典型的初学者练习,如下所示: 现在,您只需要编写一个方面即可拦截所有方法执行(以及可选的构造函数执行,如下所示): 运行时,此方面将打印

  • 本文向大家介绍JavaScript中获取纯正的undefined的方法,包括了JavaScript中获取纯正的undefined的方法的使用技巧和注意事项,需要的朋友参考一下 1、为什么要获取undefined? 因为undefined在javascript中不是保留字,可以被用户当做变量来赋值,这样如果我们后期需要用到undefined来检测一个变量的话,那么检测的值就不准确了; 举个栗子: s

  • 问题内容: 在java中,可以获取调用当前方法的类和方法(在其中获得StackTrace的方法)。 我的问题是,我可以获取传递给调用此方法的方法的参数吗? 我需要此来进行调试。 例如: 可以从堆栈跟踪中获取此信息,还是有其他方法? (请注意,我需要能够在运行时执行此操作,并且实际上不能更改baseClass的源,这将成为我的调试类的功能,该类事先不知道源) 谢谢。 问题答案: 我认为使用标准Jav

  • 问题内容: 我是AngularJS的新手,在这里我很茫然。 现在,我的MVC程序使用Razor来显示.mdf数据库中的所有数据(即 @ Html.DisplayFor(modelItem = > item.LastName) )。但是,我想主要使用Angular。我正在尝试使用ng- repeat显示所有Model数据,但是我不确定如何将那个Model数据传递给Angular控制器然后使用它。我曾

  • 在 JavaScript 中怎样正确获取字符个数 console.log('ab����'.length) // 打印结果: 6 我想要的 3 个字符 有没有能通用函数应对所有类型字符串

  • 问题内容: 有人知道如何从任务中获取数据吗? 问题答案: 您不能直接从异步任务返回数据。 Swift 2的解决方案是使完成处理程序如下所示: 这样,仅当异步任务完成时才调用完成。这是一种无需实际使用即可“返回”数据的方法。 Swift 3版本

  • 问题内容: 我本质上有一个采用构造函数参数的自定义。我找不到真正谈论如何实现它的地方。 如您所见,它需要一个,但是当我在测试类中注册时,我不确定如何获取视图。 我已经尝试过,并且尝试过获取当前正在运行的活动,然后调用它,但是没有运气。 有人知道在这种情况下该怎么做吗? 问题答案: 弄清楚了。要使视图传递到空闲资源中,您要做的就是获取ActivityTestRule的成员变量 例如: 然后打电话 因

  • 我无法从API获取数据。我尝试了不同的方法,但没有成功。这是我的代码和API。我想通过react-fetch方法使用这些数据(JSON)。 当我使用这个获取api时,它正在工作。数据与上面的数据几乎相同,但那不是真正的Rest API。