我是gwt的新手。并且需要知道如何在gwt中使用JSON,所以我尝试这个简单的数据加载器,但我仍然感到困惑
我在eclipse中创建了一个名为'tesdb3'的项目。我创建PHP端来访问数据库,并将输出作为JSON ..
我在文件夹war中创建userdata.php。然后我编译tesdb3项目。文件夹tesdb3和ward中的userdata.php在本地服务器中移动(我使用WAMP)。我把PHP放在文件夹tesdb3中。这是我的localhost / phpmyadmin / tesdb3 / userdata.php
[{"kode":"002","nama":"bambang gentolet"}{"kode":"012","nama":"Algiz"}]
从那个结果我认为PHP方面运行良好。
然后我创建UserData.java作为JSNI覆盖像这样:
package com.tesdb3.client;
import com.google.gwt.core.client.JavaScriptObject;
class UserData extends JavaScriptObject{
protected UserData() {}
public final native String getKode() /*-{ return this.kode; }-*/;
public final native String getNama() /*-{ return this.nama; }-*/;
public final String getFullData() {
return getKode() + ":" + getNama();
}
}
然后最后在tesdb3.java中:
public class Tesdb3 implements EntryPoint {
String url= "http://localhost/phpmyadmin/tesdb3/datauser.php";
private native JsArray<UserData> getuserdata(String json)
/*-{
return eval(json);
}-*/;
public void LoadData() throws RequestException{
RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, URL.encode(url));
builder.sendRequest(null, new RequestCallback(){
@Override
public void onError(Request request, Throwable exception) {
Window.alert("error " + exception);
}
public void onResponseReceived(Request request,
Response response) {
//1
//data(getuserdata(response.getText()));
//2
JsArray<UserData> uda = JsonUtils.unsafeEval(response.getText())
data(uda);
}
});
}
public void data(JsArray<UserData> data){
for (int i = 0; i < data.length(); i++) {
String lkode =data.get(i).getKode();
String lname =data.get(i).getNama();
Label l = new Label(lkode+" "+lname);
tb.setWidget(i, 0, l);
}
RootPanel.get().add(new HTML("my data"));
RootPanel.get().add(tb);
}
public void onModuleLoad() {
try {
LoadData();
} catch (RequestException e) {
e.printStackTrace();
}
}
}
我在onResponseReceived中使用的两种方法的结果是相同的。只显示字符串“我的数据”。
但是方法2创建了这样的错误:
14:41:59.875 [错误] [tesdb3]未捕获的异常已转义
com.google.gwt.core.client.JavaScriptException :( SyntaxError):语法错误
我是否错过使用第二种方法?
为什么方法1没有任何错误但无法显示数据?
答案 0 :(得分:3)
问题是你的JSON语法不正确,你在表的第一项之后缺少一个逗号,它应该是(为了可读性而添加了空格):
[
{
"kode": "002",
"nama": "bambang gentolet"
},
{
"kode": "012",
"nama": "Algiz"
}
]
由于JSON是JavaScript的一部分,因此可能是您获得的语法错误异常。
PS:我建议使用一些PHP框架为你创建JSON(Zend Framework是我的常用选择)。此外,像JSONLint这样的JSON验证器对于调试JSON非常有用。
答案 1 :(得分:2)
它看起来像是代码中的一个拼写错误,它带来了命名约定:对于变量和方法,使用驼峰大小写,从小写字符开始。因此UserData UD
应为UserData ud
。
在您的getuserdata
方法(应为getUserData
)中,您使用参数名称Json
和大写J
以及本地代码json
低j
。这解释了错误。
关于getUserData
方法。有一种GWT方法:JsonUtils.unsafeEval(json)
你应该使用它。
此外,onResponseReceived
中的代码似乎不完整,它可能不重要,因为它可能被错误地放在这个示例中,但只是为了完整,这里应该是这样的:
JsArray<UserData> uda = JsonUtils.unsafeEval(response.getText());
for (int i = 0; i < uda.length(); i++) {
UserData ud = uda.get(i);
String lKode = ud.getKode();
String lName = ud.getNama();
Label l = new Label(lKode + " " +lName);
RootPanel.get().add(l);
}