2009-08-18 2 views
3

LiveConnect - это технология Mozilla, которая соединяет Java и JavaScript. Удивительно, но они начали поддерживать его снова для последних версий Firefox. В Firefox я могу написать, например.Возможно ли создать произвольные объекты Java из JavaScript, т. Е.?

var d = new java.util.Date(); 

или использовать Packages. пространство имен, если это не java.something

var d = new Packages.java.util.Date(); 

или я мог бы сойти с ума и вызвать метод фабрики в колебании

Packages.javax.swing.Box.createVerticalBox(); 

легко инстанцировании любой объект Java , Существует ли эквивалент, который работает в ie?

+0

Почему бы вам не попробовать? – karim79

+2

«Java имеет такое же общее с JavaScript, как и автомобиль с ковровым покрытием». Если вы можете сделать это в Firefox, это сильно утечка абстракций, не говоря уже о том, чтобы позволить внешней веб-странице запускать локально исполняемый код на компьютере посетителя. – Esko

+0

Конечно, я попробовал, и, конечно, это не работает таким образом. Должно быть очевидно, что вопрос означает «что такое синтаксис для того, чтобы делать то же самое в ie». – joeforker

ответ

1

Начиная с версии 1.1 1.6 Java, Inter-Language LiveConnect Bridge прикрепляет объект Packages к апплетам на странице, как и объект Packages, доступный в Firefox. Таким образом, на странице с хотя бы одним апплетом, даже в Internet Explorer,

new document.applets[0].Packages.java.util.Date().toString(); 

возвращает текущую дату. Также возможно зарегистрировать новые конвертеры для удобного доступа к не-Java-языкам, работающим на виртуальной машине Java. Конечно, JavaFX реализует такой мост.

Не нужно ждать, пока апплет загрузится, прежде чем называть его JavaScript, но это, вероятно, хорошая идея. Плагин Java заставит JavaScript ждать, пока апплет не завершит загрузку или не получит ошибку. Это is Возможно, для апплета можно вызвать JavaScript на веб-странице, как только вызывается Applet.init().

1

Насколько я знаю, я не думаю, что это возможно - Java и Javascript совершенно разные. Так получилось, что JS API содержит объект Date, как и API Java.

Редактировать: API-интерфейс Java Scripting API (http://java.sun.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.html#jsengine), по-видимому, находится ближе всего к тому, что вы пытаетесь сделать.

+0

@Tom: его код фактически создает Java 'Date' и ссылается на него с клиентского JavaScript. Рассмотрим: var r = new java.util.Random(); document.write (r.nextBoolean() + ';' + r.nextDouble() + ';' + r.nextFloat() + ';' + r.nextGaussian() + ';' + r.nextInt() + ';' + r.nextLong()); 'Клиентский JavaScript не имеет объекта' Random() ', и он, безусловно, не имеет доступных' next *() 'методов. –

4

Вы используете LiveConnect, который является мозаикой JavaScript/Java на основе Mozilla. Он не поддерживается в других браузерах.

5

Что вы можете сделать в Internet Explorer, загружает апплет на страницу, которая предоставляет методы, которые делают то, что вы хотите сделать. Вы получаете ссылку на апплет, а затем вызываете методы в этой ссылке.

<applet id="myAppletId" name="myAppletName" ...> 

var applet = document.getElementById('myAppletId'); 
var d = applet.getDateFromApplet(); 

В вашем апплета вам потребуется открытый метод getDateFromApplet() который возвращает java.util.Date.

Обратите внимание, что то, что я представляю , должно быть, но прошло много лет с тех пор, как я это сделал (он работал в NS4, 6 и IE 4+ в то время). Однако я не использовал getElementById(), но использовал var applet = document.myAppletName;.

Другая сложность в том, что если вы хотите, чтобы это выполнить при загрузке страницы, апплет будет почти наверняка не будет готов, что требует код что-то вроде:

function checkApplets() { 
    var da = document.applets; // document.getElementsByName('applet');? 

    if (da.length > 0) { 
     for (var ii = da.length; ii-- > 0;) { 
      if (!da[ii].isActive()) { 
       window.timerId = setTimeout(checkApplets, 250); 
       return; 
      } 
     } 

     if (window.timerId) { 
      clearTimeout(window.timerId); 
     } 
    } 

    window.appletsLoaded = true; 
} 

И наконец, возможно (должны) можно сделать это с помощью тега <object>, но, как я уже сказал, прошло много лет с тех пор, как мне нужно было взаимодействовать с апплетом Java из клиентского JavaScript, поэтому я его не тестировал.

+0

Апплет должен просто вызвать метод на странице, когда он будет готов? – joeforker

+0

Как насчет того, что «вещь, которую я хочу сделать», это оператор Rhino eval(), связанный с Java 6 :-) – joeforker

+0

@joeforker: 1) Я не уверен, что апплет может вызвать метод на странице. Вам нужно подождать, пока апплет будет готов, а затем вызовите его из JavaScript. 2) Да, апплет потенциально может иметь один открытый метод 'do()' или 'eval()', который вы просто передаете Java как обычный текст и выполняете его внутри апплета в браузере. –

0

Возможно, вы можете использовать DWR или другую реверсивную ajax-библиотеку, которая позволит вам создавать объекты Java на стороне сервера через объекты Javascript.

+0

Интересная интерпретация вопроса. – joeforker

2

Вы можете сделать свойства ваших объектов доступными через ответ JSON от вашего сервлета в JAVA? Поскольку JS может легко использовать JSON, и это легкий вес, он упрощает сбор объектов JS с ваших объектов Java.

Также посмотрите на движок JavaScript Rhino и предоставите ресурсы Java из JavaScript. https://developer.mozilla.org/en-US/docs/Rhino_documentation

Смежные вопросы