Java 请求调度程序导致jQuery的$.get向页面文本发出警报

Java 请求调度程序导致jQuery的$.get向页面文本发出警报,java,jquery,ajax,servlets,get,Java,Jquery,Ajax,Servlets,Get,例如: 我有一个js,比如: $.get('Test_Controller.html',function(response){ alert(response); }); 在我的Test\u Controller.htmlservlet中,我有: request.setAttribute("test","testData"); RequestDispatcher requestDispatcher = request.getRequestDispatcher("/

例如:

我有一个js,比如:

$.get('Test_Controller.html',function(response){ 
   alert(response);
});
在我的
Test\u 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()使页面不会重新加载,但不幸的是,当我没有发送响应时,我的响应对象似乎为空,当我发送并转发时,当我通知响应时,它会通知页面的文本。

您想将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 ....");
}
$.get(....., function(data) {
    try {
        // convert the text to JSON
        data = jQuery.parseJSON(data);
    } catch (e) {
        alert("Problem reading data: "+e);
    }
    ... use the JSON data ...
}
这就是全部内容(显然是将servlet连接到
web.xml
中的URL)。您的
$.get()
应该可以看到您在编写器中写入的内容

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

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
    response.setContentType("application/json");
    Writer w = response.getWriter();
    w.append("... your json here ....");
}
$.get(....., function(data) {
    try {
        // convert the text to JSON
        data = jQuery.parseJSON(data);
    } catch (e) {
        alert("Problem reading data: "+e);
    }
    ... use the JSON data ...
}

在本例中,最终响应来自test.jsp,因为您已将请求转发到test\u 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);
%>

快乐编码

在test.jsp中获取对象


为什么你要准备一份回复然后转发到另一页?在您编写了json之后,响应还没有准备好吗?如果您确实需要调用
test.jsp
,为什么不从
test.jsp
内部生成json?请检查我更新的问题以获得澄清。感谢您的编辑,我再也看不到关于json的任何提及。您现在正在从JSP内部编写JSON吗?请澄清。无论如何,要获取request.setAttribute()内容,不能将其作为url参数传递吗?例如
$.get('Test\u Controller.html?Test=testData')
@geert3只是为了澄清
Test
不是jsp中的变量。。它是servlet中的K,V对,在本例中,它恰好是一个值为
“testData”
request.setAttribute(“test”,“testData”)的字符串不会向响应发送任何内容。我认为你应该读一读请求/响应的一般概念。请看下面我的答案,试试看。应该按原样工作。使用
w.append()
时,我可以在
append()中放置一个对象吗?例如,包含许多属性的
testData
?不,编写器需要
String
s(
CharSequence
s)。可能有许多实用性类(甚至在Java API中)可以将您拥有的任何名称/值类型(HashMap?Properties?)转换为可读的JSON。请参阅主要答案中的我的澄清。您对此有何收获?您好,感谢您对最终响应的澄清。。有没有一种方法可以在不使用JSON和dispatcher的情况下将请求属性传递回$.get()的响应?是的。在Test_Controller.html中我们可以这样写:我建议您使用jsp页面,而不是使用html。在这种情况下,您可以在Test_Controller.jsp中编写:只是为了澄清。。Test\u Contoller.html
是一个映射的servlet。然后在您的Servelt中,我们可以编写-public void doGet(HttpServletRequest,HttpServletResponse)抛出IOException,ServletException{TestData TestData=new TestData();response.setContentType(“text/html”);PrintWriter out=response.getWriter();out.println(TestData);}