Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用java将json数据从Ajax发送到Servlet?_Java_Jquery_Json_Ajax_Servlets - Fatal编程技术网

用java将json数据从Ajax发送到Servlet?

用java将json数据从Ajax发送到Servlet?,java,jquery,json,ajax,servlets,Java,Jquery,Json,Ajax,Servlets,我对我在代码中遇到的这个奇怪的错误完全感到困惑。因此,我尝试将数据从jQuery脚本发送到带有AJAX的servlet。现在,我注意到了一个奇怪的部分,当我将contentType设置为application/json时,我注意到服务器端的所有值都是空的,但当我删除它时,我在servlet中获得了正确的数据。现在,我想知道为什么我要面对这样一个错误 这是我的jsp- <script type="text/javascript"> $(document).on("click", "#

我对我在代码中遇到的这个奇怪的错误完全感到困惑。因此,我尝试将数据从jQuery脚本发送到带有AJAX的servlet。现在,我注意到了一个奇怪的部分,当我将contentType设置为
application/json
时,我注意到服务器端的所有值都是空的,但当我删除它时,我在servlet中获得了正确的数据。现在,我想知道为什么我要面对这样一个错误

这是我的jsp-

<script type="text/javascript">

$(document).on("click", "#check", function() { // When HTML DOM "click" event is invoked on element with ID "somebutton", execute the following function...
      event.preventDefault();
      var apiname=$("#apiname").val();
      var apiendpoint=$("#apiendpoint").val();
      var apiversion=$("#apiversion").val();
      var source=$("#source").val();


     $.ajax({
            type: "POST",
            url: "HomeServlet",
            contentType: "application/json",
            dataType:'json',
            data:{"apiname":apiname,"apiendpoint":apiendpoint,"apiversion":apiversion,"source":source},
            success: function(status){
                console.log("Entered",status);
            },
            error:function(error){
                console.log("error",error);
            },

        });
});

</script>

$(document).on(“click”、“#check”,function(){//当对ID为“somebutton”的元素调用HTML DOM“click”事件时,执行以下函数。。。
event.preventDefault();
var apiname=$(“#apiname”).val();
var apidendpoint=$(“#apidendpoint”).val();
var apiversion=$(“#apiversion”).val();
var source=$(“#source”).val();
$.ajax({
类型:“POST”,
网址:“HomeServlet”,
contentType:“应用程序/json”,
数据类型:'json',
数据:{“apiname”:apiname,“apiendpoint”:apiendpoint,“apiversion”:apiversion,“source”:source},
成功:功能(状态){
控制台日志(“已输入”,状态);
},
错误:函数(错误){
console.log(“错误”,error);
},
});
});
Servlet代码-

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        Map<String, String> job = new LinkedHashMap<>();

        //doGet(request, response);
        JSONArray jArray = new JSONArray();

      //  response.setContentType("text/html");
        PrintWriter out= response.getWriter();
        String n = request.getParameter("apiname");
        String p = request.getParameter("apiendpoint");
        String e = request.getParameter("apiversion");
        String c = request.getParameter("source");
        String status ="091";
        try
        {
            Class.forName("com.mysql.jdbc.Driver");
            System.out.println("driver loaded");
            System.out.println("Driver is loaded");
            Connection con= (Connection) DriverManager.getConnection("jdbc:mysql://localhost/apiprovider","root","");
            System.out.println("Connection created");
            PreparedStatement ps= ((java.sql.Connection) con).prepareStatement("insert into apiinfo(apiname,apiendpoint,apiversion,accessibility) values (?,?,?,?)");
            ps.setString(1,n);
            ps.setString(2,p);
            ps.setString(3, e);
            ps.setString(4,c);
            ps.execute();
            out.close();
            status ="000";
            con.close();
            System.out.println("Inserted");
        }
        catch(Exception e1)
        {           
            System.out.println(e1);
        }
        job.put("status",status);
        jArray.put(job); 

        System.out.println(jArray.toString());
        response.setContentType("application/json");
        response.setCharacterEncoding("UTF-8");

        response.getWriter().write(jArray.toString());    

    }
protectedvoiddopost(HttpServletRequest请求,HttpServletResponse响应)抛出ServletException,IOException{
//TODO自动生成的方法存根
映射作业=新建LinkedHashMap();
//doGet(请求、响应);
JSONArray jArray=新的JSONArray();
//response.setContentType(“text/html”);
PrintWriter out=response.getWriter();
字符串n=request.getParameter(“apiname”);
字符串p=request.getParameter(“apiendpoint”);
字符串e=request.getParameter(“apiversion”);
字符串c=request.getParameter(“源”);
字符串状态=“091”;
尝试
{
Class.forName(“com.mysql.jdbc.Driver”);
System.out.println(“驱动程序加载”);
System.out.println(“驱动程序已加载”);
Connection con=(Connection)DriverManager.getConnection(“jdbc:mysql://localhost/apiprovider“,”根“,”);
System.out.println(“已创建连接”);
PreparedStatement ps=((java.sql.Connection)con).prepareStatement(“插入到APINfo(apiname,APINendpoint,apiversion,accessibility)值(?,,,?)”;
ps.setString(1,n);
ps.setString(2,p);
ps.setString(3,e);
ps.setString(4,c);
ps.execute();
out.close();
status=“000”;
con.close();
系统输出打印项次(“插入”);
}
捕获(异常e1)
{           
系统输出打印LN(e1);
}
作业。放置(“状态”,状态);
杰瑞.普特(约伯);
System.out.println(jArray.toString());
setContentType(“应用程序/json”);
响应。setCharacterEncoding(“UTF-8”);
response.getWriter().write(jArray.toString());
}

这是因为当您以如下方式发送ajax请求时:

 $.ajax({
        type: "POST",
        url: "HomeServlet",
        contentType: "application/json",
        dataType:'json',
        data:{"apiname":apiname,"apiendpoint":apiendpoint,"apiversion":apiversion,"source":source},
        success: function(status){
            console.log("Entered",status);
        },
        error:function(error){
            console.log("error",error);
        }
    });
您将数据作为正常的POST参数(不是Stringnyfied)发送,并告诉servlet这是一个JSON字符串(不是!!!)


因此,要真正做到这一点,您必须严格处理发送到servlet的数据,或者删除contentType:“application/json”数据类型:'json',以便将数据视为正常的POST数据。

您可以打开浏览器,按F12,运行这两个版本并检查内容类型的差异:
application/json
application/x-www-form-urlencoded
另外,请特别阅读`对于HTTP servlet,参数包含在查询字符串或发布的表单数据中`