【问题标题】:No parameters visible in Servlet when contentType is application/json当 contentType 为 application/json 时,Servlet 中看不到任何参数
【发布时间】:2015-10-29 09:34:55
【问题描述】:

我正在尝试使用 jquery 向 Servlet 发出 ajax 请求的简单程序

var searchObject = new Object();
searchObject.search1='abc';
searchObject.search2='xyz';
console.log(JSON.stringify(searchObject));
$.ajax({
    url: "SearchServlet",
    type: 'post',
    data: {data:JSON.stringify(searchObject)},
    contentType: 'application/json',
    mimeType: 'application/json',

    success: function (data) {
        console.log("Posted!!");
    }
});

以下是登录控制台的内容。

{"search1":"abc","search2":"xyz"}

在 SearchServlet 下面是方法

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println(request.getParameterMap());
        Enumeration<String> names = request.getParameterNames();
        System.out.println(names.hasMoreElements());
        while(names.hasMoreElements()){
            System.out.println(request.getParameter(names.nextElement()));
        }
    }

打印出来的

{}
false

当ajax请求中指定的contentType'application/json'

和打印

{data=[Ljava.lang.String;@7eedec92}
true
{"search1":"abc","search2":"xyz"}

contentType 从 jquery ajax 请求代码中被注释掉时。

我想了解

  1. 为什么当 contentType 为 应用程序/json ?
  2. 如何在请求时访问参数 contentType 是 application/json。

【问题讨论】:

  • 查看这个答案。可能是重复的stackoverflow.com/questions/3831680/…
  • 谢谢。那篇文章似乎回答了我的问题。将在几分钟内尝试并关闭此问题
  • 这回答了我的问题 pdem。我不确定是否保留或删除此问题。
  • 保留它,它可能对索引有用。有人可能会问同样的问题
  • 你可以回答这个问题,我可以接受吗?快速浏览一下,这个问题似乎没有答案

标签: java jquery json ajax servlets


【解决方案1】:

在这种情况下不能使用参数,因为发布数据不是来自 HTML 表单。相反,您可以解析表单数据中包含的 Json,例如使用 Jackson:

protected void doPost(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
PrintWriter out = response.getWriter();

ObjectMapper mapper = new ObjectMapper();

try {
  // read from stream, convert it to generic class
  Map data = mapper.readValue(request.getReader(), Map.class);

} catch (JsonGenerationException e) {
  e.printStackTrace();
} catch (JsonMappingException e) {
  e.printStackTrace();
} catch (IOException e) {
  e.printStackTrace();
}


}

若要在 maven 项目中使用 Jackson,请添加此依赖项:

    <dependency>
        <groupId>com.fasterxml.jackson.jaxrs</groupId>
        <artifactId>jackson-jaxrs-json-provider</artifactId>
        <version>2.5.4</version>
    </dependency>

另请参阅有关同一主题的其他答案: HttpServletRequest get JSON POST data

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-20
    • 2013-03-11
    • 1970-01-01
    • 2013-05-08
    • 2018-01-24
    • 1970-01-01
    • 2011-02-20
    • 2014-04-27
    相关资源
    最近更新 更多