【问题标题】:Sending json from js to controller with ajax post使用ajax post将json从js发送到控制器
【发布时间】:2014-05-30 09:08:51
【问题描述】:

我在将 json 对象从 javascript 发送到 java 控制器时遇到问题,

Ajax

var xmlHttp = getXmlHttpRequestObject();
if(xmlHttp) {
        var jsonObj = JSON.stringify({"title": "Hello","id": 5 });
        xmlHttp.open("POST","myController",true);
        xmlHttp.onreadystatechange = handleServletPost;
        xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        xmlHttp.send(jsonObj);
    }
function handleServletPost() {
    if (xmlHttp.readyState == 4) {
        if(xmlHttp.status == 200) {
            alert(window.succes);
        }
    }
}

我在 Java 中的尝试:

public void process(
        final HttpServletRequest request, final HttpServletResponse response,
        final ServletContext servletContext, final TemplateEngine templateEngine) 
        throws Exception {

     String jsonObj = request.getParameter("jsonObj");
}

它们都是空的。

我尝试阅读相关帖子和多种发送数据的方式,但结果相同。不知道ajax怎么用jquery,所以主要找js解决方案。

谁能告诉我我错过了什么?我花了大约三个小时试图弄清楚

【问题讨论】:

    标签: java javascript ajax json


    【解决方案1】:

    要通过 POST 请求发送您的 JSON,您必须在 doPost 方法中读取请求的 正文。这是一种方法:

    protected void doPost(HttpServletRequest hreq, HttpServletResponse hres)
    throws ServletException, IOException {
        StringWriter sw = new StringWriter();
        IOUtils.copy(hreq.getInputStream(), sw, "UTF-8");
        String json = sw.toString();
    

    然后您必须解析 JSON。例如,这可以使用Google gson 来完成。

    假设您有一个带有公共参数idtitle 的类事物,这将是

    Gson gson = new GsonBuilder().create();
    Thing thing = gson.fromJson(json, Thing.class);
    int id = thing.id;
    String title = thing.title;
    

    当然,除了 gson 之外,还有其他解决方案可以解析 JSON,但您必须来解析它。

    【讨论】:

    • 我的确切方法在发送字符串而不是 json 对象时有效,那么为什么我需要实现 doPost? (我添加了我正在使用的方法)
    【解决方案2】:

    我认为您将 URL 参数与请求正文混淆了。要从请求中获取 json 字符串,您需要从 request.getReader() 读取它。

    【讨论】:

      【解决方案3】:

      我想通了。

      Json 应该像这样发送:

      xmlHttp.send("jsonObj="+jsonObj);
      

      而不是

      xmlHttp.send(jsonObj);
      

      为了接收它作为参数。

      【讨论】:

        猜你喜欢
        • 2014-12-06
        • 2016-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多