【问题标题】:Request Dispatcher causing $.get of jQuery to alert the text of the pageRequest Dispatcher 导致 jQuery 的 $.get 来提醒页面的文本
【发布时间】:2015-01-14 04:37:30
【问题描述】:

例如:

我有一个类似的js:

$.get('Test_Controller.html',function(response){ 
   alert(response);
});

在我的Test_Controller.html servlet 中我有:

    request.setAttribute("test","testData");
    RequestDispatcher requestDispatcher =
    request.getRequestDispatcher("/test.jsp");
    requestDispatcher.forward(request,response);

问题是:

为什么response会一直提醒test.jsp的文字内容而不是我通过getWriter()传递的JSON

编辑:

我需要得到:

  TestData testData = new TestData();
     request.setAttribute("test",testData);

使用 jQuery 的 $.get() 所以页面不会重新加载,但不幸的是,当我没有调度我的响应对象似乎是空的,当我调度和转发时,当我提醒响应时它会提醒页面的文本。

【问题讨论】:

  • 你为什么要准备一个响应然后转发到另一个页面?把json写进去后响应还没有准备好?如果您确实需要调用test.jsp,为什么不从test.jsp 内部生成json?
  • 请检查我更新的问题以获得澄清。谢谢
  • 在您编辑之后,我再也没有看到任何关于 json 的提及。您现在是从 JSP 内部编写 JSON 吗?请说清楚。无论如何要获得 request.setAttribute() 的东西,你不能将它作为 url 参数传递吗?比如$.get('Test_Controller.html?test=testData')
  • @geert3 只是为了清楚 test 不是来自 jsp 的变量。它是来自 servlet 的 K,V 对,在这种情况下,恰好是一个具有值 "testData" 的字符串
  • request.setAttribute("test","testData"); 不会向响应发送任何内容。我认为您应该阅读一下请求/响应的一般概念。请在下面查看我的答案并尝试一下。应该按原样工作。

标签: java jquery ajax servlets get


【解决方案1】:

您希望将一些信息从您的 servlet 中写回客户端。 您的 serlvet 可能如下所示:

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
    response.setContentType("application/json");
    Writer w = response.getWriter();
    w.append("... your json here ....");
}

这就是全部(显然将 servlet 连接到您在web.xml 中的 URL)。您的$.get() 应该会看到您写给作者的任何内容。

请注意,发送的内容(在 Java 中)和接收的内容(在 Javascript 中)都是 TEXT 字符串。您负责在 Java 端将数据转换为可读的 JSON,并在 Javascript 端将文本解释为 JSON。后者可以这样做:

$.get(....., function(data) {
    try {
        // convert the text to JSON
        data = jQuery.parseJSON(data);
    } catch (e) {
        alert("Problem reading data: "+e);
    }
    ... use the JSON data ...
}

【讨论】:

  • 当使用w.append() 时,我可以在append() 中放置一个对象吗?例如包含许多属性的testData
  • 不,作者要求Strings(准确地说是CharSequences)。可能有许多实用程序类(甚至在 Java API 中)可以将您拥有的任何名称/值类型(HashMap?属性?)转换为可读的 JSON。
  • 在主要答案中查看我的说明
  • 有什么运气吗?
【解决方案2】:

在这种情况下,最终响应来自 test.jsp,因为您已将请求转发到该 Test_Controller.html 中的 test.jsp。如果您想将该 json 数据打印到 test.jsp,那么您不需要将该请求转发到 test.jsp 页面。否则您也可以在其中创建该 json 文件 test.jsp 使用 scriplet 标记,如:

<% 
request.setAttribute("test","testData");
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
String json = new Gson().toJson(test);
response.getWriter().write(json);
%>

编码愉快!!!

【讨论】:

  • 您好,感谢您对最终响应的澄清。有没有办法在不使用 JSON 和调度程序的情况下将请求属性传递回 $.get() 的响应?
  • Yes.Inside Test_Controller.html 我们可以这样写: 我会建议你使用 jsp 页面而不是使用 html。在这种情况下,您可以在 Test_Controller.jsp 中编写:
  • 只是为了澄清.. Test_Contoller.html 是一个映射的 servlet。一个 .java 类。
  • ok。然后在你的Servlet中我们可以写- public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { TestData testData = new TestData(); response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println(testData); }
【解决方案3】:

test.jsp中获取对象。

<%
    TestData testData = (TestData) request.getAttribute("test");
    String testDataString = new GSON().toJson(testData);
    out.println(testDataString);
%>

Javascipt 使用 $.getJSON 而不是 $.get

$.getJSON('Test_Controller.html',function(responseJSON){ 
   alert(responseJSON);
 var testData = responseJSON;// Then you can accesss your class values.

 $.each(testData,function(key,value){
      alert("Key:-"+key+": Value:-"+value");
  }  );

});

【讨论】:

    猜你喜欢
    • 2019-10-07
    • 1970-01-01
    • 2014-10-07
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多