Как работает параметр 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.