|
Новая версия Java плагина не только повышает эффективность, надежность и безопастность апплетов, но также и значительно расширяет возможности доступные их авторам.
Апплеты возвращаются!
Новая версия Java плагина
расширяет возможности распространения ваших программ через Веб.
Благодаря новому подходу к исполнению апплетов вы получаете следующие новые возможности:
- Повышенная надежность и безопастность
- Улучшенное взаимодействие с пользователем
- Запуск апплетов в фоновом режиме
- Встроенная поддержка JNLP
- Возможность указывать различные параметры командной строки для разных апплетов, включая такие параметры как размер
памяти или опции Java 2D
- Усовершенствованная интеграция с Javascript
- Улучшенная поддержка Windows Vista
- Корректная поддержка подписанных апплетов в защищенном режиме IE
Новый плагин доступен как часть Java SE 6
Update 10 и, несмотря на новую архитектуру и множество полезных нововведений, гарантирует обратную совместимость со всеми существующими апплетами.
Наиболее интересной новой возможностью нового плагина является втроенная поддержка запуска апплетов из JNLP файлов. Это дает возможность использовать все те расширения JNLP, которые были ранее созданы
для приложений Java Web Start, что значительно расширяет возможности авторов апплетов.
Новый способ исполнения апплетов
В отличие от предыдущей версии Java плагина, в новой версии апплеты больше не исполняются в JVM в рамках процесса броузера. Вместо этого, JVM запускается в отдельном процессе для исполнения апплетов.
По умолчанию используется один отдельный процесс для всех апплетов, но есть возможность запустить и более одного. Это дает возможность запускать JVM с разными параметрами для разных апплетов - например, с разными размерами кучи или настройками сборщика мусора. Такой подход похож на Java Web Start, но отличается более тесной интеграцией с броузером.
Рисунок 1. Архитектура апплетов
|
На русунке 1 облака представляют экземпляры JVM. Внутри броузера работает небольшой headless JVM, управляющий соединениями с одним или более client JVM, которые на самом деле и используются для запуска апплетов. На этой диаграме изображения Duke представляют апплеты. В одном из JVM работает 2 апплета, во втором - один.
Апплеты запускаемые из JNLP файлов используют такой же формат JNLP, как и Java Web Start, и поддерживают ряд полезных параметров в дополнение к класическим "archive", "code" и "cache_archive".
Новый плагин обеспечивает:
- доступ к расширениям JNLP, которые ранее были доступны только для приложений на основе Java Web Start. Это, в частности, означает и полноценный доступ к подмножеству этих возможностей, которые ранее были доступны апплетам с ограничениями.
- возможность использования JNLP API из апплетов
- PersistenceService, DownloadService
- контроль над размером памяти, параметрами командной строки, выбором версии JRE, автозагрузкой. Автор апплета обладает
теми же возможностями, что и и при использовании Web Start.
Теперь, включение апплета в страницу может выглядеть так:
<applet width="500" height="500"> <param name="jnlp_href" value="my_applet.jnlp"> </applet>
|
Жизненный цикл апплета (вызовы init, start, stop, destroy) стал более детерминированным и
схожим для разных броузеров. Для обратной совместимости новый плагин также поддерживает и модель жизненого цикла, реализованную в предыдущей версии плагина, а также кеш загрузчика классов апплета. Этот код также был улучшен.
Апплеты ведут себя точно так, как приложения, которые запускаются с использованием Java Web Start. Связь между страницей и JNLP дескриптором апплета обеспечивается параметром jnlp_href.
Важной частью средств развертки Java приложений в Java SE 6 Update 10 является Deployment Toolkit,
который рекомендуется использовать чтобы автоматически сгенерировать HTML код для вставки апплета. Код тулкита проверяет какие версии плагина доступны в броузере пользователя и выбирает наиболее подходящий, при необходимости будет произведено обновление JRE или инициирован процесс установке. Руководство по развертыванию Java приложений (на английском)
содержит подробное описание и примеры того как быстро и эффективно внедрять апплеты, используя Deployment Toolkit.
Настройка апплетов
Новый плагин значительно облегчает конфигурирование апплетов, включая выбор версии JRE, управление памятью, границами,
кешем загрузчика классов и другими параметрами.
В ряде случаев и тег <applet> и JNLP файл позволяют задавать одни и те же параметры. Такие ситуации
разрешаются следующим образом:
- width и height: эти атрибуты ВСЕГДА получаются из тега
<applet>, а не фала JNLP.
Это сделано потому что броузер знает лучше, какого размера должен быть апплет на показываемой странице, и только броузер
может поддерживать относительные размеры (например,
width="50%").
- codebase: если JNLP файл указывает абсолютный путь в codebase в теге
<jnlp>, то он и
используется. В противном случае применяются правила из раздела обработка codebase.
- code: если указан параметр
jnlp_href, то имя главного класса апплета берется из параметра main-class у тега applet-desc в файле JNLP, а атрибут code игнорируется. Обратите внимание, что это позволяет иметь один тег апплет, который будет совместим с предыдущими версиями плагина и в то же время использовать новые возможности, если новый плагин доступен. Подробности в разделе "Совместимость" ниже.
- Параметры указанные с помощью тега <param> объединяются с параметрами из JNLP файла. Если один и тот же параметр указан дважды - и в <applet>, и в JNLP файле, то используется версия тега <applet>, за исключением случаев с параметрами
java_arguments и java_version.
- Параметры
java_arguments и java_version не требуются в JNLP апплетах. Вместо них, новый плагин использует механизмы выбора JRE и передачи параметров, которые есть в JNLP файле.
- Некоторые параметры, такие как image, boxbgcolor, и некоторые другие, могут быть довольно полезны на ранних стадиях
запуска апплета. Их предпочтительнее указывать в HTML коде, а не JNLP файле - так они будут использованы ранее (сразу
после загрузки страницы, еще до загрузки JNLP файла).
В прошлом, максимальный размер памяти доступный апплетам, который можно было указать с помощью Java Control Panel был ограничен. Это ограничение отстутствует в новой версии плагина и апплеты теперь могут использовать столько же памяти, сколько доступно приложениям, запускаемым из командной строки.
Пример: запуск апплета с размером кучи в 128Mb:
<APPLET archive="my_applet.jar" code="MyApplet" width="300" height="300"> <PARAM name="java_arguments" value="-Xmx128m"> </APPLET>
|
Пример: запуск апплета с увеличенным размером кучи и отключением D3D акселерации (что полезно для апплетов, использующих OpenGL акселерацию на основе JOGL):
<APPLET archive="my_applet.jar" code="MyApplet" width="300" height="300"> <PARAM name="java_arguments" value="-Xmx256m -Dsun.java2d.noddraw=true"> </APPLET>
|
Апплет может потребовать запуска в отдельной JVM, что, например, полезно при переносе некоторых десктопных приложений в
броузер. Указать, что требуется отдельная JVM можно при помощи параметра separate_jvm:
<param name="separate_jvm" value="true" />
|
Апплет может также задавать ограничения на версии JRE, которые могут быть использованы дя его запуска. Например:
<j2se version="1.4+" ...> <j2se version="1.5*" ...>
|
Этот подход особенно полезен в ситуации, когда необходимо провести тестирование апплета с конкретной версией JRE, или
для явной замены устаревших механизмов выбора, такой как CLSID в IE. Если затребован очень старый JRE, то это может вызвать запрос пользователю о том, согласен ли он исполнять неподписанный
код.
Кстати, поскольку поддержка JNLP появилась в плагине, начиная с Java Platform, Standard Edition 6 (Java SE 6) Update
10, то версии типа “1.4+" вообщем-то бесполезны. Эти возможности станут более полезны, когда потребуется
написать, например, “1.7+".
В дополнение к вышеизложеному, вы также можете использовать тег <update> в JNLP файле, для того чтобы значительно
уменьшить время старта для второго и последующих запусков:
<update check="background">
|
В этом случае, плагин будет использовать версию кешированную апплета, а проверку и обновление будет производить в
фоновом режиме. При последующем запуске апплета из кеша будет взята уже обновленная версия.
Новый плагин расширяет возможности связанные с показом изображения, которое используется до завершения загрузки
апплета.Добавлена поддержка анимированных GIF, все подробности можно найти в разделе Special
Attributes руководства Java Plug-in Developers'
Guide. А также добавлены следующие параметры:
- boxborder
Параметр, который указывает необходимо ли рисовать границу шириной в 1 пиксел вокруг области занятой апплетом, пока
показывается изображение, используемое до завершения загрузки апплета. По умолчанию граница рисуется. Однако, мы
рекомендуем отключать рисование границы, особенно в случае использования анимированных GIF, для того чтобы избежать
потенциального мигания изображения.
- centerimage
Флаг, указывающий необходимо ли выравнивать изображение по центру области апплета. По умолчанию изображение привязано к
верхнему левому углу области апплета (что соответствует значению false).
Пример использования boxborder и
centerimage:
<APPLET archive="large_archive.jar code="MyApplet width="300" height="300"> <!-- Используем анимированный GIF как бесконечный индикатор процесса загрузки --> <PARAM NAME="image" VALUE="animated_gif.gif"> <!-- Отключаем рисование рамки для лучшей интеграции со страницей --> <PARAM NAME="boxborder" VALUE="false"> <!-- Центрируем изображение в области апплета --> <PARAM NAME="centerimage" VALUE="true"> </APPLET>
|
Совместимость
С новой вресией плагина поддерживать обратную совместимость легко. Вы можете создать апплеты, которые работают на более
старых версиях Java плагина и в то же время могут использовать возможности нового плагина, если он доступен. Для этого
достаточно указывать jnlp_href параметр у тега <applet>. Предыдущие версии JRE будут игнорировать jnlp_href и запускать
апплет на основе параметров code и archive. Новый плагин, игнорирует значения archive и code, если присутствует параметр
jnlp_href.
Пример: World Wind Applet
NASA World Wind Java, созданый
разработчиками из группы World Wind Java, демонстрирует как внедрять продвинутые библиотеки, такие как NASA World Wind
Java, и интегрировать контент страницы в единое приложение, используя Javascript.
Рисунок 2. Апплет NASA World Wind
|
Веб страница содержит подробную информацию о горной цепи (спасибо Wikipedia) и встроенный апплет World Wind Java,
который используется для илюстрации местоположения отдельных возвышенностей. Внедрение
World Wind в страницу не требует особых усилий. Вот как выглядит тег <applet>:
<applet id="wwjApplet" width=600 height=380 code="gov.nasa.worldwind.examples.applet.WWJApplet" archive="BackwardCompatibility.jar"> <param name="jnlp_href" value="WWJApplet.jnlp"> </applet>
|
WWJApplet - Это часть стандартной поставки World Wind Java. Вы можете также написать свой собственный апплет и встройть в него World Wind, как это описано ниже.
Вот релевантные части WWJApplet.jnlp:
<jnlp href="WWJApplet.jnlp"> <resources os="Windows"> <property name="sun.java2d.noddraw" value="true"/> </resources> <resources> <j2se href="http://java.sun.com/products/autodl/j2se" version="1.4+"/> <jar href="worldwind.jar" main="true" /> <extension name="jogl" href="http://download.java.net/media/jogl/builds/archive/jsr-231-webstart-current/jogl.jnlp" /> </resources> <applet-descname="WWJ Applet" main-class="gov.nasa.worldwind.examples.applet.WWJApplet" <!-- Overwritten by the surrounding web page --> width="100" height="100"> </applet-desc> </jnlp>
|
Важные замечания:
worldwind.jar используется как главный jar файл. В идеале, на него лучше ссылаться как на расширение JNLP
с сайта NASA. Такой подход позволит разным приложениям и апплетам, которые встраивают в себя NASA World Wind
разделять один и тот же кешированный jar файл. Подробности ниже.
- World Wind Java использует Java Binding для OpenGL, JOGL,
для аппаратного ускорения 3D графики. Обратите внимание, что добавление JOGL расширения JNLP потребовало всего одну строку
кода. Также важно отметить, что для корректной работы JOGL на Windows необходимо задать указать
-
Dsun.java2d.noddraw=true (из-за конфликтов между OpenGL и
DirectDraw/Direct3D на уровне драйверов) . Это не особенность World Wind, это необходимое условие для корректной работы
любого JOGL приложения на Windows.
Ссылки из текста страницы вызывают функции Javascript, которые взаимодействуют с апплетом и переводят фокус на
соответствующую гору. Вот пример такой ссылки:
<a href="javscript:gotoLocation(MOUNT_RAINIER);">Mount Rainier</a> (southeast of Tacoma, Washington) ...
|
При нажатии на сслыку, вызывается функция gotoLocation, которая устроена следующим образом:
function gotoLocation(locationString) { var params = locationString.split(';'); if(params.length == 3) // Lat/lon getWWJApplet().gotoLatLon(parseFloat(params[1]), parseFloat(params[2])); ... }
|
Координаты возвышенностей хранятся в виде строк в JavaScript коде этой же страницы. Широта, долгота и другая информация
выделяются из этой строки и передаются в апплет. Метод gotoLatLon определен в
классе WWJApplet. Вызов его из JavaScript кода инициирует JavaScript->Java вызов и передачу параметров из
движка JavaScript в Java. Апплет World Wind анимирует процес переноса фокуса
в указанные координаты. Обратите внимание, что gotoLatLon быстро возвращает управление назад броузеру, а анимация
выполняется в отдельном потоке. Такой подход позволяет избежать блокирования броузера на время выполнения анимации.
Рисунок 3. Апплет World Wind в котором выбрана гора St.
Helen
|
Как было отмечено ранее, предпочтительный метод внедрения World Wind
Java в ваше приложение или апплет - это использование его как расширения JNLP. Это позволяет разделять ресурсы (код) World
Wind между всеми приложениями и апплетами, которые используют его. Для того чтобы использовать World Wind как JNLP
расширение вам необходимо добавить следующие строки в JNLP файл для вашего приложения или апплета в разделе
<resources>:
<extension name="worldwind" href="http://worldwind.arc.nasa.gov/java/0.4.1/webstart/worldwind.jnlp"/> <extension name="jogl" href="http://download.java.net/media/jogl/builds/archive/jsr-231-webstart-current/jogl.jnlp"/>
|
Обратите внимание, что World Wind JNLP имеет несколько вресий, так что вам необходимо проконсультироваться в
документации World Wind или посетить форум, чтобы узнать какая версия на данный момент наиболее современная, чтобы использовать ее в вашем JNLP. Сайт
World Wind Central содержит самую последнюю информацию об этом
проекте.
Использование World Wind как расширение подразумевает, что вы не можете использовать WWJApplet как
главный класс. Семантика JNLP требует, чтобы главный JNLP файл имел main jar. К счастью, это ограничение не слишком
обременительно - достаточно создать свой класс (допустим MyWWJApplet), который расширяет
WWJApplet и ничего не делает сам:
class MyWWJApplet extends WWJApplet {}
|
Откомпилируем это с worldwind.jar в classpath и упакуем этот класс в отдельный jar. Этот jar можно
использовать, как main jar, и MyWWJApplet, как main class, а World Wind, как JNLP расширение.
Заключение
Поддержка JNLP в Java Plugin открывает множество новых возможностей для развертывания апплетов и в значительной мере
стирает границы между развертыванием Java приложений внутри и вне броузера.
Дополнительная информация
|