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-навигации):


 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 свернуть / развернуть
+
0
Красивый все-таки язык ;) Тут окунаюсь иногда в Python, местами он кажется дикостью.
Спасибо за примеры!
avatar

Sergei_T

  • 07 мая 2011, 20:25
+
0
Любой язык содержит некоторое количество дикости. Тут уж как в браке: выбрал — принимай со всеми достоинствами и недостатками.
avatar

yababay

  • 07 мая 2011, 21:43
+
0
из ЖЖ: «Говорят одна контора специально набирает ява программистов чтобы они кодили на пхп. В основном из за того что ява программисты пишут пхп код лучше пхп программистов »
avatar

yababay

  • 07 мая 2011, 22:27
+
0
avatar

Sergei_T

  • 08 мая 2011, 09:55

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.