Когда встала реальная необходимость использования Java-апплета в проекте, освежил знания по этой тематике и перекопал интернеты. Результат совершенно не удовлетворил меня как веб-девелопера: невнятные советы, невалидная древняя разметка, куча логики, проверки на Netscape 6. Нужно было своё решение - современное, валидное, правильное.
После проведённых изысканий оказалось, что советы определять браузер и использовать теги APPLET, EMBED, OBJECT в разных вариациях в зависимости от браузера могут идти лесом - ВСЕ современные браузеры (IE6+, Firefox 3+, Opera 9+, Chrome 10+, Safari 5+ а может и более ранние - просто не нашёл) понимают апплет в теге OBJECT. В итоге у меня получился вот такой вот JSP tag:
<%@tag body-content="scriptless" language="java" pageEncoding="UTF-8" isELIgnored="false" description="Тег Java-апплета"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<%@attribute name="main" required="true" rtexprvalue="true" description="Полное наименование главного класса апплета (без расширения, например is.ida.avayaapplet.TelephonyControlApplet)"%>
<%@attribute name="archive" required="true" rtexprvalue="true" description="Список URL используемых jar через запятую"%>
<%@attribute name="id" required="false" description="Идентификатор апплета (атрибут 'id')"%>
<%@attribute name="height" required="false" description="Высота апплета (атрибут 'height', по умолчанию 0)"%>
<%@attribute name="width" required="false" description="Ширина апплета (атрибут 'width', по умолчанию 0)"%>
<object type="application/x-java-applet" <c:if test="${!empty id}">id="${id}"</c:if> height="${(empty height)? '1':height}" width="${(empty width)? '1':width}">
<param name="archive" value="${archive}" />
<param name="code" value="${main}"><%-- ${main}.class ? --%>
<jsp:doBody />
В браузере отключен или не установлен <a href="http://java.sun.com/products/plugin/downloads/index.html">Java Plug-in</a>.
</object>
где
<div class="lm_bottom center">
<%--
<input type="button" onclick="AvayaApplet.transfer('02');" value="02" alt="Перевод звонка" />
<input type="button" onclick="AvayaApplet.pause();" value="Пауза" />
<input type="button" onclick="AvayaApplet.resume();" value="Продолжить" />
--%>
<input type="button" onclick="AvayaApplet.hangup();" value="Повесить трубку" />
<input type="button" id="appletInit" style="display:none;" onclick="AvayaApplet.initJTapi();" value="OK" alt="Инициализация апплета" />
<t:applet id="AvayaApplet" main="is.ida.avayaapplet.TelephonyControlApplet"
archive="${pageContext.request.contextPath}/applet/ecsjtapia-4.1.0.323.jar,${pageContext.request.contextPath}/applet/is.ida.avayaapplet-0.3-SNAPSHOT.jar">
<param name="image" value="loading.gif" />
<param name="aesUser" value="aesUser" />
<param name="aesPassword" value="aesPassword" />
<param name="scriptobject" value="AvayaApplet" />
<param name="debug" value="true" />
</t:applet>
</div>
В обобщённом виде минимальный шаблон подключения Java-апплета в XHTML выглядит так:
<object type="application/x-java-applet" id="${id}" height="1" width="1">
<param name="archive" value="${archive}" />
<param name="code" value="${main}">
<!-- остальные параметры -->
В браузере отключен или не установлен <a href="http://java.sun.com/products/plugin/downloads/index.html">Java Plug-in</a>.
</object>
Интересная особенность некоторых версий Chrome: если ширину и высоту объекта указать равными нулю, то апплет запускаться не будет ни за какие коврижки. У меня проявилось в Chrome 14/Linux, в Chrome 13/Win такой "фичи" нет. Также Chrome старше седьмой версии и всё, что основано на WebKit новых версий (Safari) не желает обрабатывать тег OBJECT, если у него присутствует атрибут clsid.
Работает, как указывал выше, нормально на всех используемых браузерах от дедушки IE6 и выше, проходит валидацию XHTML, и никаких deprecated тегов - один рекомендованный W3C OBJECT.
После проведённых изысканий оказалось, что советы определять браузер и использовать теги APPLET, EMBED, OBJECT в разных вариациях в зависимости от браузера могут идти лесом - ВСЕ современные браузеры (IE6+, Firefox 3+, Opera 9+, Chrome 10+, Safari 5+ а может и более ранние - просто не нашёл) понимают апплет в теге OBJECT. В итоге у меня получился вот такой вот JSP tag:
<%@tag body-content="scriptless" language="java" pageEncoding="UTF-8" isELIgnored="false" description="Тег Java-апплета"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<%@attribute name="main" required="true" rtexprvalue="true" description="Полное наименование главного класса апплета (без расширения, например is.ida.avayaapplet.TelephonyControlApplet)"%>
<%@attribute name="archive" required="true" rtexprvalue="true" description="Список URL используемых jar через запятую"%>
<%@attribute name="id" required="false" description="Идентификатор апплета (атрибут 'id')"%>
<%@attribute name="height" required="false" description="Высота апплета (атрибут 'height', по умолчанию 0)"%>
<%@attribute name="width" required="false" description="Ширина апплета (атрибут 'width', по умолчанию 0)"%>
<object type="application/x-java-applet" <c:if test="${!empty id}">id="${id}"</c:if> height="${(empty height)? '1':height}" width="${(empty width)? '1':width}">
<param name="archive" value="${archive}" />
<param name="code" value="${main}"><%-- ${main}.class ? --%>
<jsp:doBody />
В браузере отключен или не установлен <a href="http://java.sun.com/products/plugin/downloads/index.html">Java Plug-in</a>.
</object>
где
- id - идентификатор апплета для доступа из JavaScript; все public методы апплета будут видны как методы объекта, полученного через getElementById или $ или как-там-в-вашем-любимом-фреймворке-это-делается
- height, width - высота и ширина апплета
- archive - список URL jar-архивов (апплет и используемые библиотеки), через запятую
- main - имя главного класса, с пакетами, но без расширения
<div class="lm_bottom center">
<%--
<input type="button" onclick="AvayaApplet.transfer('02');" value="02" alt="Перевод звонка" />
<input type="button" onclick="AvayaApplet.pause();" value="Пауза" />
<input type="button" onclick="AvayaApplet.resume();" value="Продолжить" />
--%>
<input type="button" onclick="AvayaApplet.hangup();" value="Повесить трубку" />
<input type="button" id="appletInit" style="display:none;" onclick="AvayaApplet.initJTapi();" value="OK" alt="Инициализация апплета" />
<t:applet id="AvayaApplet" main="is.ida.avayaapplet.TelephonyControlApplet"
archive="${pageContext.request.contextPath}/applet/ecsjtapia-4.1.0.323.jar,${pageContext.request.contextPath}/applet/is.ida.avayaapplet-0.3-SNAPSHOT.jar">
<param name="image" value="loading.gif" />
<param name="aesUser" value="aesUser" />
<param name="aesPassword" value="aesPassword" />
<param name="scriptobject" value="AvayaApplet" />
<param name="debug" value="true" />
</t:applet>
</div>
В обобщённом виде минимальный шаблон подключения Java-апплета в XHTML выглядит так:
<object type="application/x-java-applet" id="${id}" height="1" width="1">
<param name="archive" value="${archive}" />
<param name="code" value="${main}">
<!-- остальные параметры -->
В браузере отключен или не установлен <a href="http://java.sun.com/products/plugin/downloads/index.html">Java Plug-in</a>.
</object>
Интересная особенность некоторых версий Chrome: если ширину и высоту объекта указать равными нулю, то апплет запускаться не будет ни за какие коврижки. У меня проявилось в Chrome 14/Linux, в Chrome 13/Win такой "фичи" нет. Также Chrome старше седьмой версии и всё, что основано на WebKit новых версий (Safari) не желает обрабатывать тег OBJECT, если у него присутствует атрибут clsid.
Работает, как указывал выше, нормально на всех используемых браузерах от дедушки IE6 и выше, проходит валидацию XHTML, и никаких deprecated тегов - один рекомендованный W3C OBJECT.
Кстати, тем, кто интересуется, как скачать ecsjtapia, надо регистрироваться на devconnect.avaya.com и качать SDK примерно здесь: https://devconnect.avaya.com/public/dyn/d_dyn.jsp?fn=354
ОтветитьУдалить