![]()
Главная Обратная связь Дисциплины:
Архитектура (936) ![]()
|
Использование сценариев для DSO
В завершении главы познакомимся с примером более сложного сценария, который использует DSO для работы с соответствующим набором записей XML-документа. В примере использованы методы и свойства объекта DSO recordset для поиска книг в документе из листинга 1.1. Приемы, используемые для поиска и отображения данных XML, подходят только для XML-документа, организованного как простой набор записей. В Листинге 1.26 представлена HTML-страница, содержащая пример сценария.
<HTML> <HEAD> <TITLE>Поиск книги</TITLE> </HEAD> <BODY> <XML ID="dsoInventory" SRC="lnventory.xml"></XML> <H2>Поиск книги</H2> Текст заголовка: <INPUT TYPE="TEXT" ID="SearchText">  <BUTTON ONCLICK="FindBooks()">Поиск</BUTTON> <HR> Results:<P> <DIV ID=ResultDiv></DIV> <SCRIPT LANGUAGE="JavaScript"> function FindBooks () { SearchString = SearchText.value.toUpperCase(); if (SearchString =="") { ResultDiv.innerHTML = "<You must enter text into" + "'Title text' box.>"; return; } dsoInventory.recordset.moveFirst(); ResultHTML = ""; while (!dsoInventory.recordset.EOF) { TitleString = dsoInventory.recordset("TITLE").value; if(TitleString.toUpperCase().indexOf(SearchString)>=0) ResultHTML+="<I>" + dsoInventory.recordset(TITLE") + "</I>, " + "<B>" + dsoInventory.recordset("AUTHOR") + "</B>," + dsoInventory.recordset("BINDING") + "," + dsoInventory.recordset("PAGES") + "pages," + dsoInventory.recordset("PRICE") + "<P>"; dsoInventory.recordset.moveNext(); } if (ResultHTML == "") ResultDiv.innerHTML = "<Книга не найдена>"; else ResultDiv.innerHTML = ResultHTML; } </SCRIPT> </BODY> </HTML> Листинг 1.26
HTML-страница отображает элемент INPUT типа TEXT, который разрешает пользователю ввести одну строку искомого текста:
<INPUT TYPE="TEXT" ID="SearchText">
Страница также отображает элемент BUTTON (кнопка) с надписью “Поиск”:
<BUTTON ONCLICK='FindBooks()'>Поиск</BUTTON> Когда пользователь щелкает мышью на кнопке, вызывается функция сценария FindBooks, которая извлекает искомый текст из элемента INPUT и просматривает названия из всех записей BOOK в XML-документе в поисках текста, после чего отображает найденные записи BOOK, содержащие этот текст, как показано на следующем рисунке. Рисунок 45. Отображение результата поиска книги
Функция FindBooks сценария содержится в элементе SCRIPT и написана на языке JSCRIPT:
<SCRIPT LANGUAGE="JavaScript"> function FindBooks () { SearchString = SearchText.value.toUpperCase(); if (SearchString =="") { ResultDiv.innerHTML = "<Вы должны ввести текст в" + "поле 'Текст заголовка'.>"; return; } dsoInventory.recordset.moveFirst(); ResultHTML = ""; while (!dsoInventory.recordset.EOF) { TitleString = dsoInventory.recordset("TITLE").value; if(TitleString.toUpperCase().indexOf(SearchString)>=0) ResultHTML+="<I>" + dsoInventory.recordset(TITLE") + "</I>, " + "<B>" + dsoInventory.recordset("AUTHOR") + "</B>, " + dsoInventory.recordset("BINDING") + ", " + dsoInventory.recordset("PAGES") + " страниц, " + dsoInventory.recordset("PRICE") + "<P>"; dsoInventory.recordset.moveNext(); } if (ResultHTML == "") ResultDiv.innerHTML = "<Книга не найдена>"; else ResultDiv.innerHTML = ResultHTML; } </SCRIPT>
Сначала функция FindBooks получает текст, введенный через элемент INPUT (он имеет атрибут ID SearchText), а затем использует метод toUpperCase JScript для преобразования символов текста в прописные буквы. (Функция FindBooks преобразует текст в прописные, чтобы поиск осуществлялся без учета регистра.)
SearchString = SearchText.value.toUpperCase();
Если пользователь не ввел текст в поле INPUT, функция отображает сообщение и завершает свою работу: if (SearchString =="") { ResultDiv.innerHTML = "<Вы должны ввести текст в" + "поле 'Текст заголовка'.>"; return; } ResultDiv есть идентификатор ID элемента DIV в нижней части страницы, который отображает результаты поиска. Присвоение текста (который может включать HTML-разметку) свойству innerHTML элемента DIV приводит к отображению этого текста (с учетом всей содержащейся в нем HTML-разметки). Далее функция делает текущей первую запись XML, используя метод recordset.moveFirst, который был описан ранее:
dsoInventory.recordset.moveFirst();
Затем она очищает строковую переменную, используемую для хранения HTML-разметки найденных результатов (ResultHTML):
ResultHTML="";
После этого функция FindBooks выполняет цикл просмотра всех записей в XML-документе. Для анализа момента завершения цикла при достижении конца файла используется свойство recordset.EOF, а для перехода к новой записи используется метод recordset.moveNext:
while (!dsoInventory.recordset.EOF) { TitleString = dsoInventory.recordset("TITLE").value; if(TitleString.toUpperCase().indexOf(SearchString)>=0) ResultHTML+="<I>" + dsoInventory.recordset(TITLE") + "</I>, " + "<B>" + dsoInventory.recordset("AUTHOR") + "</B>, " + dsoInventory.recordset("BINDING") + ", " + dsoInventory.recordset("PAGES") + " страниц, " + dsoInventory.recordset("PRICE") + "<P>"; dsoInventory.recordset.moveNext(); } В начале цикла функция получает значение поля TITLE для текущей записи:
TitleString = dsoInventory.recordset("TITLE").value;
Выражение справа от знака равенства представляет собой краткую нотацию вызова свойства fields объекта recordset. Полная нотация выглядит следующим образом:
TitleString = dsoInventory.recordset.fields("TITLE").value;
Свойство fields содержит множество всех полей, принадлежащих текущей записи. Чтобы получить доступ к определенному полю, следует поместить в скобках имя этого поля, и будет получено его содержимое как строка, через свойство value, добавленное в конце выражения. Далее в цикле используется метод indexOf JScript для анализа, содержит ли название в текущей записи искомый текст. Если искомый текст обнаружен, код внутри оператора if добавляет к строке ResultHTML текст и HTML-разметку, требуемую для отображения текущей записи: if(TitleString.toUpperCase().indexOf(SearchString)>=0) ResultHTML+="<I>" + dsoInventory.recordset(TITLE") + "</I>, " + "<B>" + dsoInventory.recordset("AUTHOR") + "</B>, " + dsoInventory.recordset("BINDING") + ", " + dsoInventory.recordset("PAGES") + " страниц, " + dsoInventory.recordset("PRICE") + "<P>"; По выходу из цикла функция назначает HTML-разметку, содержащую результаты, свойству innerHTML элемента DIV в разделе BODY документа, который используется для отображения этих результатов (данный элемент DIV имеет идентификатор ResultDiv): if (ResultHTML == "") ResultDiv.innerHTML = "<Книга не найдена>"; else ResultDiv.innerHTML = ResultHTML; Элемент DIV воспринимает HTML-разметку и сразу же отображает результаты.
![]() |