JSON вместо RPC
Многократно упоминавшийся здесь фреймворк GWT (Google Web Toolkit) удобен, помимо всего прочего, тем, что в нем можно использовать удаленные процедуры. Об этому уже был топик и лишний раз достоинства RPC описывать не стоит. Однако обнаружился у этой технологии и существенный недостаток: его практически невозможно использовать с сервером Apache Felix. Дело в том, что OSGi-модули должны включать в себя все необходимые классы, а jar-архив, отвечающий в GWT за RPC слишком велик, чтобы конвертировать его в бандл.
Что же делать? Гонять по сети данные в xml-формате, выковыривая их из DOM-объектов всякими экзотическими способами? К счастью есть более адекватная (и, что немаловажно, более компактная) технология, поддерживаемая в GWT: это JSON (Java Script Object Notation).
JSON прост как 5 копеек и любой программист, мало-мальски знакомый с JavaScript легко поймет как с его помощью передаются данные. Но нас-то интересует другое: во-первых, как объекты JSON обрабатываются в GWT? Во-вторых, как их формировать на стороне сервера Apache Felix?
Начнем со второго. Для работы с JSON средствами Java на сайте этой технологии выложены необходимые классы. Их мало, они компактны, следовательно добавить их в OSGi-бандл не составит труда. Пользоваться этим API можно так. Например, передаем значения полей объекта, описываемого классом Tracker (для GPS-навигации):
При обращении к такому сервлету вернется примерно такая строка:
Допустим, мы обращаемся к сервлету посредством формы. Добавим к ней обработчик события onSubmitComplete, срабатывающего когда со стороны сервера возвращается результат:
На первый взгляд выглядит громоздко, но попробуйте реализовать это другими способами и станет понятно, что JSON изобрели не от нечего делать.
Что же делать? Гонять по сети данные в xml-формате, выковыривая их из DOM-объектов всякими экзотическими способами? К счастью есть более адекватная (и, что немаловажно, более компактная) технология, поддерживаемая в GWT: это JSON (Java Script Object Notation).
JSON прост как 5 копеек и любой программист, мало-мальски знакомый с JavaScript легко поймет как с его помощью передаются данные. Но нас-то интересует другое: во-первых, как объекты JSON обрабатываются в GWT? Во-вторых, как их формировать на стороне сервера Apache Felix?
Начнем со второго. Для работы с JSON средствами Java на сайте этой технологии выложены необходимые классы. Их мало, они компактны, следовательно добавить их в OSGi-бандл не составит труда. Пользоваться этим API можно так. Например, передаем значения полей объекта, описываемого классом Tracker (для GPS-навигации):
private class Tracker {
String name;
String icon;
String descr;
LatLonDateSpeed[] data;
}
private class LatLonDateSpeed {
String lt;
String ln;
Date dt;
int sp;
}
public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
res.setCharacterEncoding("UTF-8");
res.setContentType("text/plain");
Writer w = res.getWriter();
// Получаем каким-то образом информацию о трекерах
Tracker[] ta = getTrackers();
try{
JSONWriter jsw = new JSONWriter(w);
jsw.array();
for(Tracker t : ta){
jsw.object()
.key("name")
.value(t.name)
.key("descr")
.value(t.descr)
.key("icon")
.value(t.icon)
.key("data");
jsw.array();
for(LatLonDateSpeed llds : t.data){
jsw.object()
.key("lt")
.value(llds.lt)
.key("ln")
.value(llds.ln)
.key("dt")
.value(llds.dt)
.key("sp")
.value(llds.sp)
.endObject();
}
jsw.endArray();
jsw.endObject();
}
jsw.endArray();
w.flush();
}
catch(JSONException ex){w.write("");}
}
При обращении к такому сервлету вернется примерно такая строка:
[{"dt":"2011-05-07 16:56","name":"Tracker A","descr":"There is test tracker 'A'.","icon":"img/test_a.png","data":[{"lt":"55.891965","ln":"37.403763","dt":"11:16","sp":67}, ... и т.д.
Допустим, мы обращаемся к сервлету посредством формы. Добавим к ней обработчик события onSubmitComplete, срабатывающего когда со стороны сервера возвращается результат:
trackersForm.addSubmitCompleteHandler(new FormPanel.SubmitCompleteHandler(){
public void onSubmitComplete(FormPanel.SubmitCompleteEvent e){
String s = e.getResults().trim();
for(int i = 0; i < trackers.size(); i++){
JSONObject obj = trackers.get(i).isObject();
String name = obj.get("name").isString().stringValue();
String descr = obj.get("descr").isString().stringValue();
String icon = obj.get("icon").isString().stringValue();
JSONArray data = obj.get("data").isArray();
// и так далее.
На первый взгляд выглядит громоздко, но попробуйте реализовать это другими способами и станет понятно, что JSON изобрели не от нечего делать.
Комментарии (4)
RSS свернуть / развернутьСпасибо за примеры!
Sergei_T
yababay
yababay
Sergei_T
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.