Board logo

标题: 使用 GWT 和 RESTful Web 服务构建动态的组织树(6) [打印本页]

作者: look_w    时间: 2018-9-3 12:54     标题: 使用 GWT 和 RESTful Web 服务构建动态的组织树(6)

EmployeeRpcCallback 中的 processResponse 方法(清单 12 中的第 8 - 25 行)处理 RESTful Web 服务服务器返回的字符串。这个字符串包含 JSON 格式的职员数据。这个方法使用 GWT JSON 实用程序类解析 JSON 字符串,把详细的职员数据存储在应用程序对象 EmployeeItemData 中(这个对象包含在类成员 treeItem 中)。然后,它把 dataReady 标志设置为 true,表示在用户下一次单击这个节点时不需要向 RESTful Web 服务请求职员数据。最后,方法打开一个弹出窗口以显示职员的详细信息。
清单 12. edu.ucar.cisl.gwtRESTTutorialView.client.callback.EmployeeRpcCallback
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
1.  package edu.ucar.cisl.gwtRESTTutorialView.client.callback;

2.  import com.google.gwt.json.client.JSONObject;
3.  import com.google.gwt.json.client.JSONParser;
4.  import com.google.gwt.json.client.JSONValue;

5.  import edu.ucar.cisl.gwtRESTTutorialView.client.EmployeePopup;
6.  import edu.ucar.cisl.gwtRESTTutorialView.client.bean.EmployeeItemData;
7.  import edu.ucar.cisl.gwtRESTTutorialView.client.bean.ItemData;

8.  public class EmployeeRpcCallback extends RestServiceRpcCallback {
9.      protected void processResponse(String response) {
10.         JSONValue jsonValue = JSONParser.parse(response);
11.         ItemData iData = (ItemData) treeItem.getUserObject();
12.         JSONObject jobj = jsonValue.isObject();
13.         EmployeeItemData eItemData = (EmployeeItemData) iData;
14.         eItemData.setId((int) jobj.get("id").isNumber().doubleValue());
15.         eItemData.setFirstName(jobj.get("firstName").isString().stringValue());
16.         eItemData.setNickName(jobj.get("nickName").isString().stringValue());
17.         eItemData.setLastName(jobj.get("lastName").isString().stringValue());
18.         eItemData.setPhone(jobj.get("phone").isString().stringValue());
19.         eItemData.setEmail(jobj.get("email").isString().stringValue());
20.         eItemData.setTitle(jobj.get("title").isString().stringValue());
21.         iData.setDataReady(true);
22.         int left = treeItem.getAbsoluteLeft() + 50;
23.         int top = treeItem.getAbsoluteTop() + 30;
24.         EmployeePopup.show(left, top, (EmployeeItemData) eItemData);
25.     }
26.     }




OrganizationRpcCallback 中的 processResponse 方法(清单 13 中的第 10 – 31 行)处理 RESTful Web 服务服务器返回的组织数据。与职员数据一样,返回的组织数据也是 JSON 字符串。组织数据包含组织单元的详细信息,以及这个组织单元中的职员和直接子组织的部分信息。这个方法使用 GWT JSON 实用程序类解析 JSON 字符串,把详细的组织数据存储在应用程序对象 OrganizationItemData 中(这个对象包含在类成员 treeItem 中)。然后,它把 dataReady 标志设置为 true,表示详细的组织数据已经放在内存中了。该方法调用 processEmployees 方法处理组织单元中职员的数据,调用 processSubOrgs 处理子组织的数据。最后,如果事件是 Select,它会打开一个弹出窗口以显示详细的组织信息,比如完整名称、负责人姓名和头衔以及职员总数(包括在所有子组织中工作的职员)。
processEmployees 方法(第 44 – 54 行)处理包含职员数据的 JSON 数组。它提取每个职员的 id 和 displayName,创建应用程序对象 EmployeeItemData,创建 TreeItem 部件并把应用程序对象与部件绑定起来。
processSubOrgs 方法(第 32 – 43 行)处理 JSON 数组中的每个子组织。它提取 id 和 displayName,把它们存储在应用程序对象 OrganizationItemData 中。然后,创建 TreeItem 部件并把应用程序对象与部件绑定起来。在桌面文件管理器应用程序中,可以有空的文件夹。但是,在 GWT 中不支持这种做法。按照惰性装载策略,在创建组织 TreeItem 部件时,还没有创建所有子部件所需的数据。但是,需要让这个部件看起来像一个组织(树节点),而不是像职员(树叶)。为了解决这个问题,我创建了一个假的子 TreeItem 部件并把它设置为不可见(第 39、40 行)。
清单 13. edu.ucar.cisl.gwtRESTTutorialView.client.callback.OrganizationRpcCallback
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
1.  package edu.ucar.cisl.gwtRESTTutorialView.client.callback;

2.  import com.google.gwt.json.client.JSONArray;
3.  import com.google.gwt.json.client.JSONObject;
4.  import com.google.gwt.json.client.JSONParser;
5.  import com.google.gwt.json.client.JSONValue;
6.  import com.google.gwt.user.client.ui.TreeItem;

7.  import edu.ucar.cisl.gwtRESTTutorialView.client.bean.EmployeeItemData;
8.  import edu.ucar.cisl.gwtRESTTutorialView.client.bean.OrganizationItemData;
9.  import edu.ucar.cisl.gwtRESTTutorialView.client.OrganizationPopup;

10. public class OrganizationRpcCallback extends RestServiceRpcCallback {
11.     protected void processResponse(String response) {
12.         JSONValue jsonValue = JSONParser.parse(response);
13.         OrganizationItemData
oItemData = (OrganizationItemData) treeItem.getUserObject();
14.         JSONObject jobj = jsonValue.isObject();
15.         oItemData.setId((int) jobj.get("id").isNumber().doubleValue());
16.         oItemData.setDisplayName(jobj.get("acronym").isString().stringValue());
17.         oItemData.setName(jobj.get("name").isString().stringValue());
18.         oItemData.setLeadName(jobj.get("leadName").isString().stringValue());
19.         oItemData.setLeadTitle(jobj.get("leadTitle").isString().stringValue());
20.         oItemData.setTotalEmployees((int)
21.            obj.get("totalEmployees").isNumber().doubleValue());
22.         oItemData.setDataReady(true);
23.         treeItem.setText(oItemData.getDisplayName());
24.         processEmployees(jobj.get("employees").isArray());
25.         processSubOrgs(jobj.get("subOrgs").isArray());
26.         if (getEventType() == EventType.SELECT_EVENT) {
27.             int left = treeItem.getAbsoluteLeft() + 50;
28.             int top = treeItem.getAbsoluteTop() + 30;
29.             OrganizationPopup.show(left, top, (OrganizationItemData) oItemData);
30.         }
31.     }

32.     protected void processSubOrgs(JSONArray jsonArray) {
33.         for (int i = 0; i < jsonArray.size(); ++i) {
34.             JSONObject jo = jsonArray.get(i).isObject();
35.             OrganizationItemData iData = new OrganizationItemData();
36.             iData.setId((int) jo.get("id").isNumber().doubleValue());
37.             iData.setDisplayName(jo.get("acronym").isString().stringValue());
38.             TreeItem child = treeItem.addItem(iData.getDisplayName());
39.             TreeItem dummy = child.addItem("");
40.             dummy.setVisible(false);
41.             child.setUserObject(iData);
42.         }
43.     }

44.     protected void processEmployees(JSONArray jsonArray) {
45.         for (int i = 0; i < jsonArray.size(); ++i) {
46.             JSONObject jo = jsonArray.get(i).isObject();
47.             EmployeeItemData eData = new EmployeeItemData();
48.             eData.setId((int) jo.get("id").isNumber().doubleValue());
49.             eData.setDisplayName(jo.get("name").isString().stringValue());
50.             eData.setDataReady(false);
51.             TreeItem child = treeItem.addItem(eData.getDisplayName());
52.             child.setUserObject(eData);
53.         }
54.     }
55.     }






欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0