Взаимодействие java и javascript в jsp файле
Взаимодействие JavaScript и Java Servlet
Здравствуйте! Скажите, пожалуйста, могу ли я получать содержимое едиторов текста JavaScript для.
Взаимодействие сервлета и jsp
Подскажите как передать данные из сервлета в jsp и как в jsp после этого извлечь.
Взаимодействие jsp и сервлет
Господа, есть косяк. Прошу разъяснить для понимания. Задание заключается в том, чтобы плавно.
JSP+localStorage javascript
Здравствуйте! Пытаюсь реализовать сохранение на стороне клиента элементов, которые.
Подключение файлов javascript на jsp-странице
Здравствуйте, пытаюсь подключить js файл в jsp, файл находится в src/main/resources/js/ .
У Вас нет понимания, что где выполняется.
ВЕСЬ код скриптлетов выполняется на стороне сервера в момент, когда генерируется страница. Страница сгенерировалась, ушла на сторону клиента. И вот только тут выполняется JavaScript. Так что у Вас всё закономерно, так и должно быть.
POST в jsp файле не отрабатывает
Такая проблема, при запуске приложения не отрабатывает POST и вот что выводит на странице. Maths.
Литература по Java и JSP
Проблема такая. Нужно шустро разобраться в Java и JSP. Может кто-нибудь посоветовать.
6 Взаимодействие с аплетами
Наверное, вы уже почувствовали, что сценарии JavaScript служат как бы цементом для связывания различных объектов, расположенных в документе HTML. Например, с помощью JavaScript вы можете обрабатывать данные, полученные из полей одной формы, и отображать результаты обработки в полях той же самой или другой формы.
Еще одна интересная возможность взаимодействия сценариев JavaScript с объектами документа HTML, которую мы рассмотрим в нашей книге, это связь сценариев и аплетов Java. Оказывается, из сценариев JavaScript вы можете обращаться к полям и методам аплетов Java.
Языку программирования Java мы посвятили 30 и 32 тома “Библиотеки системного программиста”, которые называются, соответственно, “Microsoft Visual J++. Создание приложений. Часть 1” и “Microsoft Visual J++. Создание приложений. Часть 2”. Перед тем как читать главу нашей книги “Взаимодействие с аплетами Java” мы рекомендуем вам ознакомиться с этими томами.
Встраивание аплета Java в документ HTML
Для того чтобы встроить аплет в документ HTML, вы должны воспользоваться оператором , например:
Перечислим допустимые параметры оператора :
Выравнивание окна аплета относительно окружающего его текста. Возможны следующие значения:
LEFT выравнивание влево относительно окружающего текста;
RIGHT выравнивание вправо относительно окружающего текста;
TOP выравнивание по верхней границе;
MIDDLE центрирование по вертикали;
BOTTOM выравнивание по нижней границе
С помощью этого параметра можно задать текст, который будет отображаться в окне аплета в том случае, если браузер не может работать с аплетами Java
Имя двоичного файла, содержащего код аплета. По умолчанию путь к этому файлу указывается относительно каталога с файлом HTML, куда встроен аплет. Такое поведение может быть изменено параметром CODEBASE
Базовый адрес URL аплета, то есть путь к каталогу, содержащему аплет
Начальная ширина окна аплета в пикселах
Начальная высота окна аплета в пикселах
Зазор слева и справа от окна аплета
Зазор сверху и снизу от окна аплета
Имя аплета. Оно может быть использовано другими аплетами, расположенными в одном и том же документе HTML, а также сценариями JavaScript
Здесь через параметр NAME оператора
передается имя параметра аплета, а через параметр VALUE — значение соответствующего параметра.
Вызов методов аплета Java из сценария JavaScript
Сценарий JavaScript может получить доступ к полям и методам аплетов, расположенных в документе HTML, адресуясь к аплетам как к элементам массива document.applets. Например, для доступа к первому аплету вы можете использовать строку document.applets[0]. Однако удобнее указывать имя аплета, заданное в параметре NAME оператора , например document.MyApplet.
В качестве примера покажем, как можно вызывать из сценария JavaScript методы аплета Rectangles, описанного нами в упомянутом выше 32 томе “Библиотеки системного программиста”. Этот аплет рисует в своем окне прямоугольники случайного размера, закрашенные случайным цветом.
Мы создали документ HTML, разместив в нем аплет Rectangles и форму с кнопками Start Animation и Stop Animation (рис. 6.1).
Рис. 6.1. Аплет Rectangles управляется кнопками с помощью сценария JavaScript
Сразу после загрузки документа в окне аплета запускается процесс анимации. Если нажать кнопку Stop Animation, рисование новых прямоугольников будет приостановлено. С помощью кнопки Start Animation можно возобновить процесс рисования.
Заметим, что если поместить курсор мыши в область окна аплета, анимация будет остановлена, а когда курсор мыши покинет пределы окна аплета — снова запущена. Однако такое поведение определяется самим аплетом и не имеет отношения к нашему сценарию JavaScript.
Исходный текст документа HTML, содержащий аплет и форму с кнопками, представлен в листинге 6.1.
Листинг 6.1. Файл chapter6/Rectangles/Rectangles.html
Когда пользователь нажимает на кнопку Start Animation, управление получает обработчик события onClick, определенный следующим образом:
Этот обработчик вызывает метод start, определенный в аплете Rectangles. Этот метод запускает анимацию в окне аплета, если она была остановлена.
Аналогично, обработчик события onClick кнопки Stop Animation вызывает метод stop, также определенный в аплете Rectangles и предназначенный для остановки анимации:
Исходный текст аплета Rectangles мы воспроизвели в листинге 6.2. Подробное описание этого аплета вы найдете в разделе “Приложение Rectangles” первой главы 32 тома “Библиотеки системного программиста”.
Листинг 6.2. Файл chapter6/Rectangles/Rectangles.java
Доступ к полям аплета Java из сценария JavaScript
В предыдущем примере сценарий JavaScript вызывал методы, определенные в аплете Java. В следующем примере сценарий будет обращаться к полю, определенному в главном классе аплета.
Заметим, что сценарию JavaScript доступны только те поля и методы аплета, определенные как public.
На рис. 6.2 показан внешний вид документа HTML, в котором расположен один аплет и форма с одним многострочным текстовым полем и одной кнопкой.
Рис. 6.2. Сценарий JavaScript вызывает получает информацию от аплета
В окне аплета, расположенном в верхней части документа, находится поле редактирования текста и кнопка с надписью “Получить строку”. Если набрать в поле редактирования любую текстовую строку и нажать эту кнопку, то введенная строка будет отображена в нижней части аплета после символа >. Такой аплет мы описали в 30 томе “Библиотеки системного программиста” в разделе “Приложение TxtField” пятой главы.
Если нажать кнопку “Get applet info and text”, то сценарий JavaScript извлечет из аплета введенную текстовую строку (она хранится в поле с именем str), а также получит описание аплета, вызвав метод getAppletInfo, определенный в нашем аплете.
Введенная строка и информация об аплете будет затем отображена сценарием в многострочном поле редактирования, как это показано на рис. 6.2.
Таким образом, наш сценарий обращается к полю и методу, определенным в аплете.
Исходный текст документа HTML вы найдете в листинге 6.3.
Листинг 6.3. Файл chapter6/TxtField/TxtField.html
Для кнопки, расположенной в форме с именем GetForm, мы определили обработчик события onClick:
Этот обработчик вызывает функцию getTextFromApplet, выполняющую взаимодействие с аплетом.
Функция getTextFromApplet обращается к аплету как к самому первому элементу массива document.applets[0]:
Здесь мы записываем в свойство value многострочного поля GetForm.Comment значение переменной str, к которому добавлен разделитель из символов “-“ и строка описания аплета, полученная от метода getAppletInfo.
Исходный текст аплета приведен в листинге 6.4.
Листинг 6.4. Файл chapter6/TxtField/TxtField.java
Этот текст воспроизведен нами с небольшими изменениями из 30 тома “Библиотеки системного программиста”. Изменения заключаются в том, что мы добавили к определению поля str ключевое слово public:
Это необходимо для того чтобы поле str было доступно из сценария JavaScript.
Динамическая загрузка аплетов Java
Еще одна полезная возможность, которая появляется у вас при использовании сценариев JavaScript, — это динамическая перезагрузка аплетов Java в документах HTML, созданных с использованием фреймов.
Идея динамической загрузки аплетов заключается в том, что сценарий JavaScript динамически создает документ HTML, в котором находится оператор . Передавая аплету в этом документе различные значения параметров с помощью оператора
, сценарий JavaScript может управлять его работой.
На рис. 6.3 мы показали документ HTML, состоящий из двух фреймов.
Рис. 6.3. Строка в окне аплета и ее шрифтовое оформление зависят от положения переключателей в левом фрейме
В левом фрейме находится форма с переключателями и кнопкой, а правой — аплет Java. Если включить один из переключателей с названиями шрифтов, а затем нажать кнопку, то в окне аплета появится название шрифта. Это название будет оформлено с применением шрифта, выбранного вами в левом фрейме.
Займемся описанием исходных текстов нашего документа HTML.
В файле Index.html (листинг 6.6) находится описание фреймов.
Листинг 6.6. Файл chapter6/FrameLoad/Index.html
Левый фрейм называется toc, а правый — mainpage.
Исходный текст документа для фрейма toc мы привели в листинге 6.6.
Листинг 6.6. Файл chapter6/FrameLoad/toc.html
Для работы с переключателями типа radio мы использовали уже знакомую вам методику. Обработчик события onClick проверяет, находится ли переключатель во включенном состоянии. Если это так, обработчик вызывает функцию chkRadio, передавая ей ссылку на форму и значение свойства value, соответствующее включенному переключателю.
Функция chkRadio сохраняет это значение в переменной szFont:
Каждый из переключателей имеет значение параметра VALUE, соответствующее названию одного из шрифтов, доступных аплетам Java. Поэтому переменная szFont хранит название шрифта, выбранного пользователем в левом фрейме.
Обработчик события onClick для кнопки, расположенной в левом фрейме, выглядит следующим образом:
Он устанавливает свойство location фрейма mainpage (то есть правого фрейма), присваивая ему адрес документа main.html. Исходный текст этого документа приведен в листинге 6.7.
Листинг 6.7. Файл chapter6/FrameLoad/main.html
Тело документа main.html содержит только сценарий JavaScript. Этот сценарий динамически создает строки оператора с параметрами Str1, Font1 и Type1.
Параметр Str1 задает текст, отображаемый в окне аплета. Наш сценарий использует для этого параметра название шрифта, выбранного пользователем в левом фрейме:
Параметр Font1 задает шрифт для текста, отображаемого в окне аплета. Этот параметр также задается с использованием названия шрифта, выбранного в левом фрейме:
И, наконец, третий параметр с именем Type1 задает тип шрифта — обычный, жирный или наклонный. В нашем случае всегда используется обычный шрифт.
Исходный текст аплета Java, использованного в нашем примере, приведен в листинге 6.8. Это упрощенный вариант алпета, описанного нами в 30 томе “Библиотеки системного программиста” в разделе “Приложение TextOut третьей главы.
Глава 14
LiveConnect. Обзор.
В этой главе рассматривается использование технологии LiveConnect для взаимодействия кодов, написанных на Java и JavaScript. Предполагается, что Вы уже знакомы с программированием на Java.
В главе имеются следующие разделы:
Дополнительно об использовании LiveConnect см. JavaScript technical notes на сайте DevEdge, а также ищите соответствующую информацию на сайтах mozilla.org и developer.netscape.com.
Что Такое LiveConnect?
LiveConnect даёт возможность подключать приложения серверного JavaScript к Java-компонентам и классам на сервере.
Вашему приложению JavaScript может понадобиться соединиться с кодом, написанным на других языках, таких как Java или C. Для подключения к Java-коду Вы используете функциональность LiveConnect. Для взаимодействия с кодом, написанным на других языках, у Вас есть несколько вариантов:
- Вы можете обернуть/wrap Ваш код как Java-объект и использовать LiveConnect непосредственно.
- Вы можете обернуть Ваш код как распределённый объект CORBA и использовать LiveConnect совместно с object request broker (ORB).
- Вы можете напрямую включать внешние библиотеки в Ваше приложение.
В этой главе обсуждается использование LiveConnect для доступа к не-JavaScript коду из приложений JavaScript.
Наконец, LiveConnect даёт возможность объектам JavaScript Вашего приложения взаимодействовать с Java-объектами. Эти Java-объекты являются экземплярами классов в серверном CLASSPATH . Об установке CLASSPATH см. книгу Programmer’s Guide to Servlets . LiveConnect работает и с клиентским, и серверным JavaScript, но имеет для каждой среды разные возможности.
Предполагается, что Вы уже знакомы с программированием на Java. Об использовании Java с Netscape-серверами см. Enterprise Server 3.5.1/3.6: Notes for Java Programmers 1 . О LiveConnect см. DevEdge Library 2 .
Во всех доступных Java-классах Вы можете иметь доступ к статичным public-свойствам или методам или создавать экземпляры класса и получать доступ к public-свойствам и методам этих экземпляров. В отличие от клиентского, однако, Вы можете иметь доступ только к тем Java-объектам, которые были созданы Вашим приложением или другим приложением JavaScript, а затем сохранены как свойство объекта server .
Если Java-объект был создан серверным приложением, отличным от приложения на серверном JavaScript, Вы не можете иметь доступ к этому Java-объекту.
Например, Вы не можете получить доступ к Java-объекту, созданному WAI plug-in, расширением NSAPI или HTTP-аплетом.
Когда Вы вызываете метод Java-объекта, Вы можете передать объекты JavaScript в этот метод. Код Java может установить свойства и вызвать методы этих объектов JavaScript. Таким образом, Вы можете иметь и код JavaScript, вызывающий код Java, и код Java, вызывающий код JavaScript.
Код Java может иметь доступ к приложению JavaScript только таким способом. То есть Java-объект не может вызывать приложение JavaScript, если это приложение JavaScript (или другое приложение JavaScript) не имеет само доступа к соответствующему Java-объекту и не вызывает один из его методов.
Работа с Оболочками
В JavaScript wrapper\оболочка это объект типа данных целевого языка, который содержит в себе объект исходного языка. На стороне JavaScript Вы можете использовать объект-оболочку для доступа к методам и полям Java-объекта; вызывая метод или получая доступ к свойству в оболочке даёт в результате вызов Java-объекта. На стороне Java объекты JavaScript оборачиваются в экземпляры класса netscape.javascript.JSObject и передаются в Java.
Когда JavaScript-объект высылается в Java, машина выполнения создаёт Java-оболочку типа JSObject ; когда JSObject высылается из Java в JavaScript, машина выполнения разворачивает его в объект оригинального типа JavaScript. Класс JSObject предоставляет интерфейс для вызова методов JavaScript и проверки свойств JavaScript.
Взаимодействие JavaScript с Java
Когда Вы обращаетесь к пакету или классу Java или работаете с объектом или массивом Java, Вы используете один из специальных объектов LiveConnect. Доступ JavaScript к Java имеет место в объектах, резюме по которым дано в следующей таблице.
Таблица 14.1 Объекты LiveConnect
Объект | Описание | |||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Тип Java-параметра | Правила конвертации |
---|---|
| |
| |
|
Когда число JavaScript передаётся как параметр в Java-метод, ожидающий экземпляр java.lang.String , это число конвертируется в строку. Используйте операцию == для сравнения результата этой конвертации с другими строковыми значениями.
Булевы Значения
Когда Вы передаёте Булев тип JavaScript в качестве параметра Java-методам, Java конвертирует эти значения в соответствии с правилами, описанными в таблице:
Тип Java-параметра | Правила конвертации |
---|---|
|
Когда JavaScript Boolean передаётся в качестве параметра Java-методу, ожидающему экземпляр java.lang.String , Boolean конвертируется в строку. Используйте операцию == для сравнения результата конвертации с другими строковыми значениями.
Строковые Значения
Когда Вы передаёте строковые типы JavaScript в качестве параметра Java-методам, Java конвертирует эти значения в соответствии с правилами, описанными в таблице:
Тип Java-параметра | Правила конвертации |
---|---|
|
Null-Значения
Когда Вы передаёте null JavaScript в качестве параметра Java-методам, Java конвертирует это значение в соответствии с правилами, описанными в таблице:
Тип Java-параметра | Правила конвертации | ||||||
---|---|---|---|---|---|---|---|
Тип Java-параметра | Правила конвертации |
---|---|
Интерфейс или класс совместимы для присвоения с развёрнутым объектом, если развёрнутый объект является экземпляром типа Java-параметра. То есть, следующий оператор обязан возвращать true:
Объекты JavaClass
Если вы передаёте JavaScript-объект JavaClass в качестве параметра Java-методу, Java конвертирует объект в соответствии с правилами из таблицы:
Тип Java-параметра | Правила конвертации |
---|---|
Другие Объекты JavaScript
Если вы передаёте любой другой объект JavaScript в качестве параметра Java-методу, Java конвертирует объект в соответствии с правилами из таблицы:
Тип Java-параметра | Правила конвертации |
---|---|
Конвертация из Java в JavaScript
Значения, переданные из Java в JavaScript конвертируются так:
- Java byte, char, short, int, long, float и double конвертируются в числа JavaScript.
- Java boolean конвертируется в JavaScript boolean.
- Объект класса netscape.javascript.JSObject конвертируется в оригинальный JavaScript-объект.
- Java-массивы конвертируются в объект JavaScript pseudo-Array; этот объект ведёт себя так же, как объект JavaScript Array : Вы можете иметь к нему доступ с синтаксисом arrayName[index] (где index это целое число) и определять его размер с помощью arrayName.length .
- Java-объект любого иного класса конвертируется в JavaScript-оболочку, которая может использоваться для доступа к методам и полям Java-объекта:
- Конвертация оболочки в строку вызывает метод toString объекта-оригинала.
- Конвертация в число вызывает метод doubleValue , если возможно, иначе — терпит неудачу.
- Конвертация в boolean вызывает метод booleanValue , если возможно, иначе — терпит неудачу.
Обратите внимание, что экземпляры java.lang.Double и java.lang.Integer конвертируются в объекты JavaScript, а не в числа JavaScript. Аналогично, экземпляры java.lang.String также конвертируются в JavaScript-объекты, а не в строки JavaScript.
Java String -объекты также соответствуют оболочкам JavaScript. Если Вы вызываете JavaScript-метод, который требует строки JavaScript, и передаёте его данной оболочке, Вы получите ошибку. Вместо этого конвертируйте оболочку в строку JavaScript, присоединяя к ней пустую строку, как показано здесь:
Оглавление | Назад | Вперёд | Индекс
Дата последнего обновления: 29 сентября 1999 г.
© Copyright ╘ 1999 Sun Microsystems, Inc. Некоторая часть Copyright ╘ 1999 Netscape Communications Corp. Все Права Зарезервированы.
Глава 9 LiveConnect. Обзор.
В этой главе рассматривается использование технологии LiveConnect, обеспечивающей совместную работу кодов, написанных на Java и JavaScript. Предполагается, что Вы уже знакомы с программированием на Java.
Дополнительную информацию об использовании LiveConnect см. в технических замечаниях по JavaScript на сайте DevEdge.
Работа с Оболочками
В JavaScript wrapper\оболочка это объект целевого типа данных языка, содержащий объект исходного языка. При программировании на JavaScript Вы можете использовать объект-оболочку для доступа к методам и полям Java-объекта; вызов методов или доступ к свойству в wrapper вызывает Java-объект. На стороне Java объекты JavaScript «обёртываются» в экземпляры класса netscape.javascript.JSObject и передаются в Java.
Если JavaScript-объект посылается в Java, машина времени выполнения создаёт Java-оболочку типа JSObject; когда JSObject посылается из Java в JavaScript, машина времени выполнения разворачивает его в оригинальный тип объекта JavaScript. Класс JSObject предоставляет интерфейс для вызова методов JavaScript и проверки JavaScript-свойств.
Взаимодействие JavaScript и Java
Если Вы ссылаетесь на пакет или класс Java или работаете с объектом или массивом Java, Вы используете один из специальных объектов LiveConnect. Весь доступ JavaScript к Java осуществляется через эти объекты, резюме по которым — в следующей таблице.
Таблица 9.1   Объекты LiveConnect
Объект Описание JavaArray
Обёрнутый массив Java, к которому имеется доступ из кода JavaScript.
JavaClass
Ссылка JavaScript на Java-класс.
JavaObject
Обёрнутый объект Java, к которому имеется доступ из кода JavaScript.
JavaPackage
Ссылка JavaScript на Java-пакет.
Примечание
Поскольку Java является строго типизированным языком, а JavaScript типизирован слабо, машина выполнения JavaScript конвертирует значения аргументов в типы данных, подходящие для других языков, если Вы используете LiveConnect. См. Конвертация Типов Данных.
Иногда существование объектов LiveConnect достаточно прозрачно, поскольку Вы взаимодействуете с Java в довольно интуитивной манере. Например, Вы можете создать объект Java String и присвоить его в JavaScript переменной myString путём использования оператора new с конструктором Java таким вот образом:
var myString = new java.lang.String(«Hello world»)
Здесь переменная myString является JavaObject, поскольку она содержит экземпляр Java-объекта String. Как JavaObject, myString имеет доступ к public-методам экземпляра java.lang.String и его суперкласса, java.lang.Object. Эти Java-методы доступны в JavaScript как методы из JavaObject, и Вы можете вызывать их так:
myString.length() // возвращает 11
Объект Packages
Если Java-класс не является частью пакетов java, sun или netscape, Вы можете получить к нему доступ через объект Packages. Например, предположим, корпорация Redwood использует Java-пакет под названием redwood как контейнер различных Java-классов. Чтобы создать экземпляр класса HelloWorld из redwood, Вы осуществляете доступ к конструктору класса так:
var red = new Packages.redwood.HelloWorld()
Вы можете также иметь доступ к классам в пакете по умолчанию (то есть к классам, не указывающим пакет явно). Например, если класс HelloWorld находится непосредственно в пути CLASSPATH, а не в пакете, Вы можете получить к нему доступ так:
var red = new Packages.HelloWorld()
Объекты LiveConnect java, sun и netscape являются аббревиатурами для наиболее часто употребляющихся Java-пакетов. Например:
var myString = new java.lang.String(«Hello world»)
вместо более длинной версии:
var myString = new Packages.java.lang.String(«Hello world»)
Работа с Массивами Java
Если любой Java-метод создаёт массив и Вы ссылаетесь на этот массив в JavaScript, Вы работаете с JavaArray. Например, следующий код создаёт JavaArray x из 10 элементов типа int:
x = java.lang.reflect.Array.newInstance(java.lang.Integer, 10)
Как и объект Array из JavaScript, JavaArray имеет свойство length, которое возвращает количество элементов массива. В отличие от Array.length, JavaArray.length, это свойство только для чтения, поскольку количество элементов Java-массива фиксируется в момент создания.
Ссылки на Пакеты и Классы
Простые ссылки из JavaScript на пакеты и классы Java создают объекты JavaPackage и JavaClass. В предыдущем примере о компании Redwood, к примеру, ссылка Packages.redwood это JavaPackage-объект. Аналогично ссылка java.lang.String является JavaClass-объектом.
В большинстве случаев Вам не нужно беспокоиться об объектах JavaPackage и JavaClass — Вы просто работаете с пакетами и классами Java, а LiveConnect создаёт эти объекты прозрачно.
В JavaScript 1.3 и ранее JavaClass-объекты не конвертируются автоматически в экземпляры java.lang.Class. Если Вы передаёте их в качестве параметров Java-методам — Вы обязаны создавать wrapper/оболочку вокруг экземпляра java.lang.Class. В следующем примере метод forName создаёт объект-оболочку theClass, который затем передаётся методу newInstance для создания массива.
// JavaScript 1.3
the )
theArray = java.lang.reflect.Array.newInstance(theClass, 5)
В JavaScript 1.4 и позднее Вы можете передавать JavaClass-объект непосредственно в метод, как в следующем примере:
// JavaScript 1.4
theArray = java.lang.reflect.Array.newInstance(java.lang.String, 5)
Аргументы Типа char
В JavaScript 1.4 и позднее Вы можете передавать строку из одного символа в Java-метод, который требует аргумент типа char. Например, Вы можете передать строку «H» в конструктор Character:
c = new java.lang.Character(«H»)
В JavaScript 1.3 и ранее Вы обязаны передавать в такие методы целое число, соответствующее Unicode-значению символа. Например, следующий код также присваивает значение «H» переменной c:
c = new java.lang.Character(72)
Обработка Исключений Java в JavaScript
Если код Java прерывается на этапе прогона программы, он вызывает исключение. Если Ваш JavaScript-код имеет доступ к члену данных Java или методу и терпит неудачу, исключение Java передаётся в JavaScript для обработки. Начиная с JavaScript 1.4, Вы можете отловить это исключение в операторе try. catch.
Например, предположим, Вы используете Java-метод forName для присвоения имени Java-класа переменной theClass. Метод forName вызывает исключение, если передаваемое Вами значение не вычисляется в имя Java-класса. Поместите оператор присвоения forName в блок try для обработки исключения:
function getClass(javaClassName) <
try <
var the > > catch (e) <
return («The Java exception is » + e);
>
return theClass
>
В этом примере, если javaClassName вычисляется в верное имя класса, такое как «java.lang.String», присвоение проходит успешно. Если javaClassName вычисляется в неверное имя класса, такое как «String», функция getClass отлавливает исключение и возвращает нечто подобное:
The Java exception is java.lang.ClassNotFoundException: String
См. в разделе «Операторы Обработки Исключений» информацию об исключениях JavaScript.
Взаимодействие Java и JavaScript
Если Вы хотите использовать объекты JavaScript в Java, Вы обязаны импортировать пакет netscape.javascript в Ваш Java-файл. Этот пакет определяет следующие классы:
-
netscape.javascript.JSObject даёт доступ Java-коду к методам и свойствам JavaScript;
Начиная с JavaScript 1.2, эти классы поставляются в .jar файле; в предыдущих версиях JavaScript они поставлялись в .zip файле. См. в книге Ядро JavaScript. Справочник. информацию об этих классах.
Для доступа к классам LiveConnect поместите .jar или .zip файл в CLASSPATH компилятора JDK одним из следующих способов:
-
Создав переменную окружения CLASSPATH и специфицировав путь и имя .jar или .zip файла.
Например, в Navigator 4. 0 для Windows NT классы расположены в файле java40.jar в директории Program\Java\ >’ а. Вы можете специфицировать переменную окружения в Windows NT, дважды щёлкнув иконку System в Control Panel и создав пользовательскую переменную окружения под названием CLASSPATH со значением, типа такого:
См. в документации Sun JDK информацию о CLASSPATH.
Прим ечание
Поскольку Java является строго типизированным языком, а JavaScript -слабо типизированным, машина выполнения JavaScript конвертирует значения аргументов в типы данных, подходящие для других языков, если Вы используете LiveConnect. См. полную информацию в разделе Конвертация Типов Данных.
Использование Классов LiveConnect
Все объекты JavaScript появляются в коде Java как экземпляры netscape.javascript.JSObject. Если Вы вызываете метод в Java-коде, Вы можете передать в него JavaScript-объект как один из аргументов. Чтобы выполнить это, Вы обязаны определить соответствующий формальный параметр этого метода как имеющий тип JSObject.
Итак, при использовании JavaScript-объектов в Java-коде Вы всегда должны помещать вызов JavaScript-объекта внутри оператора try. catch, который обрабатывает исключения типа netscape.javascript.JSException. Это даёт Вашему Java-коду возможность обрабатывать ошибки при выполнении JavaScript-кода, которые появляются в Java как исключения типа JSException.
Доступ к JavaScript через JSObject
Например, предположим, Вы работаете с Java-классом JavaDog. Как показано в следующем коде, конструктор JavaDog принимает в качестве аргумента JavaScript-объект jsDog, который определён как имеющий тип JSObject:
public class JavaDog
<
public String dogBreed;
public String dogColor;
public String dogSex;
// определяется конструктор класса
public JavaDog(JSObject jsDog)
<
// здесь try. catch используется для обработки JSExceptions
this.dogBreed = (String)jsDog.getMember(«breed»);
this.dogColor = (String)jsDog.getMember(«color»);
this.dogSex = (String)jsDog.getMember(«sex»);
>
>
Обратите внимание, что метод getMember из JSObject используется для доступа к свойствам JavaScript-объекта. Предыдущий пример использует getMember для присвоения значения JavaScript-свойства jsDog.breed члену данных Java JavaDog.dogBreed.
Прим ечание
Более жизненный пример — помещение вызова метода getMember внутрь блока try. catch для обработки ошибок типа JSException. См. также Обработка Исключений JavaScript в Java.
Чтобы лучше понять, как работает getMember, посмотрите на определение специального JavaScript-объекта Dog:
function Dog(breed,color,sex) <
this.breed = breed
this.color = color
this.sex = sex
>
Вы можете создать в JavaScript экземпляр объекта Dog под названием gabby:
gabby = new Dog(«lab»,»chocolate»,»female»)
Если Вы вычисляете gabby.color, то увидите, что это свойство имеет значение «chocolate». Теперь предположим, что Вы создаёте экземпляр JavaDog в Вашем JavaScript-коде, передавая конструктору объект gabby:
javaDog = new Packages.JavaDog(gabby)
Если Вы вычисляете javaDog.dogColor, то увидите, что это свойство также имеет значение «chocolate», потому что метод getMember в Java-конструкторе присваивает переменной dogColor значение свойства gabby.color.
Обработка Ошибок JavaScript в Java
Когда JavaScript-код вызываемый из Java, терпит неудачу на этапе прогона программы, он вызывает исключение. Если Вы вызываете JavaScript-код из Java, Вы можете отловить это исключение в операторе try. catch. Исключение JavaScript доступно в Вашем Java-коде как экземпляр netscape.javascript.JSException.
JSException это Java-оболочка вокруг исключения любого типа, вызываемого в JavaScript, аналогично тому, как экземпляры JSObject являются оболочками для JavaScript-объектов. Используйте JSException, если Вы вычисляете JavaScript-код в Java.
Если Вы вычисляете JavaScript-код в Java, следующие ситуации могут вызвать ошибки времени выполнения:
-
Код JavaScript не вычисляется или из-за ошибки компиляции JavaScript, или из-за какой-нибудь другой ошибки времени выполнения. Интерпретатор JavaScript генерирует сообщение об ошибке, которое конвертируется в экземпляр JSException.
Java успешно вычисляет JavaScript-код, но JavaScript-код выполняет необработанный оператор throw.
JavaScript вызывает исключение, которое обёрнуто как экземпляр JSException. Используйте метод getWrappedException из JSException для развёртывания этого исключения в Java.
Например, предположим, что Java-объект eTest вычисляет строку jsCode, которую Вы ему передали. Вы можете отреагировать на любую ошибку времени выполнения, возникающую при вычислении, реализуя такой обработчик исключения:
import netscape.javascript.JSObject;
import netscape.javascript.JSException;
public class eTest <
public static Object doit(JSObject obj, String jsCode) <
try <
obj.eval(jsCode);
> catch (JSException e) <
if (e.getWrappedException()==null)
return e;
return e.getWrappedException();
>
return null;
>
>
В этом примере код блока try пытается вычислить строку jsCode, переданную ему Вами. Скажем, Вы передали строку «myFunction()» в качестве значения jsCode. Если myFunction не определена как функция JavaScript, интерпретатор JavaScript не может вычислить jsCode. Интерпретатор генерирует сообщение об ошибке, Java-обработчик отлавливает сообщение, а метод doit возвращает экземпляр объекта netscape.javascript.JSException.
Предположим, однако, что myFunction определена в JavaScript так:
function myFunction() <
try <
if (theCondition == true) <
return «Everything’s ok»;
> else <
throw «JavaScript error occurred» ;
>
> catch (e) <
if (canHandle == true) <
handleIt();
> else <
throw e;
>
>
>
Если theCondition — false, функция вызывает исключение. Это исключение отлавливается в коде JavaScript, и, если canHandle — true, JavaScript обрабатывает исключение. Если canHandle — false, исключение повторно вызывается, Java-обработчик отлавливает его, а метод doit возвращает Java-строку:
JavaScript error occurred
См. в разделе «Операторы Обработки Исключений» полную информацию об исключениях JavaScript.
Обратная Совместимость
В JavaScript 1.3 и ранее, класс JSException имел три public-конструктора, которые по выбору принимали строковой аргумент, специфицирующий детали сообщения или другую информацию для исключения. Метод getWrappedException отсутствовал.
Используйте оператор try. catch для обработки LiveConnect-исключений в JavaScript 1.3 и более ранних версиях таким образом:
try <
global.eval(«foo.bar = 999;»);
> catch (Exception e) <
if (e instanceof JSException) <
jsCodeFailed()»;
> else <
otherCodeFailed();
>
>
В этом примере оператор eval терпит неудачу, если foo не определено. Блок catch выполняет метод jsCodeFailed, если оператор eval в блоке try вызывает JSException; метод otherCodeFailed выполняется в случае, если блок try вызывает какую-либо иную ошибку.
Конвертация Типов Данных
Поскольку язык Java строго типизирован, а JavaScript типизирован слабо, машина выполнения JavaScript конвертирует значения аргументов в типы данных, подходящие для других языков, если Вы используете LiveConnect. Эта конвертация описана в разделах:
Конвертация JavaScript в Java
Если Вы вызываете Java-метод и передаёте ему параметры из JavaScript, типы данных передаваемых параметров конвертируются в соответствии с правилами, описанными в следующих разделах:
return-значения методов объекта netscape.javascript.JSObject всегда конвертируются в экземпляры объекта java.lang.Object. Правила конвертации этих return-значений также описаны в этих разделах.
Например, если JSObject.eval возвращает JavaScript-число, Вы можете найти правила конвертации этого числа в экземпляр объекта java.lang.Object в разделе Числа.
Числа
Если Вы передаёте числовые типы JavaScript в качестве параметров методам Java, Java конвертирует эти значения в соответствии с правилами, описанными в следующей таблице:
double
Точное значение переносится в Java без округления и без потери точности или знака.
lava.lang.Double
java.lang.Object
Создаётся новый экземпляр java.lang.Double, и точное значение передаётся в Java без округления и без потери точности или знака.
float
-
Значения округляются до чисел с плавающей точкой.
byte
char
int
long
short
-
Значения округляются с использованием режима round-to-negative-infinity/округление-в-сторону-отрицательной-бесконечности.
Значения, которые слишком малы или велики, чтобы быть представленными, дают ошибку времени выполнения.
java.lang.String
Значения конвертируются в строки. Например,
- 237 становится «237»
boolean
-
Значения 0 и NaN конвертируются в false.
Если число JavaScript передаётся в качестве параметра в Java-метод, который ожидает экземпляр объекта java.lang.String, это число конвертируется в строку. Используйте метод equals() для сравнения результата этой конвертации с другими строковыми значениями.
Булевы Значения
Если Вы передаёте Булевы типы JavaScript как параметры для Java-методов, Java конвертирует значения в соответствии с правилами, описанными в следующей таблице:
boolean
Все значения конвертируются непосредственно в Java-эквиваленты.
lava.lang.Boolean
java.lang.Object
Создаётся новый экземпляр объекта java.lang.Boolean. Каждый параметр создаёт новый экземпляр, а не один экземпляр с тем же примитивным значением.
java.lang.String
Значения конвертируются в строки. Например:
-
true становится «true»
byte
char
double
float
int
long
short
-
true становится 1
Если Булево значение JavaScript передаётся в качестве параметра Java-методу, ожидающему экземпляр объекта java.lang.String, Булево значение конвертируется в строку. Используйте операцию == для сравнения результата этой конвертации с другими строковыми значениями.
Строковые Значения
Если Вы передаёте строковые типы JavaScript как параметры для Java-методов, Java конвертирует значения в соответствии с правилами, описанными в следующей таблице:
lava.lang.String
java.lang.Object
JavaScript 1.4:
-
Строка JavaScript конвертируется в экземпляр объекта java.lang.String со значением Unicode.
JavaScript 1.3 и ранее:
- Строка JavaScript конвертируется в экземпляр объекта java.lang.String со значением ASCII.
byte
double
float
int
long
short
Все значения конвертируются в числа так, как описано в ECMA-262.
Строковые значения JavaScript конвертируются в числа в соответствии с правилами ECMA-262
JavaScript 1.4:
-
Односимвольные строки конвертируются в Unicode-символы.
JavaScript 1.3 и ранее:
- Все значения конвертируются в числа.
boolean
-
Пустая строка становится false.
Undefined-Значения
Если Вы передаёте значения undefined JavaScript в качестве параметров методам Java, Java конвертирует значения в соответствии с правилами, описанными в следующей таблице:
lava.lang.String
java.lang.Object
Значение конвертируется в экземпляр объекта java.lang.String, значением которого является строка «undefined».
boolean
Значение становится false.
double
float
Значение становится NaN.
byte
char
int
long
short
Значение становится 0.
Конверсия значения undefined возможна только в JavaScript 1.3 и более поздних версиях. Более ранние версии JavaScript не поддерживают значения undefined.
Если значение undefined JavaScript передаётся в качестве параметра Java-методу, который ожидает экземпляр объекта java.lang.String, значение undefined конвертируется в строку. Используйте операцию == для сравнения результата этой конвертации с другими строковыми значениями.
Null-Значения
Если Вы передаёте значения null JavaScript в качестве параметра Java-методам, Java конвертирует значения в соответствии с правилами, описанными в следующей таблице:
Любой класс
Любой тип интерфейса
Значение становится null.
byte
char
double
float
int
long
short
Значение становится 0.
boolean
Значение становится false.
Объекты JavaArray и JavaObject
В большинстве случаев, если Вы передаёте JavaArray или JavaObject JavaScript в качестве параметра Java-методу, Java просто снимает оболочку с объекта; в некоторых случаях объект приводится к другому типу данных в соответствии с правилами, описанными в следующей таблице:
Любой интерфейс или класс, совместимый при присвоении с развёрнутым /unwrapped объектом.
Объект разворачивается.
java.lang.String
Объект разворачивается, вызывается метод toString развёрнутого Java-объекта, и результат возвращается как новый экземпляр объекта java.lang.String.
byte
char
double
float
int
long
short
Объект разворачивается, и возникает одна из следующих ситуаций:
-
Если развёрнутый Java-объект имеет метод doubleValue, the JavaArray или JavaObject конвертируется в значение, возвращаемое этим методом.
boolean
В JavaScript 1.3 и более поздних версиях, объект разворачивается, и возникает одна из следующих ситуаций:
-
Если объект — null, он конвертируется в false.
В JavaScript 1.2 и ранее, объект разворачивается, и возникает одна из следующих ситуаций:
-
Если развёрнутый объект имеет метод booleanValue, the исходный объект конвертируется в return-значение.
Интерфейс или класс совместим для присвоения с развёрнутым объектом, если развёрнутый объект является экземпляром типа Java-параметра. То есть, следующий оператор должен возвращать true:
развёрнутыйОбъект instanceof параметраТип
Объекты JavaClass
Если Вы передаёте объект JavaClass из JavaScript в качестве параметра Java-методу, Java конвертирует значение в соответствии с правилами, описанными в следующей таблице:
java.lang.Class
Объект разворачивается.
java.lang.JSObject
java.lang.Object
Объект JavaClas разворачивается в новый экземпляр объекта java.lang.JSObject.
java.lang.String
Объект разворачивается, вызывается метод toString развёрнутого Java-объекта и результат возвращается как новый экземпляр объекта java.lang.String.
boolean
В JavaScript 1.3 и позднее, объект разворачивается, и возникает одна из следующих ситуаций:
-
Если объект — null, он конвертируется в false.
Если объект имеет какое-либо другое значение, он конвертируется в true.
В JavaScript 1.2 и ранее, объект разворачивается, и возникает одна из следующих ситуаций:
-
Если развёрнутый объект имеет метод booleanValue, исходный объект конвертируется в return-значение.
Другие Объекты JavaScript
Если Вы передаёте любой иной объект JavaScript в качестве параметра Java-методу, Java конвертирует значение в соответствии с правилами, описанными в следующей таблице:
java.lang.JSObject
java.lang.Object
Объект разворачивается в новый экземпляр объекта java.lang.JSObject.
java.lang.String
Объект разворачивается, вызывается метод toString развёрнутого Java-объекта и результат возвращается как новый экземпляр объекта java.lang.String.
byte
char
double
float
int
long
short
Объект конвертируется в значение с использованием логики оператора ToPrimitive, описанного в ECMA-262. Подсказка PreferredType , используемая с этим оператором, является Number.
boolean
В JavaScript 1.3 и позднее, объект разворачивается, и возникает одна из следующих ситуаций:
-
Если объект — null, он конвертируется в false.
В JavaScript 1.2 и ранее, объект разворачивается, и возникает одна из следующих ситуаций:
-
Если развёрнутый объект имеет метод booleanValue, исходный объект конвертируется в return-значение.
Конвертация из Java в JavaScript
Значения, передаваемые из Java в JavaScript, конвертируются так:
-
Java-значения byte, char, short, int, long, float и double конвертируются в числа JavaScript.
Булево значение Java конвертируется в булево значение JavaScript.
Объект класса netscape.javascript.JSObject конвертируется в оригинальный JavaScript-объект.
Массивы Java конвертируются в объект псевдо-Array JavaScript; поведение этого объекта похоже на объект Array из JavaScript: Вы можете получить к нему доступ через синтаксис arrayName[index] (где index это целое число) и определить его размер через свойство arrayName.length.
Java-объект любого иного класса конвертируется в оболочку JavaScript, которая может использоваться для доступа к методам и полям Java-объекта:
-
Конвертация этой оболочки в строку вызывает метод toString объекта-оригинала.
Конвертация в число вызывает метод doubleValue, если это возможно, иначе — терпит неудачу.
Конвертация в boolean в JavaScript 1.3 и более поздних версиях возвращает false, если объект — null, и true — в ином случае.
Заметьте, что экземпляры объектов java.lang.Double и java.lang.Integer конвертируются в объекты JavaScript, а не в числа JavaScript. Аналогично и экземпляры java.lang.String также конвертируются в объекты JavaScript, а не в строки JavaScript.
Java String-объекты также соответствуют JavaScript-оболочкам. Если Вы вызываете метод JavaScript, который требует строки JavaScript, и передаёте его этой оболочке, Вы получите ошибку. Вместо этого конвертируйте оболочку в строку JavaScript путём присоединения к ней пустой строки, как показано здесь:
Джедайские приемы на JavaScript: магические свойства транслятора событий
О чем мы?
Event Emitter можно перевести как “транслятор” или “эмиттер” событий. Звучит как название штуки, умеющей генерировать событие, которое может “услышать” кто угодно.
Представьте себе такую схему: в вашем асинхронном коде определенный участок может “крикнуть” остальным, что он выполнил свою задачу, а другие части “услышат” этот сигнал и примут соответствующие меры.
Event Emitter — это шаблон, который можно реализовать разными способами. Основная идея в том, чтобы грамотно создать основу для управления событиями и реализовать возможность любым элементам “подписаться” на него (и быть в курсе происходящего). С другими шаблонами проектирования вы можете познакомиться в нашей статье.
Уже интересно, как такая магия может работать? Итак, мы хотим добиться кода, который затем можно будет использовать так:
Реализация
Как видите, конструктор нашего класса будет инициализировать поле events, пока что делая его пустым объектом. Задача этого поля — хранить события, “подписавшиеся” на нас (то есть в нем будут храниться функции).
«КРОК», Москва, Троицк, Санкт-Петербург, Нижний Новгород, Самара, Иркутск, Пермь, Краснодар, Воронеж, Челябинск, от 120 000 до 240 000 ₽
Этот метод принимает в качестве аргументов название события (например, event:name-changed , как в нашем примере) и функцию, которая будет вызываться, когда будет инициироваться транслируемое событие.
Одна из ключевых особенностей функций в JavaScript состоит в том, что функции — это этакие “объекты первого класса”, то есть мы можем передать функцию в качестве параметра другой функции, как в методе subscribe() .
Этот метод принимает имя события, которое мы хотим всем транслировать, и данные, которые будут отправляться в момент этого события. Если в экземпляре класса сохранены какие-то подписанные на него события, мы проходимся по каждому из них и вызываем каждое, передавая ему данные, которые хотим транслировать.
Собственно, с реализацией паттерна мы закончили. Но пока остается одна проблема: нам нужно будет “отписать” функции, которые нам больше не нужны. Не сделаем этого — столкнемся с утечкой памяти.
Давайте решим эту проблему. Пусть метод subscribe() возвращает функцию unsubscribe() , которую позже можно будет использовать, чтобы отписаться от события.
Как мы помним, в JavaScript особенные функции — их легко можно вернуть из другой функции. Теперь метод subscribe() можно использовать следующим образом:
Вызывая сохраненную в переменной функцию unsubscribe() , мы отписываемся от события.
Вот и все. Пока-пока, утечки памяти!
Вот тут можно попробовать весь получившийся код в действии.
Глава 15
LiveConnect. Обзор.
В этой главе рассматривается использование технологии LiveConnect, позволяющей коду Java и коду JavaScript взаимодействовать. Предполагается, что Вы уже знакомы с программированием на Java.
В главе имеются следующие разделы:
Дополнительно об использовании LiveConnect см. JavaScript technical notes на сайте DevEdge.
Что такое LiveConnect?
В браузере Navigator LiveConnect дает возможность использовать:
- JavaScript для прямого доступа к переменным, методам, классам и пакетам Java.
- Управлять Java-аплетами и plug-in’ами с помощью JavaScript.
- Код Java для доступа к методам и свойствам JavaScript.
Включение LiveConnect
Служба LiveConnect по умолчанию включена в Navigator’е 1.1 и последующих версиях. Чтобы LiveConnect работала, должны быть включены Java и JavaScript. Для проверки этого выберите Preferences в меню Edit и просмотрите раздел Advanced.
- Убедитесь, что опция Enable Java отмечена.
- Убедитесь, что опция Enable JavaScript отмечена.
Для отключения Java или JavaScript уберите галочки в переключателях; если Вы это сделали, LiveConnect работать не будет.
Консоль Java
Консоль Java это окно Navigator’а отображающее сообщения Java. Если Вы используете переменные классов out или err в java.lang.System для вывода сообщения, сообщение появляется на консоли. Для показа Java-консоли, выберите Java Console в меню Communicator.
Вы можете использовать Java-консоль для показа сообщений пользователю или для трассировки значений переменных в различных точках при выполнении программы. Учтите, что многие пользователи отключают показ консоли.
Например, следующий код Java выводит сообщение «Hello, world!» в Java-консоль:
Работа с оболочками
В JavaScript оболочка\wrapper это объект типа данных целевого языка, который содержит объект исходного языка. На стороне JavaScript Вы можете использовать объект-оболочку для доступа в методам и полям Java-объекта; вызов метода или доступ к свойству в оболочке приводит к вызову Java-объекта. На стороне Java — JavaScript-объекты оборачиваются в экземпляры класса netscape.javascript.JSObject и передаются в Java.
Если JavaScript-объект пересылается в Java, машина выполнения создает Java-оболочку типа JSObject ; когда JSObject высылается из Java в JavaScript, машина выполнения развертывает его в оригинальный тип JavaScript-объекта. Класс JSObject предоставляет интерфейс для вызова методов JavaScript и проверки свойств JavaScript.
Взаимодействие JavaScript с Java
Когда Вы обращаетесь к пакету или классу Java или работаете с массивом или объектом Java, Вы используете один из специальных объектов LiveConnect. Все запросы JavaScript к Java выполняются с помощью этих объектов, резюме по которым дано в таблице.
Таблица 15.1 Объекты LiveConnect
Объект | Описание | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Тип Java-парамера | Правила конвертации |
---|---|
| |
| |
Если JavaScript-число передается как параметр в Java-метод, ожидающий экземпляр java.lang.String , число конвертируется в строку. Используйте операцию == для сравнения результата конвертации с другими строковыми значениями.
Булевы
Если Вы передаете Булев тип JavaScript в качестве параметра Java-методам, Java конвертирует значения таким образом:
Тип Java-параметра | Правила конвертации |
---|---|
Если JavaScript Boolean передается в качестве параметра Java-методу, который ожидает экземпляр java.lang.String , Boolean конвертируется в строку. Используйте операцию == для сравнения результата конвертации с другими строковыми значениями.
Строковые
Если Вы передаете строковые значения JavaScript в качестве параметров Java-методам, Java конвертирует значения так:
Тип Java-параметра | Правила конвертации>
Строка JavaScript конвертируется в экземпляр java.lang.String с ASCII-значением. Все значения конвертируются в числа, как описано в спецификации ECMA-262. Все значения конвертируются в числа.
|
|
---|
Undefined-значения
Если Вы передаете undefined-значения JavaScript в качестве параметров Java-методам, Java конвертирует значения так:
Тип Java-параметра | Правила конвертации | |||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Тип Java-параметра | Правила конвертации
Любой класс Значение становится null. Значение становится 0. Значение становится false. Объекты JavaArray и JavaObjectВ большинстве случаев, если Вы передаете JavaScript JavaArray или JavaObject в качестве параметров Java-методу, Java просто снимает оболочку с объекта; иногда объект приводится к другому типу данных в соответствии с правила из таблицы:
Интерфейс или класс совместимы при присвоении, если развернутый объект является экземпляром типа Java-параметра. То есть следующий оператор обязан возвратить true: JavaClass-объектыЕсли Вы передаете JavaScript JavaClass -объект как параметр Java-методу, Java конвертирует этот объект в соответствии со следующими правилами:
Другие объекты JavaScriptЕсли Вы передаете любой другой объект JavaScript в качестве параметра Java-методу, Java конвертирует этот объект в соответствии со следующими правилами:
Конвертация из Java а JavaScriptПередаваемые из Java в JavaScript значения конвертируются так:
Программа выкладывается на сервер в виде исходного кода в текстовой форме и в дальнейшем интерпретируется (без предварительной компиляции) браузером после загрузки ее с сервера. Программа компилируется в машинно-независимый байтовый код Java-код, после чего выкладыватся на сервер. Браузер (виртуальная Java-машина) исполняет Java-код. Объектный . Можно программировать как без использования объектного программирования, так и используя предопределенные встроенные классы. Имеется теоретическая возможность расширения этих классов, но реально она никогда не используется. Объектно-ориентированный . Программировать без использования объектного программирования нельзя. Апплеты состоят из классов с возможностью иерархического наследования по традиционной схеме наследования. Использование наследования и полиморфизма – основа программирования в Java. В отличие от подавляющего большинства языков объектного программирования в JavaScript структура объектов не задается однозначно устройством класса, а является динамической и может меняться на этапе выполнения программы. Объекты могут динамически получать новые поля и методы или изменять любые параметры старых. Структура объектов полностью задается на этапе компиляции их классов. Свободная типизация : элементарные типы данных переменных не описываются, при присваивании тип левой части всегда определяется по результату присваивания (т.е. по правой части) Строгая типизация : типы данных любых переменных должны быть описаны перед использованием, тип левой части должен совпадать с типом правой (за редкими исключениями, когда работает автоматическое приведение типа результата к типу левой части) Динамическое связывание кода с объектами : ссылки на объекты проверяются во время выполнения программы. Статическое связывание кода с объектами : ссылки на объекты должны существовать на момент компиляции |
---|
Значения переменных, функций и выражений бывают следующих типов:
в десятичной системе единиц: 0, 29, 70, -147 и т.п.;
в 16-ричной: 0х70 или 0х70, 0 X FA7D0 и т.п.;
в 8-ричной: 070, 0710 ( Внимание. В едущий ноль воспринимается как символ 8-ричного числа ) и т.п.
0.0, -2.9, 0.7E1, 14.7e-2, 1e+308 (максимальное вещественное число), 1.001e-305 (минимальное по модулю вещественное число, отличное от нуля) и т.п.;
Глобальные переменные можно вводить в любом месте текста программы путем простого присваивания значения . Но необходимо, чтобы переменная была определена до того момента, когда вызывается при исполнении:
и т.п. При этом тип переменной приводится к типу присваиваемого значения, причем в последующем этой же переменной можно присвоить значение другого типа:
myVariable=» Теперь это текстовая переменная «
При задании переменной использование зарезервированного слова var не обязательно, но желательно, т.к. помогает при использовании отладчика фирмы Microsoft и делает текст программы более структурированным. На деле вместо переменной в текущем объекте window создается новое поле с таким именем. В функциях при задании локальных переменных использование var обязательно (иначе будет создана глобальная переменная).
При наличии численных и строковых значений в одном выражении идет приведение к строковому типу. Значением переменной
a=7+» раз отмерь,»+1+»раз присвой «
будет строка «7 раз отмерь, 1 раз присвой «.
Стоит отметить, что существуют также функции parseFloat и parseInt , которые осуществляют преобразование из строкового значения в численное.
Идентификатором переменной может быть последовательность символов из набора букв от «A» до «Z», от «a» до «z», цифр от «0» до «9», а также символ подчеркивания «_». При этом первым символом имени не может быть цифра, а заглавные и строчные буквы отличаются (т. е. имена MyVariable и myvariable относятся к разным переменным).
Кроме глобальных переменных в функции или другом блоке кода можно определить локальные, для них областью видимости будет только функция (без кода), в которой они определены:
Для встраивания программы на JavaScript в HTML — файл используются теги . При этом результат работы можно увидеть сразу и при необходимости внести изменения.
Вызов java-методов в javascript-коде
Я создал метод содержимого класса Java, возвращающий String, мой вопрос — как вызвать эту функцию в моем javascript-коде, чтобы использовать возвращаемое значение из java-метода. Я хочу называть код Java на стороне клиента, встроенный в браузер.
вот пример того, о чем я говорю:
на моей веб-странице у меня есть код javascript, вот некоторые из них:
Я хочу создать методы содержимого класса Java для предоставления данных этой функции javascript «GanttTaskInfo». например, для получения имени, получения идентификатора и даты. хорошо, я думаю, что на этот раз я ясно: D Я искал способ вызова java-методов в javascript, и я нашел апплеты, как вы сказали, но я думаю, что это не полезно для меня. Еще раз спасибо
Когда на стороне сервера используются веб-сервисы — возможно, restfull с json. Например, посмотрите на этот учебник http://developers-blog.org/blog/default/2010/04/27/JQuery-Ajax-Client-and-Jersey-Rest-JSON-Endpoint-Example.
Когда java-код находится в апплете, вы можете использовать javascript-мост. Мост между языками программирования Java и JavaScript известен неформально LiveConnect, реализован в java-плагине. Раньше функциональность LiveConnect, зависящая от Mozilla, такая как возможность вызова статических методов Java, создания экземпляров новых объектов Java и ссылок на сторонние пакеты из JavaScript, теперь доступна во всех браузерах.
Ниже приведен пример из документации. Посмотрите methodReturningString .
Веб-страница и код JavaScript:
Java — это серверный язык, а javascript — язык на стороне клиента. Оба не могут общаться. Если вы настроили серверную часть script с помощью Java, вы можете использовать AJAX на клиенте, чтобы отправить асинхронный запрос на него и таким образом, вызывать любые возможные функции Java. Например, если вы используете jQuery как js framework, вы можете взглянуть на метод $.ajax() . Или, если вы хотите сделать это, используя простой javascript, здесь учебник.
Введение в JavaScript
Давайте посмотрим, что такого особенного в JavaScript, чего можно достичь с его помощью и какие другие технологии хорошо с ним работают.
Что такое JavaScript?
Изначально JavaScript был создан, чтобы «сделать веб-страницы живыми».
Программы на этом языке называются скриптами. Они могут встраиваться в HTML и выполняться автоматически при загрузке веб-страницы.
Скрипты распространяются и выполняются, как простой текст. Им не нужна специальная подготовка или компиляция для запуска.
Это отличает JavaScript от другого языка – Java.
Когда JavaScript создавался, у него было другое имя – «LiveScript». Однако, язык Java был очень популярен в то время, и было решено, что позиционирование JavaScript как «младшего брата» Java будет полезно.
Со временем JavaScript стал полностью независимым языком со своей собственной спецификацией, называющейся ECMAScript, и сейчас не имеет никакого отношения к Java.
Сегодня JavaScript может выполняться не только в браузере, но и на сервере или на любом другом устройстве, которое имеет специальную программу, называющуюся «движком» JavaScript.
У браузера есть собственный движок, который иногда называют «виртуальная машина JavaScript».
Разные движки имеют разные «кодовые имена». Например:
- V8 – в Chrome и Opera.
- SpiderMonkey – в Firefox.
- …Ещё есть «Trident» и «Chakra» для разных версий IE, «ChakraCore» для Microsoft Edge, «Nitro» и «SquirrelFish» для Safari и т.д.
Эти названия полезно знать, так как они часто используются в статьях для разработчиков. Мы тоже будем их использовать. Например, если «функциональность X поддерживается V8», тогда «Х», скорее всего, работает в Chrome и Opera.
Движки сложны. Но основы понять легко.
- Движок (встроенный, если это браузер) читает («парсит») текст скрипта.
- Затем он преобразует («компилирует») скрипт в машинный язык.
- После этого машинный код запускается и работает достаточно быстро.
Движок применяет оптимизации на каждом этапе. Он даже просматривает скомпилированный скрипт во время его работы, анализируя проходящие через него данные, и применяет оптимизации к машинному коду, полагаясь на полученные знания. В результате скрипты работают очень быстро.
Что может JavaScript в браузере?
Современный JavaScript – это «безопасный» язык программирования. Он не предоставляет низкоуровневый доступ к памяти или процессору, потому что изначально был создан для браузеров, не требующих этого.
Возможности JavaScript сильно зависят от окружения, в котором он работает. Например, Node.JS поддерживает функции чтения/записи произвольных файлов, выполнения сетевых запросов и т.д.
В браузере для JavaScript доступно всё, что связано с манипулированием веб-страницами, взаимодействием с пользователем и веб-сервером.
Например, в браузере JavaScript может:
- Добавлять новый HTML-код на страницу, изменять существующее содержимое, модифицировать стили.
- Реагировать на действия пользователя, щелчки мыши, перемещения указателя, нажатия клавиш.
- Отправлять сетевые запросы на удалённые сервера, скачивать и загружать файлы (технологии AJAX и COMET).
- Получать и устанавливать куки, задавать вопросы посетителю, показывать сообщения.
- Запоминать данные на стороне клиента («local storage»).
Чего НЕ может JavaScript в браузере?
Возможности JavaScript в браузере ограничены ради безопасности пользователя. Цель заключается в предотвращении доступа недобросовестной веб-страницы к личной информации или нанесения ущерба данным пользователя.
Примеры таких ограничений включают в себя:
JavaScript на веб-странице не может читать/записывать произвольные файлы на жёстком диске, копировать их или запускать программы. Он не имеет прямого доступа к системным функциям ОС.
Современные браузеры позволяют ему работать с файлами, но с ограниченным доступом, и предоставляют его, только если пользователь выполняет определённые действия, такие как «перетаскивание» файла в окно браузера или его выбор с помощью тега .
Существуют способы взаимодействия с камерой/микрофоном и другими устройствами, но они требуют явного разрешения пользователя. Таким образом, страница с поддержкой JavaScript не может незаметно включить веб-камеру, наблюдать за происходящим и отправлять информацию в ФСБ.
Различные окна/вкладки не знают друг о друге. Иногда одно окно, используя JavaScript, открывает другое окно. Но даже в этом случае JavaScript с одной страницы не имеет доступа к другой, если они пришли с разных сайтов (с другого домена, протокола или порта).
Это называется «Политика одинакового источника» (Same Origin Policy). Чтобы обойти это ограничение, обе страницы должны согласиться с этим и содержать JavaScript-код, который специальным образом обменивается данными.
Это ограничение необходимо, опять же, для безопасности пользователя. Страница http://anysite.com , которую открыл пользователь, не должна иметь доступ к другой вкладке браузера с URL http://gmail.com и воровать информацию оттуда.
JavaScript может легко взаимодействовать с сервером, с которого пришла текущая страница. Но его способность получать данные с других сайтов/доменов ограничена. Хотя это возможно в принципе, для чего требуется явное согласие (выраженное в заголовках HTTP) с удалённой стороной. Опять же, это ограничение безопасности.
Подобные ограничения не действуют, если JavaScript используется вне браузера, например — на сервере. Современные браузеры предоставляют плагины/расширения, с помощью которых можно запрашивать дополнительные разрешения.
Что делает JavaScript особенным?
Как минимум, три сильные стороны JavaScript:
- Полная интеграция с HTML/CSS.
- Простые вещи делаются просто.
- Поддерживается всеми основными браузерами и включён по умолчанию.
JavaScript – это единственная браузерная технология, сочетающая в себе все эти три вещи.
Вот что делает JavaScript особенным. Вот почему это самый распространённый инструмент для создания интерфейсов в браузере.
Хотя, конечно, JavaScript позволяет делать приложения не только в браузерах, но и на сервере, на мобильных устройствах и т.п.
Языки «над» JavaScript
Синтаксис JavaScript подходит не под все нужды. Разные люди хотят иметь разные возможности.
Это естественно, потому что проекты разные и требования к ним тоже разные.
Так, в последнее время появилось много новых языков, которые транспилируются (конвертируются) в JavaScript, прежде чем запустятся в браузере.
Современные инструменты делают транспиляцию очень быстрой и прозрачной, фактически позволяя разработчикам писать код на другом языке, автоматически преобразуя его в JavaScript «под капотом».
Примеры таких языков:
- CoffeeScript добавляет «синтаксический сахар» для JavaScript. Он вводит более короткий синтаксис, который позволяет писать чистый и лаконичный код. Обычно такое нравится Ruby-программистам.
- TypeScript концентрируется на добавлении «строгой типизации» для упрощения разработки и поддержки больших и сложных систем. Разработан Microsoft.
- Flow тоже добавляет типизацию, но иначе. Разработан Facebook.
- Dart стоит особняком, потому что имеет собственный движок, работающий вне браузера (например, в мобильных приложениях). Первоначально был предложен Google, как замена JavaScript, но на данный момент необходима его транспиляция для запуска так же, как для вышеперечисленных языков.
Есть и другие. Но даже если мы используем один из этих языков, мы должны знать JavaScript, чтобы действительно понимать, что мы делаем.
Использование языка JavaScript с HTML-формами
Дата добавления: 2015-07-09 ; просмотров: 4842 ; Нарушение авторских прав
Форма является единственным средством, которое предоставляет пользователю возможность вводить данные в Web-документы без помощи каких-либо программ. Взаимодействие JavaScript-программ и форм обеспечивается за счет того, что в языке JavaScript имеется множество объектов, соответствующих HTML-тегам, которые могут присутствовать в теге . Таким образом, поля ввода (text-field), области текста (text-area), селекторные кнопки, списки и контрольные переключатели не могут располагаться вне этого контейнера. Поля формы предоставляют возможность вводить данные и сохранять их для дальнейшей обработки. До появления языка JavaScript формы были единственным способом ввода данных в HTML-документы. В языке JavaScript имеется собственный метод (prompt()), обеспечивающий ввод текста, однако формы в этом случае предоставляют все же больше удобств. Тег
Атрибут name задает имя формы, а атрибут enctype — тип кодирования для передаваемых данных формы (по умолчанию используется MIME). Посредством атрибута method определяется метод передачи данных формы, а посредством атрибута action — адрес URL для CGI-скрипта, который вызывается на сервере для обработки данных формы. Атрибут обработчика события on Submit используется для указания JavaScript-программы, вызываемой при активизации кнопки передачи данных. Эта кнопка задается в теге .
Интерфейс CGI и язык JavaScript
До появления броузера Navigator 2.0 и языка JavaScript данные HTML-формы обрабатывались только с помощью CGI-скрипта, работающего на сервере. Интерфейс CGI (Common Gateway Interface) — это стандарт обслуживания запросов, широко применяемый на интерактивных Web-узлах.
Главным в концепции интерфейса CGI является CGI-скрипт (программа, которая принимает данные, передаваемые клиентом). Данные формы посылаются клиентом в закодированном виде. Скрипты, как правило, преобразовывают их для чтения и записывают в обычный текстовый файл или в базу данных на сервере. Программы CGI используются в разных целях, например для ведения журналов посещений (guest-book), для обработки данных форм HTML, электронной почты и даже для игр.
При помощи языка JavaScript проверка правильности введенной пользователем информации может выполняться на локальной клиентской станции и в большинстве случаев не требует передачи данных на сервер. Значения атрибутов method и action используют главным образом разработчики программ CGI, которые принимают и обрабатывают данные формы. Возможности языка JavaScript по хранению данных ограничены: в настоящее время «ключики» (cookie) являются единственным способом хранения данных на локальном диске (см. главу 13), хотя серверный JavaScript-модуль в продукте Live Wire компании Netscape предоставляет возможность ведения баз данных. Программы на языке JavaScript предназначены для локальной обработки данных. Одной из главных проблем, возникающих при обработке данных форм, является проверка правильности таких данных, и язык JavaScript может помочь в этом. Если на локальном компьютере не производится проверки правильности форм, выполнение этой задачи должен взять на себя сервер. Тогда увеличится не только нагрузка на сервер, но и время реакции системы в целом, поскольку данные формы сначала передаются серверу, который проверяет их и при обнаружении ошибок пересылаются обратно вместе с сопроводительным сообщением. При большом количестве ошибок многократная передача исправленных данных занимает много времени и ресурсов. Проверка правильности данных формы при помощи JavaScript-программы перед передачей их на сервер имеет большие преимущества: во-первых, экономится время, а во-вторых, облегчается сетевой трафик. Кроме того, сервер, принимая данные формы, не выполняет проверки, предполагая, что переданная ему информация является полной и корректной.
Контейнер . может содержать любой из приведенных в следующей таблице тегов элементов формы языка HTML.
Описание | Тег элемента Формы |
Контрольный переключатель | |
Кнопка передачи формы | |
Скрытое поле | |
Кнопка | |
Селекторная кнопка | |
Список | , в котором с помощью тегов задаются его элементы. Количество элементов списка не ограничено. В языке JavaScript элементам списка соответствует массив options, индексы которого начинаются с нуля. Элементы списка имеют свойство selected, которое содержит значение true, если данный элемент выбран, и false — в противном случае. В HTML-теге также можно указать атрибут selected и задать в нем элемент, выбранный по умолчанию. Чтобы получить информацию о состоянии элемента списка по умолчанию в JavaScript-программе, необходимо обратиться к свойству default Che eked элемента списка. Элементы списка имеют также свойство text, значением которого является текст, заданный после тега . Свойство списка selectedlndex возвращает индекс выбранного элемента. Списки могут быть представлены несколькими способами. Если в теге , в котором задается необходимое количество тегов . В списке этого типа можно выбрать только один элемент (single selection). Все элементы списка появляются после щелчка мышью на кнопке списка или на элементе списка, а когда список закрыт, отображается тот элемент, который выбран по умолчанию. На следующем рисунке слева изображен закрытый список (установка по умолчанию), а справа — открытый список. Если список содержит много элементов, в нем присутствует полоса прокрутки (scroll bar).
Например, список, определенный в следующем документе, содержит три элемента: |