getJSON回调函数没有在js文件中调用

时间:2011-08-23 04:22:49

标签: jquery portlet getjson

在portlet中,我有一个JSP页面,我在其中声明了一个resourceURL并将其映射到一个具有覆盖的serveResource方法的Java类。

   <portlet:resourceURL var="myURL" >
    <portlet:param name="dataType" value="VOICE" />
</portlet:resourceURL>

我在js文件中有一个javascript,然后依次触发这样的ajax调用

$.getJSON(URL,{operator : 'XYZ'},function(b) {

        //mycode


        })

这个js被导入到jsp中。现在,当我点击链接时,它会触发javascript,ajax调用也会很好,并且请求会传递给java类。但是响应并没有回到回调函数。我怀疑是因为这是在一个单独的js文件中,响应是进入jsp页面而不是js文件中的回调函数。如果我把它作为内联脚本放在jsp中,这个完全相同的代码可以工作。但我需要将javascript代码放在一个单独的js文件中并使其工作。当我触发getJSON时,有没有办法传递一些上下文信息?有没有办法实现这个?

1 个答案:

答案 0 :(得分:0)

首先,请在您的javascript中检查您的网址,使其包含参数&#34; jsoncallback =?&#34;。

$.getJSON('http://mysite.com/my.jsp?jsoncallback=?',
  {operator : 'XYZ'},function(b) {

    //mycode

})

jQuery将在jsoncallback参数之后用ID替换最后一个问号。

此ID将在JSP的服务器端使用,以创建一个以ID值命名的函数开始的响应。

简单JSP示例:

<%@ page language="java" contentType="application/json" pageEncoding="UTF-8"%>
<%@ page import="java.io.*"%>
<%    
    PrintWriter writer = response.getWriter();
    String callback = request.getParameter("jsoncallback");

    if (callback != null && callback.length() > 1)
    {
        writer.write(callback + "({ \"mykey\" : \"myvalue\" });");
    }
%>

这会导致响应看起来像这样:

jQuery16205149872086476535_1314088378455({ "mykey" : "myvalue" });

所以在一个简短的回答中,如果你的json响应没有包含在这个函数名中,那么回调函数就不会触发,相反你会得到一个错误,你可以这样看到:

$.getJSON(URL,{operator : 'XYZ'},function(b) {

    //mycode

}).error(function(jqXHR, textStatus, errorThrown) {
    alert("Error: " + textStatus + " errorThrown: " + errorThrown);
})

希望这有帮助

帕特里克