手順 - Ajax リクエストのバッチ処理
同じ URL に多数の Ajax リクエストを実行する必要がある場合は、JavaScript の BatchRequest オブジェクトを使って、ネットワークトラフィックを減らすことができます。作成した BatchRequest オブジェクトには、1 回のバッチリクエストで送信するリクエストの最大数、リクエスト処理のために呼び出す URL、成功時または失敗時のコールバックメソッドを指定したコンフィギュレーションオブジェクトを渡します。次に BatchRequest オブジェクトにリクエストを追加します。バッチの最大数に達したとき、または、500 ミリ秒が経過したときに、バッチが自動的にサーバーに非同期で送信されます。一方で、BatchRequest オブジェクトへのリクエストの追加は続行できます。
BatchRequest オブジェクトは、呼び出し元のページが生きているかぎり、存在します。ユーザーが現在のページから移動すると、BatchRequest は強制終了され、処理されていないリクエストは削除されます。
次に示すのは、JavaScript で BatchRequest を作成する方法の例です。完全なメソッドは、numericJSRenderer.jsfrag を参照してください。
try {
if(!jsca.columns.numericRenderer.batchRequests) {
jsca.columns.numericRenderer.batchRequests = new PTC.jca.
batch.BatchRequest({
url: getBaseHref() + "ptc1/numeric/",
maxBatchSize: 50,
successCallback: function(response) {
var result = PTC.decode(response.responseText);
for (var i=0,length=result.length; i < length; i++) {
$(jsca.columns.numericRenderer.uniqueIdPrefix +
result[i].uniqueId).innerHTML =
result[i].displayValue;
}
},
failureCallback: function(response) {
jsca.columns.numericRenderer.log.error
("ERROR in jsca.columns.numericRenderer()
getting numeric component data for displaying.");
}
});
}
} catch(e) {
// Handle error that could be thrown when creating BatchRequest
}
バッチリクエストを作成すると、その addRequest() メソッドを呼び出してリクエストを追加し、requestHandler.doRequest() メソッドに送るパラメータを渡します。
jsca.columns.numericRenderer.batchRequests.addRequest({
type : data.type,
externalForm : data.rawValue,
isPercent : data.isPct,
isCurrency : data.isCurrency,
uniqueId : uniqueId
});
この例では、バッチリクエストは、NumericController と呼ばれるサーブレットエンジンコントローラクラスに送信されます。個々のリクエストは、ページに表示する必要のある数値についての情報を渡します。コントローラは個々のリクエストをループ処理し、Java クラスを呼び出して、その数値をローカライズした表示値を作成し、JSONObject の JSONArray を返します。JSONObject はそれぞれ、表示値と、ページの HTML div タグの ID に対応した一意の ID を含みます。成功時のコールバック関数が div タグの内容を表示値に置き換えます。
コントローラクラスを使ってバッチリクエストを処理する場合は、Spring @Controller および @RequestMapping アノテーションを付ける必要があります。NumericController クラスの一部を次に示します (完全なクラスは、NumericControllerを参照してください)。
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
.
.
.
@Controller
@RequestMapping(value = "/numeric/**")
public class NumericController {
@RequestMapping(method = { RequestMethod.POST, RequestMethod.PUT })
protected void convertToString(
@RequestParam("data") final String data,
HttpServletRequest request, HttpServletResponse response) throws IOException {
JSONArray result = new JSONArray();
try {
JSONArray requests = new JSONArray(data);
for (int i = 0; i < requests.length(); i++) {
JSONObject req = requests.getJSONObject(i);
try {
String type = req.getString("type");
String externalForm = req.getString("externalForm");
String isPercent = req.optString("isPercent");
String isCurrency = req.optString("isCurrency");
String uniqueId = req.getString("uniqueId");
String displayValue = NumericFormat.formatValueForDisplay(type,
externalForm,
Boolean.valueOf(isPercent), Boolean.valueOf(isCurrency));
JSONObject singleResponse = new JSONObject();
singleResponse.put("displayValue", displayValue);
singleResponse.put("uniqueId", uniqueId);
result.put(singleResponse);
} catch (Exception e) {
.
.
.
}
}
response.setContentType("application/json; charset=UTF-8");
PrintWriter out = response.getWriter();
out.print(result.toJSONString());
} catch (Exception e) {
log.error("Problem displaying and formatting
number in NumericController.", e);
}
これは役に立ちましたか?