【问题标题】:jsp page being overwritten by JSON data being sent from Servletjsp 页面被从 Servlet 发送的 JSON 数据覆盖
【发布时间】:2018-07-06 05:45:30
【问题描述】:

我正在尝试将 JSON 数据从 servlet 发送到我的 JSP 页面。 一旦我运行 JSP,整个 JSP 就会被 JSON 内容覆盖。为什么会这样?这是我的 JSP 页面的一部分。

    <%@ page import="java.util.ArrayList" %>
    <head>
    <script>
    function populateTypeOfWork(workType) {
        var xhttp = new XMLHttpRequest();
        xhttp.onreadystatechange = function () {
            if (this.readyState == 4 && this.status == 200) {
                var work = JSON.parse(this.responseText);
                workType.options.length = 0;
                for (i = 0; i < work.length; i++) {
                    createOption(workType, workDesc[i], workDesc[i]);
                }
            }
            xhttp.open("GET", "ServletRequest", true);
            xhttp.send();
        }
    }
    function createOption(dropdown, text, value) {
        var x = document.createElement('option');
        x.value = value;
        x.text = text;
        dropdown.options.add(x);
    }
</script>
</head>
<body>
    <label>Work Category **</label>
  <select id="workCategory" 
   onchange="populateTypeOfWork(document.getElementById('workTypeDesc1'))" 
   size=1
    style="width:95%;" required>
  <option value="" selected>Select A Work Category</option>
   <% ArrayList workCategory = (ArrayList) 
 request.getAttribute("workCategory");
    for (int i = 0; i < workCategory.size(); i++) {
%>
<option value="<%=workCategory.get(i)%>"><%=workCategory.get(i)%>
</option>
<% } %>
</select>&nbsp;<br>

<label>Type Of Work **</label>
<select id="workTypeDesc1" size=1 style="width:95%;" required>
<option value="" selected>Type of Work</option>
</select>
</body>
</html>

小服务程序

    String json = new Gson().toJson(arraylistvar);
    res.setContentType("application/json");
    PrintWriter pw = res.getWriter();
    pw.flush();
    pw.close();
    req.setAttribute("viewURL","/page1.jsp");

为什么 stackoverflow 一直要求我添加更多详细信息?因为它主要是代码..??我为什么要不必要地填写这个帖子?

【问题讨论】:

    标签: json jsp servlets


    【解决方案1】:

    我可以看到当前代码存在两个问题:(1)您引用了一个不存在的变量 workDesc;看来您应该引用名为 work 的变量,并且 (b) 发送 AJAX 请求的代码位于 onreadystatechange() 事件处理程序中,而实际上它应该在事件处理程序设置后立即执行。这是修改后的代码sn-p:

    xhttp.onreadystatechange = function () {
        if (this.readyState == 4 && this.status == 200) {
            var work = JSON.parse(this.responseText);
            workType.options.length = 0;
            for (i = 0; i < work.length; i++) {
                createOption(workType, work[i], work[i]);
            }
        }
    }
    xhttp.open("GET", "ServletRequest", true);
    xhttp.send();
    

    【讨论】:

    • 哦,对 workDesc 感到抱歉。你是什​​么意思代码应该在事件处理程序设置后立即执行?我该怎么做?顺便说一句,我认为这不是 jsp 方面的问题,因为如果我注释掉 AJAX 代码,整个 JSP 仍然会被 JSON 数组覆盖。
    • 我修复了修改后的代码 sn-p;记下对 open() 和 send() 的调用在哪里。
    • 感谢您指出这一点。我想到了另一个问题。我的 JSP 位于 projWebApp/proj1/Mypage.jsp 中。 Servlet 在 projWebApp//WEB-INF/classes/servlet/ServletRequest.java 中。 xhttp.open("....") 中的 servlet 路径应该是什么?
    • WEB-INF/classes下的文件应该是*.class文件,而不是*.java文件(*.class文件是从*.java文件编译的。)请求路径可以设置在 web.xml 文件或 Java Servlets 的最新版本中,可以通过 ServletRequest 类的注释直接在 ServletRequest.java 中指定。要知道如何进一步提供帮助,我需要知道您正在使用什么 IDE(集成开发环境)(如果有的话),以及您如何从其源代码构建应用程序。
    • 我强烈推荐此页面以供进一步阅读:stackoverflow.com/tags/servlets/info
    【解决方案2】:

    这可能与从您的网页发出请求的方式有关。您应该使用 AJAX 调用;确保您没有提交普通表单或在 JavaScript 中更改页面的 URL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-20
      • 2014-09-30
      • 2013-08-13
      • 1970-01-01
      • 2016-10-10
      • 1970-01-01
      • 2014-10-09
      相关资源
      最近更新 更多