Как работает параметр codeserver в GWT?

В GWT для запуска приложения в размещенном режиме "dev mode" вы добавляете параметр get.codesvr к URL, как вы можете видеть ниже.

/?gwt.codesvr=127.0.0.1:9997

Первый вопрос: я хочу знать, как GWT знает, когда запускать экземпляр JVM для обслуживания файлов.class вместо скомпилированных файлов JavaScript? Я не могу понять, как работает GWT в режиме разработки. Я нахожу main() в com.google.gwt.devDevMode. Как вызывается этот main()?

Второй вопрос в документации говорит, что GWT devmode работает с сервером Jetty, однако я вижу реальный JavaScript в браузере. Как этот пристенный сервер выводит JavaScript из.class файлов кода на стороне клиента?

Благодарю.

2 ответа

Решение

Вся магия совершается через сокеты и плагин для браузера.

Дизайн: Вне процесса Хостинг (OOPHM)

Вот основная часть.

Рассмотрим следующий код GWT:

public class MyEntryPoint implements EntryPoint {
    private static native int jsniMethod() /*-{
      return 1;
    }-*/;

    public void onModuleLoad() {
      jsniMethod();
    }
  }

JavaScript: плагин браузера отправляет LoadModuleMessage с именем модуля.

Java: сервер хост-режима получает LoadModuleMessage, загружает модуль и вызывает onModuleLoad в соответствующих EntryPoints. В этом случае MyEntryPoint::onModuleLoad вызывается. Когда MyEntryPoint компилируется, отправляется LoadJsniMessage для создания JavaScript-функций на стороне браузера для каждого метода JSNI, затем, когда onModuleLoad вызывает jsniMethod, отправляется InvokeMessage.

JavaScript: это ключевая часть примера. Механизм JavaScript в настоящее время ожидает возврата из отправленного им LoadModuleMessage, но он должен быть в состоянии вызвать вызов MyEntryPoint::jsniMethod в том же потоке. Это достигается тем, что поток вводит процедуру чтения и отправки после каждого удаленного вызова. В этом случае поток получает сообщения LoadJsniMessage и InvokeMessage, вызывает jsniMethod и отправляет ReturnMessage, содержащий значение 1.

Java: подпрограмма чтения и отправки получает сообщение ReturnMessage и знает, что нужно вернуться после вызова jsniMethod. Полностью выполнив метод onModuleLoad, он отправляет ReturnMessage и возвращается в цикл чтения и отправки верхнего уровня. (Поскольку все вызовы исходят из диспетчеризации событий пользовательского интерфейса браузера, во время простоя в режиме чтения и отправки должен оставаться только сервер размещенного режима. Браузер просто возвращает управление, выходя из функции JavaScript, которая была первоначально вызвана.)

Добавление gwt.codesvr к строке запроса явно недостаточно.

Сначала вы запускаете DevMode (com.google.gwt.dev.DevMode класс), который запускает встроенный сервер Jetty (если вы не отключили его через -noserver аргумент) и (что более важно) прослушивает ваш браузер (ы) (по умолчанию используется только локальный сетевой интерфейс на порту 9997).

Затем вы открываете свое приложение в браузере с помощью gwt.codesvr указывая на адрес и порт, который прослушивает DevMode. Когда *.nocache.js загружает файл, он обнаруживает gwt.codesvr и нагрузки devmode.html вместо вашего *.cache.html, Этот код загрузит подключаемый модуль GWT Dev, который вы установили в своем браузере (или попросите установить его), и направит его для подключения к DevMode по адресу и порту, указанным в gwt.codesvr Аргумент строки запроса.

Таким образом, ваш браузер общается с DevMode, который загружает ваш Java-код, компилирует и запускает его в JVM. Как работает этот диалог, описано в вики GWT, как уже указывал Suresh.

Другие вопросы по тегам