我正在尝试使用SmartGwt。我正在使用XJSONDatasource对SmartClient中具有JSON数据的示例页面进行跨域调用。但是,当我运行代码时,会出现一个弹出窗口,上面写着“查找符合您标准的记录......”这种情况永远不会消失,并且数据未加载。我正在使用SmartGwt的免费版本(我的公司已经说过这就是我们将要使用的)。希望我只是遗漏了一些明显的东西。
DataSource dataSource = new XJSONDataSource();
dataSource.setDataTransport(RPCTransport.SCRIPTINCLUDE);
dataSource.setDataFormat(DSDataFormat.JSON);
dataSource.setDataURL("http://www.smartclient.com/smartgwt/showcase/data/dataIntegration/json/contactsData.js");
DataSourceTextField nameField = new DataSourceTextField("name", "name");
nameField.setValueXPath("name");
dataSource.setFields(nameField);
ListGrid grid = new ListGrid();
grid.setDataSource(dataSource);
grid.setWidth100();
grid.setHeight(100);
grid.setAutoFetchData(true);
grid.draw();
答案 0 :(得分:4)
我从文档中看到:http://www.smartclient.com/smartgwt/javadoc/com/smartgwt/client/data/XJSONDataSource.html
注意,如教程中所示 以上,服务器负责 不仅写出数据,而且写出来 也是一个JavaScript函数调用 告诉客户端响应有 到达。客户端传递的名称 被称为“回调”的函数 网址参数。
但是您在www.smartclient.com/smartgwt/showcase/data/dataIntegration/json/contactsData.js链接页面的代码中没有这样的回调
答案 1 :(得分:3)
当您的smartGWT数据源调用此URL时:
http://www.smartclient.com/smartgwt/showcase/data/dataIntegration/json/contactsData.js
(如果您的数据源正在调用Java App,请转到此答案的底部)
您的数据源将发出的请求将包含一个名为callback的GET参数,如下所示:
callback=isc.Comm._scriptIncludeReply_0
脚本contactsData.js需要捕获此GET参数。
contactsData.js需要包含一个库来从URL中检索参数:
javascript检索参数功能:
function getParameter ( queryString, parameterName ) {
// Add "=" to the parameter name (i.e. parameterName=value)
var parameterName = parameterName + "=";
if ( queryString.length > 0 ) {
// Find the beginning of the string
begin = queryString.indexOf ( parameterName );
// If the parameter name is not found, skip it, otherwise return the value
if ( begin != -1 ) {
// Add the length (integer) to the beginning
begin += parameterName.length;
// Multiple parameters are separated by the "&" sign
end = queryString.indexOf ( "&" , begin );
if ( end == -1 ) {
end = queryString.length
}
jQuery检索参数功能
http://ajaxcssblog.com/jquery/url-read-request-variables/
获得回调参数的值后,您将使用JSON作为响应正文中的参数来编写函数名称,如下所示:
isc.Comm._scriptIncludeReply_0({"item": [ {"id": "1","name": "Monkey"},
{"id": "2","name": "Tree"},
{"id": "3","name": "Banana"} ] })
所以javascript代码看起来像这样:
Response.Write(getParameter(URLrequestFromDatasourceString,"callback") + " ( " + JSON + " )" );
<强> JAVA 强>
如果您的smartGWT数据源调用Java应用程序URL:
http://www.smartclient.com/getJson.htm
您的Java控制器将执行相同的操作但更容易
String callbackString = request.getParameter("callback");
response.setContentType("text/X-JSON");
response.getWriter().write( callbackString + " ( " + JSONstring + " ) " );
response.setStatus(HttpServletResponse.SC_OK);