30 авг. 2011 г.

Валидное унифицированное подключение Java-апплета в XHTML

Когда встала реальная необходимость использования 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>

где
  • 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.

1 комментарий:

  1. Кстати, тем, кто интересуется, как скачать ecsjtapia, надо регистрироваться на devconnect.avaya.com и качать SDK примерно здесь: https://devconnect.avaya.com/public/dyn/d_dyn.jsp?fn=354

    ОтветитьУдалить