воскресенье, 18 сентября 2011 г.

Что такое GWT и как он работает?

     Google Web Toolkit (GWT) - это Java фреймворк, который позволяет java разработчикам создавать Ajax приложения без углубленного изучения JavaScript и браузерной обработки. Разработчикам предоставляется Java API, которое позволяет создавать GUI, избегая работы с JavaScript. GWT компилятор кросс-компилирует клиентский Java код в оптимизированный JavaScript, автоматически работающий во всех популярных браузерах. GWT компилятор выполняет полный статистический анализ и оптимизацию всего кода, создавая при этом очень оптимизированный JavaScript. 
     Связь с сервером осуществляется через GWT Remote Procedure Call (RPC) - механизм удаленного вызова процедур, который позволяет обмениваться Java-обьектами между клиентом и сервером. Нужно просто создать интерфейс, указывающий удаленные методы, которые нужно вызывать. При вызове удаленного метода, GWT RPC автоматически сериализует аргументы, вызывает правильный метод на сервер и десериализует возвращенное значение для кода клиента. 
  GWT позволяет разработчикам эффективно тестировать и выполнять отладку приложения без преобразования в JavaScript и развертывания на веб-сервере. В hosted mode режиме JVM исполняет код GWT приложения в виде Java-байт кода внутри встроенного браузера. Hosted режим позволяет выполнять отладку быстро и легко. 
     GWT компилятор поддерживает:
  • все внутренние типы данных и массивы 
  • обработку исключений(try, catch, finally и пользовательские исключения) 
  • обрабатывает ключевое слово assert, но не генерирует код для них 
     GWT компилятор не поддерживает:
  • Reflection или динамическую загрузку классов 
  • финализацию объекта в ходе сбора мусора 
  • Strict Floating Point (ключевое слово sctricfp)
  • Java сериализацию 
      GWT включает в себя библиотеку, которая эмулирует подмножество JRE. Полный список поддерживаемых классов можно посмотреть в JRE Emulation Reference.
     GWT приложение состоит из клиентской и серверной части. Важно помнить, что клиентский код будет преобразован в JavaScript, поэтому следует проверять используемые библиотеки и языковые конструкции. Компиляция клиентского кода не зависит от серверного кода. Серверная часть не имеет ограничений, в отличии от клиентской части. Следовательно выбор технологий используемых на сервере зависит только от вас.
     Что такое Deffered Binding(отложенное связывание)?
     В процессе компиляции клиентского кода GWT компилятор определяет различные особенности браузера, которые должен поддерживать, и генерирует оптимизированный вариант для каждой конкретной конфигурации. Например, если GWT-приложение поддерживает 3 браузера и 3 языка, то будет сгенерировано 9 реализаций приложения во время компиляции. Во время запуска GWT выбирает подходящую версию приложения.
     Как происходит загрузка GWT приложений?
     Сначала браузер загружает и обрабатывает HTML хост-страницу. Когда браузер доходит до след.строчки:
<script type="text/javascript" language="javascript" src="gwtapp.nocache.js" ></script>
загружается и исполняется JavaScript код. Файл gwtapp.nocache.js содержит JavaScript код, который выбирает подходящую конфигурацию. GWT компилятор генерирует таблицы поиска, которые браузер использует для определения какой из *.cache.js файлов нужно использовать. Далее JavaScript код в .nocache.js создает скрытый iframe, вставляет его в DOM хост-страницы загружает в созданный iframe файл .cache.html. После загрузки .cache.html начинается выполняться логика GWT приложения. 
      Давайте разберемся что же это за файлы *.nocache.js и <MD5-hash>.nocache.html.
     В файле .nocache.js происходит deffered binding. Он сожержит таблицы поиска для выбора cache.html файлов. Файл наз. *.nocache.js чтобы указать, что он никогда не должен кешироваться, он должен загружаться и выполнятся всякий раз, когда браузер стартует GWT приложение. Файл должен каждый раз перезагружатся, потому что GWT компилятор генерирует его каждый раз заново, но под тем же именем. 
     Файлы типа <MD5-hash>.nocache.html содержат JavaScript код завернутый в HTML оболочку(это решает проблемы с некоторыми браузерами). По сути они являются логикой приложения. В качестве имени используется MD5-hash, который изменяется каждый раз, когда происходит изменение JavaScript кода. Так как имена являются уникальными, то нет опасности в кешировании их браузером. 
     Ниже приводится пример хост-страницы:
<html>
 <head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">

  <link type="text/css" rel="stylesheet" href="Mvp4gApp.css">
  <title>Mvp4g GWT Application</title>

  <script type="text/javascript" language="javascript" src="mvp4gapp/mvp4gapp.nocache.js" ></script>
 </head>

 <body>
  <!-- OPTIONAL: include this if you want history support -->
  <iframe src="javascript:''" id="__gwt_historyFrame" tabIndex='-1' style="position:absolute;width:0;height:0;border:0"></iframe>

  <!-- RECOMMENDED if your web app will not function without JavaScript enabled -->
  <noscript>
   <div style="width: 22em; position: absolute; left: 50%; margin-left: -11em; color: red; background-color: white; border: 1px solid red; padding: 4px; font-family: sans-serif">
    Your web browser must have JavaScript enabled
    in order for this application to display correctly.
   </div>
  </noscript>

  <h1 align="center">Mvp4g GWT Application</h1>
 </body>
</html>

* This source code was highlighted with Source Code Highlighter.