formButton.addClickListener( new ClickListener() { public void onClick(Widget sender) { // disable button … // collect inputs … // send request … // start timer to get results in interval … } }); //add button to rootPanel RootPanel.get("runSlot").add(formButton);
在开发过程中,主要使用 JSONValue 的 toString() 方法来将 JSON Java 对象编码成 JSON 格式的字符串,传到服务器端;使用 JSONParser.parse(String input) 来将服务器端返回的 JSON 格式字符串解析成为 JSON Java 对象。
开发过程如下:
在示例程序中收集界面输入参数,并创建 JSONObject inputs。
清单 5. 收集界面中用户输入参数,并转换为 GWT JSON 类// collect inputs JSONObject inputs = new JSONObject(); int caseNum = Integer.parseInt(testCaseNumText.getText()); inputs.put("caseNum", new JSONString(testCaseNumText.getText())); JSONArray suitesArray = new JSONArray(); int j = 0; for (int i = 0; i < suiteNameListBox.getItemCount(); i++) { if (suiteNameListBox.isItemSelected(i)) { suitesArray.set(j, new JSONString(suiteNameListBox .getValue(i))); j++; } } inputs.put("testSuites", suitesArray);
使用 RequestBuilder 来发送 HTTP 请求,将上一步中生成的 JSON 数据 inputs 发送的服务器端。
首先建立 RequestBuilder。RequestBuilder 用来建立 HTTP GET 和 POST 请求。创建 RequestBuilder 的时候,可以选择 GET 或 POST 发送方法,同时需要指定要发送到 URL。通常情况下,如果 Server 端代码也是在同一个 GWT 项目中开发,那么 URL 的前缀是 GWT.getModuleBaseURL,再加上 servlet 的 URL 就可以组成完整的 URL。 在本示例程序中,GWT.getModuleBaseURL 的值为 :8888/unitTest.MainApplication/。
清单 6 . 建立使用 POST 请求发送 URL 为 :8888/unitTest.MainApplication/runTest 的 builderRequestBuilder builder = new RequestBuilder(RequestBuilder.POST, GWT.getModuleBaseURL()+ "/runTest");
发送客户端请求到服务器端。客户端会发送两种请求信息。
请求开始服务器端的测试。请求信息为编码的 JSON 字符串。调用 inputs.toString() 方法,GWT 将把 inputs 对象进行 JSON 编码, 并输出编码后的字符串。
清单 7. 发送 JSON 格式参数并指定使用 StartUnitTestRequestCallback 处理返回信息builder.sendRequest(inputs.toString(),new StartUnitTestRequestCallback());
请求获取当前服务器端已经测试完毕的 TestCase 执行结果。请求信息为字符串“getRuntimeResults”。
清单 8. 发送字符串并指定 RetrieveRuntimeResultsRequestCallback 处理返回信息refreshRequest= builder.sendRequest("getRuntimeResults", new RetrieveRuntimeResultsRequestCallback(caseNum, suiteNum, this));
客户端发送字符串“getRuntimeResults”到服务器端,服务器端将会返回当前已经测试完毕的 TestCase 的结果。RetrieveRuntimeResultsRequestCallback 会处理返回信息。
客户端会按一定时间间隔,反复发送请求 getRuntimeResults 到服务器。服务器端将实时返回当前测试结果。客户端接收到后实时刷新页面。当客户端得到所有单元测试结果时,停止发送请求,并更新页面到初始状态。
定时器实现继承了 GWT 提供的 Timer。见 ,如何启动 Timer。
清单 9. 使用 UIRefreshTimer 来重复调用函数,时间间隔为 1 秒Timer t = new UIRefreshTimer(caseNum, suiteNum); t.scheduleRepeating(1000);
运行时,发送的 JSON 编码的请求信息如下:{"caseNum":"3", "testSuites":["TestSuite2","TestSuite3","TestSuite5"]}。
在 RequestCallback 的 onResponseReceived() 方法中处理 HTTP 请求返回的信息。示例程序中,定义了 2 种 callback,分别对应客户端 2 种 HTTP 请求。StartUnitTestRequestCallback 根据返回信息来更新界面状态条的文字。RetrieveRuntimeResultsRequestCallback 会处理当前服务器端已经完成的测试程序的结果信息。返回的测试结果信息已经被服务器端编码为 JSON 格式的字符串。RetrieveRuntimeResultsRequestCallback 将在 onResponseReceived() 方法里使用 GWT 的 JSON 工具解析 JSON 字符串并将结果数据显示在页面上。
客户端使用 GWT 的 JSONParser 来解析返回的 JSON 数据。 给出了例子,如何实现 Callback 的 onResponseReceived 方法,以及如何转换 JSON 格式字符串为 GWT 的 JSON Java 对象并在界面上显示出来。
清单 10. RetrieveRuntimeResultsRequestCallback 的 onResponseReceived 实现public void onResponseReceived(Request request, Response response) { if (response.getStatusCode() == 200) { String respText = response.getText(); //parse JSON encoded string JSONValue respValue = JSONParser.parse(respText); JSONArray trArray = respValue.isArray(); if (trArray != null) { // refresh components if (trArray.size() == caseNum * suiteNum) { timer.cancel(); formButton.setEnabled(true); statusLabel.setText("Test complete !"); formButton.setText("Run Test"); } // refresh test results ui resultsGrid.resize(trArray.size(), 4); for (int i = 0; i < trArray.size(); i++) { JSONObject tr = trArray.get(i).isObject(); if (tr != null) { resultsGrid.setWidget(i, 0, new Label(tr .get("name").isString().stringValue())); resultsGrid.setWidget(i, 1, new Label(tr.get( "start").isString().stringValue())); resultsGrid.setWidget(i, 2, new Label(tr.get("end") .isString().stringValue())); resultsGrid.setWidget(i, 3, new Label(tr.get( "result").isString().stringValue())); resultsGrid.getCellFormatter().setStyleName( i,3,z tr.get("result").isString().stringValue() .equals("PASS") ? "green" : "red"); } } } } else { Window.alert("Error occurred - statusCode:" + response.getStatusCode()); } }
示例程序以 GWT 的 RemoteServiceServlet 类作为服务器端请求响应的 servlet 的基类。并且使用了 SOJO 作为服务器端 JavaBean 和 JSON 格式数据相互转换的工具,来处理 JSON 格式的信息。
模拟测试过程