如何在javascript和servlet之间发送和接收json数据? 问题

如何在javascript和servlet之间发送和接收json数据? 问题,javascript,java,json,servlets,fetch,Javascript,Java,Json,Servlets,Fetch,我无法使用html/javascript将表单数据作为json发送到servlet,然后servlet重放json的客户端之间的通信。我不知道我在哪里犯了错误 这个想法是: JavaScript从表单获取数据,将其解析为json,并将其发送到servlet 在服务器端,servlet读取发送的json,并采取一些措施。生成另一个json,并重播它 回到客户端,阅读json并在此基础上绘制一些html。(现在,我只是console.log()-ing它) 客户 从元素获取数据的javascri

我无法使用html/javascript将表单数据作为json发送到servlet,然后servlet重放json的客户端之间的通信。我不知道我在哪里犯了错误

这个想法是:

  • JavaScript从表单获取数据,将其解析为json,并将其发送到servlet
  • 在服务器端,servlet读取发送的json,并采取一些措施。生成另一个json,并重播它
  • 回到客户端,阅读json并在此基础上绘制一些html。(现在,我只是
    console.log()
    -ing它)
客户 从元素获取数据的javascript代码:

//首先我添加侦听器
document.querySelector(“#login_form”).addEventListener('submit',(e)=>{
e、 预防默认值();
登录发送(如目标);
});
//然后在提交时运行函数
函数登录\发送(表单){
log(form2json(form));
//我得到的内容:{“电子邮件”:a@b.c“,“通过”:“aoeu”}
获取('登录'{
方法:'POST',
标题:{
“接受”:“应用程序/json,文本/plain,*/*”,
'内容类型':'application/json'},
正文:form2json(form)
})
.然后((res)=>res.json())
。然后((数据)=>{
log(“我得到:+数据);//现在,只打印数据
})
.catch((err)=>console.error(err));
}
//这是我手工制作的“form to json”字符串格式化程序,
//当然有更好的(正确的?)方法。
函数form2json(form){
让js=“{”;
设last=form.length-1;

对于(i=0;i构建json manulay是不合适的!
html中的每个表单都有一个名为onSubmit的函数。您可以使用它



我看到的第一个问题是异常:
java.lang.ClassNotFoundException:javax.json.json
您需要将其包含在类路径中。 在我使用的
javax.json-1.0.jar
中,包括您在
YOUR_PROJECT/web/web-INF/lib
文件夹中使用的
javax.json
jar

YOUR_PROJECT
|
|__web
   |
   |__WEB-INF
      |
      |__lib
         |  javax.json-1.0.jar
这样,当您导出war文件并将其部署到tomcat上时,jar将在类路径上可用

第二个问题是将JSON传递给服务器,并尝试使用
req.getParameter
获取参数,但您真正需要的是解析JSON并获取如下值:

 StringBuilder sb = new StringBuilder();
 BufferedReader br = req.getReader();
 String str = null;
 while ((str = br.readLine()) != null) {
     sb.append(str);
 }

 String json = sb.toString();


 JsonReader jsonReader = Json.createReader(new StringReader(json));
 JsonObject jsonObject = jsonReader.readObject();
 jsonReader.close();

 // an object with three fields.
 User u = new User(jsonObject.getString("email"), "10010099", jsonObject.getString("pass"));
完整的代码:

public class Login extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        res.setContentType("application/json;charset=UTF-8");
        try (PrintWriter out = res.getWriter()) {

            StringBuilder sb = new StringBuilder();
            BufferedReader br = req.getReader();
            String str = null;
            while ((str = br.readLine()) != null) {
                sb.append(str);
            }

            String json = sb.toString();


            JsonReader jsonReader = Json.createReader(new StringReader(json));
            JsonObject jsonObject = jsonReader.readObject();
            jsonReader.close();

            // an object with three fields.
            User u = new User(jsonObject.getString("email"), "10010099", jsonObject.getString("pass"));

            // construct json answer.
            // based on https://www.youtube.com/watch?v=BPMVC999HTs
            JsonObject root;
            JsonObjectBuilder rootBuilder = Json.createObjectBuilder();
            JsonObjectBuilder userBuilder = Json.createObjectBuilder();
            userBuilder.add("name", u.getName()).add("email", u.getEmail()).add("sid", u.getSId());

            root = rootBuilder.add("login", userBuilder).build();
            // write response to out
            out.println(root);
            out.flush();
            out.close();
        }
    }
}

请不要手动为表单构建json,还有其他方法可以避免很多错误:请粘贴
System.out.println(root.toString())的输出;
?发布
User
类。@vladwoguer,如果我将
out.println(root)
替换为
out.println(root.toString())
,再一次,我在客户端看不到任何东西。我在Tomcat中运行servlet,我只将
.war
文件传递给Tomcat。我如何在不通过客户端的情况下看到标准输出?@Swati,在Edit 1I中添加。我正试图按照@vladwoguer的建议以正确的方式执行json。我想我正在使用属性 onsubmit
,添加事件侦听器。请您再详细说明一下。我不确定是否理解您的观点。谢谢,该类已添加。如果其他人遇到此问题,请在Netbeans中以以下方式添加:项目>您的项目>右键单击依赖项>添加依赖项…>选项卡搜索>字段查询“org.glassfish.javax”。选择一个版本,然后[Add]。有关详细信息,请参见此。现在我正在修复获取servlet中数据的方式。。。
 StringBuilder sb = new StringBuilder();
 BufferedReader br = req.getReader();
 String str = null;
 while ((str = br.readLine()) != null) {
     sb.append(str);
 }

 String json = sb.toString();


 JsonReader jsonReader = Json.createReader(new StringReader(json));
 JsonObject jsonObject = jsonReader.readObject();
 jsonReader.close();

 // an object with three fields.
 User u = new User(jsonObject.getString("email"), "10010099", jsonObject.getString("pass"));
public class Login extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        res.setContentType("application/json;charset=UTF-8");
        try (PrintWriter out = res.getWriter()) {

            StringBuilder sb = new StringBuilder();
            BufferedReader br = req.getReader();
            String str = null;
            while ((str = br.readLine()) != null) {
                sb.append(str);
            }

            String json = sb.toString();


            JsonReader jsonReader = Json.createReader(new StringReader(json));
            JsonObject jsonObject = jsonReader.readObject();
            jsonReader.close();

            // an object with three fields.
            User u = new User(jsonObject.getString("email"), "10010099", jsonObject.getString("pass"));

            // construct json answer.
            // based on https://www.youtube.com/watch?v=BPMVC999HTs
            JsonObject root;
            JsonObjectBuilder rootBuilder = Json.createObjectBuilder();
            JsonObjectBuilder userBuilder = Json.createObjectBuilder();
            userBuilder.add("name", u.getName()).add("email", u.getEmail()).add("sid", u.getSId());

            root = rootBuilder.add("login", userBuilder).build();
            // write response to out
            out.println(root);
            out.flush();
            out.close();
        }
    }
}