Взаимодействие XML-Java-JavaScript

Цель занятия

Познакомиться с механизмом совместного использования XML, Java, JavaScript. Изучить технику вызова методов Java из скриптов JavaScript и передачу им параметров. Передать данные из XML-таблицы в апплет и отобразить их графически. Дополнительную информацию можно найти в [13].

Краткие теоретические сведения

На предыдущем занятии были рассмотрены вопросы, связанные с работой с документами XML средствами JavaScript и HTML. Теперь мы включим еще и механизмы Java, что позволит существенно расширить наши пользовательские возможности. Поставим такую задачу. Пусть в XML-базе данных хранятся сведения по котировке валют:

<?xml version="l.0"?>

<root>

<item>

<name> usa dol.</name>

<value>25</value>

</item>

<item>

<name> austr dol.</name>

<value>130</value>

</item>

<item>

<name> canadian dol.</name>

<va lue>2 4 0</ va lue>

</item>

<item>

<name> south africa dol.</name>

<value>80</value> </item>

<item>

<name> new zeland dol.</name>

<value>300</value>

</item>

<item>

<name> Filippines dol.</name>

<value>100</value>

</item>

</root>

Это правильно составленный документ XML, элементами которого ЯВЛЮЯТСЯ <root>, <item>, <name>, <value>.

Наберите этот текст в любом редакторе и сохраните его как простой текстовый файл с расширением .xml, например, с именем kotirovka.xml. Теперь просмотрите этот файл браузером Internet Explorer.

Создайте следующий html-файл (листинг 2.15).

Листинг 2.15. Документ kotirovka.html

<html>

<head>

<H1> Example of interaction XML-JAVASCRIPT-JAVA</hl>

<script>

<! —

function graphic()

//first -load xml base

var odoc=new ActiveXObject("Microsoft.XMLDOM"); odoc.async=false; odoc.load("koti rovka.xml");

z=odoc.getElementsByTagName("name").length;

var valutaval =new String(""); // строка значений

// курсов

var valutaname=new String(""); // строка имен валют

//loading the arrays with values from database for(var i=0;i<z;i++)

{

valutaval+=odoc. getElementsByTagName ("value") . item (i) . text ;

// добавляем очередной курс valutaval=valutaval+"?"; // добавляем разделительный

// символ

valutaname+=odoc.getElementsByTagName("name").item(i).text;

// добавляем имя валюты

valutaname=valutaname+"?"; // добавляем разделительный

// символ

}

document.aplet.graph("SHOW",valutaval,valutaname);

// вызов метода graph() java-annneTa

// передаем ему параметры: строку "SHOW", строку valutaval // и строку valutename

}

—>

</script>

</head>

<body bgcolor=#aabbcc>

<Br/>

<applet code="labl.class" width=500 height=300 name="aplet">

// апплет, который вызываем из JavaScript </applet>

<br/>

<Button onClick="graphic()">Launching Java</Button>

</body>

</html>

Сохраним этот HTML-файл под именем kotirovkajava.html. В этом файле реализованы три момента.

Во-первых, чтение XML-базы в объектную переменную odoc в реализации функции JavaScript с именем graphic ():

<script>

<! —

function graphic()

{

//first -load xml base

var odoc=new ActiveXObject("Microsoft.XMLDOM"); odoc.async=false; odoc.load("kot i rovka.xml");

Последняя команда загружает собственно интересующий нас документ.

Во-вторых, далее в цикле формируются две длинные строки

valutaval И valutaname:

for(var i=0;i<z;i++)

{

valutaval+=odoc. getElementsByTagName ("value") . item (i) . text ; valutaval=valutaval+"?";

valutaname+=odoc. getElementsByTagName ("name") . item (i) . text ; valutaname=valutaname+"?";

}

Строка vaiutaname содержит названия валют, разделенных знаком "?". Строка vaiutavai содержит котировки валют (целые числа), разделенные знаком "?".

Теперь, в-третьих, когда эти строки подготовлены, наступает решающий момент — вызов функции Java из тела скрипта JavaScript. Вот этот вызов:

document.aplet.graph("SHOW",valutaval,valutaname);

Здесь вызывается метод по имени graph (). Указывается имя апплета — apiet, записанное в параметре name тега <appiet> документа HTML. Методу graph() передаются три параметра, два из которых — длинные строки, сформированные выше. Этот вызов передается HTML-объекту document.apiet. Данный объект объявлен в HTML-файле таким образом:

<applet            code="labl.class"      width=500 height=300

name="aplet"> </applet>

Теперь уже должно быть ясно, как вызывается Java-апплет: код апплета содержится в классе iaM.ciass.

Мы пока не привели код Java, но результат его выполнения представлен на рис. 2.10.

Рис. 2.10. Представление котировок валют

Заметим, что вполне понятно естественное желание передать в метод Java не длинные строки, а массивы, однако (увы!), это не делается просто.

Теперь приводим текст Java-апплета (листинг 2.16), который содержит почти в точности Java-nporpaMMy из листинга 2.5, рисующую график. Но там рисовали синусоиду, а здесь — просто набор ломаных линий.

Листинг 2.16. Приложение на основе апплета для рисования графика котировок валют

import java.applet.*; import java.applet.Applet; import java.awt.*; import java.awt.event.*;

public class labl extends Applet implements ActionListener

Button btnshow=new Button("SHOW"); // Кнопка для демонстрации

// графика курса валют Button btnhide=new Button("HIDE"); // Кнопка для очистки String msg="";

// В этот массив будут помещены курсы валют: public int [] bar={50, 4 0, 20, 80,100,10, 4 0, 20, 50, 30} ;

// В этот массив будут помещены названия валют: public String[]

names={"One","Two","Three","Four","Five","Six","Seven",

"Eight","Nine","Ten"}; public int pointnumber=10; // Число точек массива public void paint(Graphics g)

{

int x,у,xold,yold,step=50; g.setColor(Color.blue);

g.drawString("PointNumber="+pointnumber,50,60); g.setColor(Color.red);

if (msg.equals("show")) // Отображение графика курсов при

// msg="show"

{

xold=100; yold=bar[0]+150;

g.drawString(names[0],xold,yold); // Вывод названия первой

// валюты

int i=l;

while (i<pointnumber)

{

x=xold+step; y=bar[i]+150;

g.drawLine(xold,yold,x,y); // Рисование ломаных линий,

// связывающих курсы валют g.drawString(names[i],x,y); // Вывод названий других

// валют

xold=x;

yold=y;

i++;

public void graph(String msgl,String msgvalues, String msgnames)

// Этот метод вызываем из JavaScript; он должен быть объявлен // как public {

if(msgl.equals("SHOW"))

{

int j=0;

while((msgnames.length()>0)&&(msgvalues.length()>0))

{

int kl=msgnames.indexOf("?") ; int k2=msgvalues.indexOf("?");

String sl=msgnames.substring(0, kl-1);

String s2=msgvalues.substring(0,k2-l);

bar[j]=Integer.valueOf(s2).intValue(); names [j ] =sl; j++;

pointnumber=j;

if (msgnames.length()>(kl+1))

{

msgnames=msgnames.substring(kl+1);

}

else

{

break;

}

if (msgvalues.length()>(k2+l))

msgvalues=msgvalues.substring(k2+l);

}

else

{

break;

}

}

}

Graphics g=getGraphics(); if(msgl.equals("SHOW"))

{

msg="show"; repaint();

}

else

if(msgl.equals("show")) repaint(); else

if (msgl.equals("hide"))

{

g.setColor(getBackground());

g.fillRect(0,0,getSize().width,getSize().height)

}

showStatus(msgl);

}

public void init()

{

setLayout(null) ; add(btnshow); add(btnhide);

btnhide.setBounds(60,10,4 0,20); btnshow.setBounds(10,10,40, 20) ; btnshow.addActionListener(this) ;

btnhide.addActionListener(this) ; setBackground(Color.yellow);

public void actionPerformed(ActionEvent a_e)

{

if (a_e.getSource()==btnshow)

{

msg="show"; graph (msg,msg,msg) ;

}

else

if (a_e.getSource()==btnhide)

{

msg="hide"; graph (msg,msg,msg) ;

}

}

}

Находим здесь метод show(). Он должен быть объявлен как public. Мы видим, что его смысл — распаковать длинные строки и сформировать из них массивы: один для названий валют, второй — для их котировок. В качестве разделителей между словами в длинных строках использовался символ "?". Построенные массивы прорисовывает метод paint ().

Следует обратить внимание на то, как объявлены и используются массивы.

public int [] bar={50, 4 0, 20, 80,100,10, 4 0, 20, 50, 30} ;

public String[] names=

{"One","Two","Three","Four","Five","Six","Seven","Eight", "Nine","Ten"};

В обоих приведенных случаях с левой стороны стоит объявление массива, а с правой после знака "=" — выражение для инициализации перечислением элементов массива в фигурных скобках.

Ссылка на элемент массива в тексте программы выполняется так:

bar[j]=Integer.valueOf(s2).intValue(); names [j ] =sl;

Видим по объявлению, что массив bar есть набор целых чисел. Команда:

bar[j]=Integer.valueOf(s2).intValue();

использует метод vaiueOf() класса integer. Здесь s2 — строка, содержащая целое число. Приведенная выше команда преобразует значение s2 в целое число. Поскольку преобразование строки в число — довольно часто возникающая задача, то следует запомнить эту команду, основанную на использовании класса integer. В этой работе также используем команды сравнения строк, выделения подстроки, получения позиции вхождения подстроки в строку:

if(msgl.equals("SHOW"))

{

int j=0;

while((msgnames.length()>0)&&(msgvalues.length()>0))

{

int kl=msgnames.indexOf("?"); int k2=msgvalues.indexOf("?") ;

Сравнение строк выполняет оператор: msgi. equals ("SHOW"). Этот оператор возвращает значение true, если cTpoKamsgi совпадает со строкой "sHOw", и false — в противном случае. Оператор int kl=msgnames . indexOf ( "?" ) присваивает переменной kl значение первой позиции (по порядку с начала строки), в которой встретился символ "?". Оба рассмотренных оператора являются методами класса string, поэтому, если s — объектная переменная класса string, то можно выполнять присваивания ТИПа boolean z = s. equals ("Интересно") ИЛИ int i = s.indexOf("тересно").

Таким образом, поставленная цель достигнута. Теперь следует выполнить индивидуальное задание, помещенное далее.

Источник: Герман О. B., Герман Ю. О., Программирование на Java и C# для студента. — СПб.: БХВ-Петербург, 2005. — 512 c.: ил.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100