【问题标题】:Null or empty JSON object from AJAX request来自 AJAX 请求的空或空 JSON 对象
【发布时间】:2016-08-26 17:11:37
【问题描述】:

最终删除了我之前发布的另一个与此相关的问题,因为它已经过时并且还有另一件事需要解决。下面的答案非常清楚,比其他答案更清楚,我相信这对其他有类似困惑的人会有所帮助。

基本上我想在 Java 中使用来自客户端 JS 的字符串。下面我的 JS 警报工作正常,但是我的 JSON 对象在我的 Servlet 中为空或为空。我真的只需要一个字符串传递给我的 servlet,这样我就可以运行 SQL 查询,但是我遇到了很多麻烦。

谢谢!

html文件

       <div class="jumbotron" id="jumboframe">
            <h1>Enter your URL below</h1>
            <input class="txtUrl" type="text" id="txtUrl" value="...." onfocus="if(this.value == '....') { this.value = ''; }"/>
            <p><a class="btn btn-lg submitButton" href="testpage.html" onclick="getURL()" role="button">Start searching!</a></p>
        </div>

        <script>
            function getURL() {
                var urlString = document.getElementById("txtUrl").value;
                var params = {url: urlString};


            $.ajax({
                    type: "POST",
                    url: "testpage.html",
                    contentType: "application/json",
                    dataType: "text", // "JSON" here doesn't call alerts below
                    data: {
                        'url': urlString
                    },

                    success: function(data) {
                        alert("did it!");
                        alert(JSON.stringify(params));
                        alert(JSON.stringify(data));
                    }
                });
            }
        </script>

Java 小服务程序

public class JavaServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {

    doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {

    PrintWriter out = response.getWriter();

    StringBuilder builder = new StringBuilder();
    BufferedReader reader = request.getReader();
    String line;
    while ((line = reader.readLine()) != null) {
        builder.append(line);
    }

    out.println(builder.toString());
    String url = request.getParameter("url");
    Map<String, String[]> map = request.getParameterMap();  // empty {}
    out.println(map.toString());  // null
    out.println(url);  // null

web.xml

  <servlet>
      <servlet-name>JavaServlet</servlet-name>
      <servlet-class>path.to.my.JavaServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>JavaServlet</servlet-name>
    <url-pattern>/testpage.html</url-pattern>
  </servlet-mapping>

再次感谢

【问题讨论】:

标签: javascript java json ajax servlets


【解决方案1】:

如果你想从请求数据中获取一个Json,那么你应该将它作为一个String传递,那么你的html可能看起来像这样(我已经将servlet路径更改为JavaServlet.do)

<div class="jumbotron" id="jumboframe">
            <h1>Enter your URL below</h1>
            <input class="txtUrl" type="text" id="txtUrl" value="...." onfocus="if(this.value == '....') { this.value = ''; }"/>
            <p><a class="btn btn-lg submitButton" href="#" onclick="getURL()" role="button">Start searching!</a></p>
        </div>

        <script>
            function getURL() {
                var urlString = document.getElementById("txtUrl").value;
                var params = {url: urlString};

                var jsonDataStr = JSON.stringify(params); // Here you get the json String
            $.ajax({
                    type: "POST",
                    url: "JavaServlet.do",
                    contentType: "application/json",
                    dataType: "text", // "JSON" here doesn't call alerts below * Because the servlet thrown an error, you should handle it *
                    data: jsonDataStr,
                    success: function(data) {
                        alert("Your URL is " + data); // **get the response text**
                        alert("Handle it");
                    },
                    error: function(data) { // Handle the error
                        alert(data.error().getResponseHeader());
                    }
                });
            }
        </script>

现在,JavaServlet 将接收 Json 作为字符串,您必须解析它(使用 Gson 等第三方库)。

public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {

    PrintWriter out = response.getWriter();

    StringBuilder builder = new StringBuilder();
    BufferedReader reader = request.getReader();
    String line;
    while ((line = reader.readLine()) != null) {
        builder.append(line);
    }

    String jsonString = builder.toString(); // get the json from client
    UrlDto urlDto = new Gson().fromJson(UrlDto.class,jsonString); // parse you json to Java object
    String yourUrl = urlDto.getUrl();
    out.print(yourUrl); // **Set the response text**
    out.close();        

WEB.XML 和 UrlDto

class UrlDto {
    private String url;
    // G&S ...
}

    <servlet>
        <servlet-name>JavaServlet</servlet-name>
        <servlet-class>servlet.JavaServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>JavaServlet</servlet-name>
        <url-pattern>/JavaServlet.do</url-pattern>
    </servlet-mapping>

希望对你有帮助

【讨论】:

  • 感谢您的帮助!我可以问一下更改 servlet 的 url 模式的意义吗?我之前将它定向到一个空白的 html 文件,该文件最终将在 postgresql 中处理和查询字符串后显示响应。
  • 我只是不确定如何处理您在那之后创建的“yourUrl”字符串变量。我从与 servlet 相同的包中的类初始化了一个新对象,但从方法调用或任何类型的打印语句中什么也得不到
  • 我更改了 url 模式,因为它有点令人困惑。请注意,您正在进行异步调用,因此当您进行页面重定向时响应可能不可用。成功和错误应该由 ajax 调用中的成功和错误处理程序处理。见编辑。现在 servlet 设置响应文本,ajax 调用将其作为成功处理程序中的“数据”接收。
  • 太好了,一切正常!对于一个大型的个人项目来说,本周末这是一个非常令人头疼的问题,而且我以前从未使用过服务器端 Java。我错过了有关此问题的全局,您的代码帮助我了解发生了什么。为下一步准备好我的源代码中的字符串,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
  • 2014-05-06
  • 1970-01-01
  • 1970-01-01
  • 2017-03-22
  • 1970-01-01
  • 2015-02-12
相关资源
最近更新 更多