使用 GWT 和 RESTful Web 服务构建动态的组织树(6)
 
- UID
- 1066743
|

使用 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.EmployeeRpcCallback1
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.OrganizationRpcCallback1
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. }
|
|
|
|
|
|
|