GWT入门介绍(使用JSON格式的数据通讯)

GWT入门介绍(使用JSON格式的数据通讯)

JSON 是什么?

JSON的全称是JavaScript Object Notation,是一种轻量级的数据交换格式。JSONXML具有相同的特性,例如易于人编写和阅读,易于机器生成和解析。但是JSONXML数据传输的有效性要高出很多。JSON完全独立与编程语言,使用文本格式保存。

 

JSON数据有两种结构:

  • Name-Value 对构成的集合,类似于Java中的Map
  • Value的有序列表,类似于Java中的Array

 

一个JSON格式的数据示例:

 {
  "Name": "Apple",
  "Expiry": "2007/10/11 13:54",
  "Price": 3.99,
  "Sizes": [
    "Small",
    "Medium",
    "Large"
  ]
}

 

更多关于JSON数据格式的说明参看JSON官方网站:http://www.json.org(中文内容参看:http://www.json.org/json-zh.html

 

GWTJSON

GWT中支持的客户端服务器端方法调用和数据传递的标准格式是RPC JSON并不是GWT支持的标准的数据传递格式。那么如何使用JSON来作为GWT的数据传递格式呢?需要以下几步。

第一,引用HTTPJSON支持。

第二,在客户端创建JSON数据,提交到服务器

第三,在服务器上重写数据格式解析的代码,使之支持JSON格式的数据

第四,在服务器上组织JSON格式的数据,返回给客户端。

第五,客户端解析服务器传回的JSON数据,正确的显示

 

引用HTTPJSON支持

找到.gwt.xml文件,在其中的

<inherits name='com.google.gwt.user.User'/>

在之后添加如下的内容:

    <inherits name="com.google.gwt.json.JSON"/>
    <inherits name="com.google.gwt.http.HTTP"/>

其中com.google.gwt.json.JSON指的是要使用JSONcom.google.gwt.http.HTTP值得是通过HTTP调用服务器上的服务方法。

 

客户端构造JSON数据

客户端需要使用com.google.gwt.json.client包内的类来组装JSON格式的数据,数据格式如下:

 

数据类型

说明

JSONArray

JSONValue构成的数组类型

JSONBoolean

JSON boolean

JSONException

访问JSON结构的数据出错的情况下可以抛出此异常

JSONNull

JSON Null根式的数据

JSONNumber

JSON Number类型的数据

JSONObject

JSON Object类型的数据

JSONParser

String格式的JSON数据解析为JSONValue类型的数据

JSONString

JSON String类型的数据

JSONValue

所有JSON类型值的超级类型

 

组合一个简单的JSON数据: 

JSONObject input = new JSONObject();
JSONString value = new JSONString("mazhao");
input.put("name", value);

JSON数据格式为:{name: "mazhao"}

 

组合一个包含数组类型的复杂JSON数据:

JSONObject input = new JSONObject();
JSONString value = new JSONString("mazhao");
input.put("name", value);

JSONArray arrayValue = new JSONArray();
arrayValue.set(0, new JSONString("array item 0"));
arrayValue.set(1, new JSONString("array item 1"));
arrayValue.set(2, new JSONString("array item 2"));
input.put("array", arrayValue);    

 

JSON数据格式为: 

 {name: "mazhao",

  array: {"array item 0", "array item 1", "array item 2"}}

 

注意上述的JSON类型的数据,使用的都是com.google.gwt.json.client包内的类型。这些类型最终会被编译为JavaScript执行。

 

服务端重写数据解析代码,支持JSON格式的数据

在服务器上,需要使用JSON Java支持类才能将JSON格式的数据转换为各种类型的数据,当然也可以自己写一些解析用的代码。这里我们使用了www.json.org上的代码来完成。这组代码与com.google.gwt.json.client的代码很相似,只是在org.json包内部。

怎么解析JSON术诀呢?针对上述中的复杂的JSON数据:

 {name: "mazhao",

  array: {"array item 0", "array item 1", "array item 2"}}

 

可以使用如下的方式解析:

JSONObject jsonObject = new JSONObject(payload);
String name = jsonObject.getString("name");

System.out.println("name is:" + name);
JSONArray jsonArray = jsonObject.getJSONArray("array");
for(int i = 0; i < jsonArray.length(); i++) {
    System.out.println("item " + i + " :" + jsonArray.getString(i));
}

其中payload指的是上述的JSON格式的数据。

 

那么如何写GWT Service来得到Payload的数据呢?需要两点,第一,需要建立一个Service类,第二,覆盖父类的processCall方法。

示例代码:

package com.jpleasure.gwt.json.server;

import com.google.gwt.user.client.rpc.SerializationException;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.jpleasure.gwt.json.client.HelloWorldService;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

/**
 * Created by IntelliJ IDEA.
 * User: vaio
 * Date: 2007-9-4
 * Time: 22:08:31
 * To change this template use File | Settings | File Templates.
 */
public class HelloWorldServiceImpl extends RemoteServiceServlet implements HelloWorldService {
    public String processCall(String payload) throws SerializationException {
        try {
            JSONObject jsonObject = new JSONObject(payload);
            String name = jsonObject.getString("name");

            System.out.println("name is:" + name);
            JSONArray jsonArray = jsonObject.getJSONArray("array");
            for(int i = 0; i < jsonArray.length(); i++) {
                System.out.println("item " + i + " :" + jsonArray.getString(i));
            }
        } catch (JSONException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }

        return "success";   
    }

 

在服务器上组织JSON格式的数据,返回给客户端

同上

 

客户端解析服务器传回的JSON数据,正确的显示

同上

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值