ЛАБОРАТОРНАЯ РАБОТА 2 XSL

advertisement
ЛАБОРАТОРНАЯ РАБОТА 2
XSL-ТРАНСФОРМАЦИЯ XML-ДАННЫХ
В WEB-ПРИЛОЖЕНИЯХ
1. Цель работы
Целью работы является изучение технологий XSL-трансформации XML-данных, полученных из базы данных, в HTML-страницы Web-приложений.
2. Задачи
Задачами лабораторной работы являются овладение навыками извлечения информации из
базы данных в XML-формате, построения XSL-таблиц стилей трансформации, программной
реализации XSL-трансформации на основе классов серверных сценариев Web-приложений.
3. Теоретическая часть
Данные в формате XML. Технология XML – простой, стандартный способ взаимообмена
структурированными текстовыми данными между компьютерными программами. Рост ее популярности связан отчасти с тем, что для прочтения XML-документов или для их создания достаточно простого текстового редактора, но это никак не умаляет основного назначения XML
– служить средством связи между программными системами. В этом плане XML характеризуется следующими преимуществами:
– отделение данных от их представления. Это возможность отделять информацию от деталей способа ее отображения на конкретном устройстве.
– передача данных между приложениями. Возможность передавать информацию между
платформами и программами, не тратя при этом средства на интеграцию специально заказываемого программного обеспечения.
– независимость от платформы. Возможность однозначно интерпретировать XML-данные
на разных программных и аппаратных платформах.
XSL-трансформация. XML-данные, получаемые в итоге людьми или приложением, очень
редко будут использоваться прямо в том виде, в каком они поступают: они сначала должны
быть преобразованы в нечто другое.
Если данные предназначены для человека, то это «нечто» может быть документом, который можно отобразить или напечатать: например, HTML-файлом, PDF-файлом или даже звуковым файлом. Конвертирование данных XML в HTML для отображения – вероятно, наиболее
частое применение XSLT сегодня. Получив данные в формате HTML их легко отобразить с
помощью любого браузера.
Для передачи данных между разными приложениями необходимо преобразовать их из модели, используемой одним приложением, в модель, используемую другим. Для преобразования XML-данных чаще всего используется технология XSLT (eXtensible Stylesheet Language
for Transformations, расширяемый язык стилей для преобразований).
XSLT представляет собой мощную прикладную XML-технологию, которая может применяться везде, где есть два документа разной структуры. XSLT предоставляет высокоуровневые
средства для манипуляции данными, которые хранятся в виде XML. Хотя XSLT не позиционируется как язык запросов для XML, можно смело сравнить его с языком SQL, в котором
определяются запросы к реляционным базам данных.
XSLT-обработка включает обычно две стадии:
– первая стадия – структурное преобразование, при котором структура данных исходного
XML-документа конвертируется в структуру, отражающую желаемый вывод;
– вторая стадия – форматирование, при котором новая структура выводится в желаемом
формате, например, HTML или PDF.
XSL-таблицы стилей. Название «таблица стилей» присвоено документу, который определяет преобразование. Название отражает сущность процесса, который происходит при самом
1
общем типе преобразования, выполняемого с помощью XSLT, а именно: определить стиль
отображения информации в исходном документе, причем так, чтобы конечный документ содержал информацию исходного документа, дополненную информацией, которая управляет
способом его отображения на некотором устройстве вывода.
Исходный документ и таблица стилей являются XML-документами. XSLT выполняет процесс преобразования, потому что вывод (конечный документ) и ввод (исходный документ)
представляют собой объекты одного типа. Это дает прямые выгоды, например, сложное преобразование можно выполнить как ряд простых преобразований, кроме того, используя одну и
ту же технологию, можно делать преобразования в любом направлении.
Структура таблицы стилей. Таблица стилей представляет собой корректный XMLдокумент, дерево XML-элементов. Корнем XSL-дерева является элемент stylesheet, также принадлежащий пространству имен XSLT.
В таблице стилей должен быть представлен хотя бы один шаблон (элемент template). В простейшем случае – это шаблон обработки корневого элемента, который «сработает» всегда,
независимо от структуры исходных XML-данных.
Каждый шаблон содержит инструкции преобразования (XSL-инструкции) и разметку, которая должна быть без изменения скопирована в результирующий документ (конечные литеральные элементы).
В лабораторной работе используются два вида XSL-инструкций:
– xsl:value-of. Это XSL-инструкция, позволяющая получить значение элемента или атрибута
исходного XML-документа. Элемент xsl:value-of содержит атрибут select, значение которого –
это XPath-адрес элемента или атрибута, значение которого нужно получить.
– xsl:for-each. Это XSL-инструкция, формирующая цикл по множеству элементов исходного
XML-документа. В качестве значения атрибута select элемента xsl:for-each указывается XPathадрес множества XML-элементов исходного XML-документа.
В качестве конечных литеральных элементов чаще всего используется HTML-разметка, на
основе которой формируется полученный в результате трансформации документ, отображаемый в окне браузера пользователя.
Базы данных и XML. На практике часто возникает задача извлечения информации из базы данных в формате XML. Проще всего эта задача решается в СУБД корпорации Microsoft
(например, SQL Server). Здесь для получения данных в формате XML традиционный TransactSQL запрос SELECT дополняется опцией FOR XML. В других СУБД такие запросы обычно не
поддерживаются. Для получения XML-данных используются либо дополнительные библиотеки, либо формирование DOM-объектов «вручную». Так или иначе получение XML-данных
выполняется на уровне сценариев.
Запросы SELECT…FOR XML. В Microsoft SQL Server для получения данных в формате
XML используется инструкция SELECT…FOR XML. С помощью этой инструкции возвращаемый
набор данных можно было отформатировать в XML в трех различных режимах – RAW, AUTO и
EXPLICIT.
Самый простой режим выборки данных в XML-формате – использование опции RAW. Для
каждой строки результата создается элемент с именем row по умолчанию. Этот элемент можно переименовать, к результату выборки можно добавить корневой элемент и т. д.
В качестве примера рассмотрим использование инструкции SELECT…FOR XML RAW для получения информации о факультетах из таблицы «Факультет»:
SELECT ID, name
FROM Faculty
FOR XML RAW
Результат выборки представляет собой следующие XML-элементы:
<row ID="ФИРТ" name="информатики и робототехники"/>
<row ID="ФАД" name="авиационных двигателей"/>
Добавим корневой элемент Факультеты и переименуем каждый элемент row в элемент Факультет:
2
SELECT ID, name
FROM Faculty
FOR XML RAW('Факультет'), root('Факультет')
Результат выборки будет иметь следующий вид:
<Факультеты>
<Факультет ID="ФИРТ" name="информатики и робототехники"/>
<Факультет ID="ФАД" name="авиационных двигателей"/>
</Факультеты>
Режим FOR XML AUTO позволяет формировать простейший XML-фрагмент с вложенными
элементами. Имена элементов и уровень вложенности генерируется на основе названия строк
и столбцов таблиц и их связей в базах данных.
Для задания корневого элемента результата (независимо от используемой опции SELECT…FOR XML) используется конструкция ROOT, в качестве параметра передается имя корневого элемента.
В качестве примера рассмотрим предыдущий запрос на выборку данных о факультетах, но
воспользуемся режимом FOR XML AUTO:
SELECT ID, name
FROM Faculty
FOR XML AUTO
Результат запроса будет иметь следующий вид:
<Faculty ID="ФИРТ" name="информатики и робототехники"/>
<Faculty ID="ФАД" name="авиационных двигателей"/>
Усложним запрос, добавив в него данные о специальностях в составе факультетов:
SELECT Faculty.ID, Faculty.name, Speciality.ID, Speciality.name
FROM Faculty, Speciality
WHERE Faculty.ID = Speciality.faculty
FOR XML AUTO
В результате выполнения запроса получим следующий результат:
<Faculty ID="ФИРТ" name="информатики и робототехники">
<Speciality ID="АСОИ" name="авт.сист.обр.инф. и упр."/>
<Speciality ID="ПИЭ" name="прикл. инф. в эк. "/>
</Faculty>
<Faculty ID="ФАД" name="авиационных двигателей">
<Speciality ID="АД " name="авиац. двиг. и энерг. уст."/>
<Speciality ID="ЭАТ" name="экспл. авиац. техн."/>
</Faculty>
Для формирования простых вложенных выборок в режиме FOR XML используется опция
TYPE. Например, тот же результат, что и в предыдущем примере можно получить с помощью
следующего запроса:
select
(select
rtrim(Speciality.ID) as ID, rtrim(Speciality.name) as name from Speciality
where Faculty.ID=Speciality.faculty for xml auto, type), rtrim(Faculty.ID) as ID,
rtrim(Faculty.name) as name from Faculty for xml auto, type, root('University')
Запрос SELECT содержит вложенный запрос на извлечение данных о специальностях для
каждого отдельного результата по запросу о факультетах. И сам запрос, и подзапрос в нем
возвращают XML-данные. При этом результат вложенного запроса (специальности) становится вложенным элементом результата основного запроса (факультеты).
В некоторых ситуациях возможностей форматов FOR XML RAW и FOR XML AUTO недостаточно. Обычно такие ситуации возникают тогда, когда необходимо создать документ XML в
3
заранее определенном формате. В этом случае можно использовать формат FOR XML EXPLICIT,
который обладает наибольшей гибкостью при формировании XML-результата.
Например, чтобы получить такой результат
<Факультет ID = 'ФИРТ'>
<Название>информатики и робототехники</Название>
<Специальность ID = 'АСОИ'>автом. сист. обр. инф. и упр.</Специальность>
<Специальность ID = 'ПИЭ'>прикл. инф. в эк.</Специальность>
</Факультет>
можно использовать следующий EXPLICIT-запрос:
SELECT 1 as Tag,
NULL as Parent,
Faculty.ID as [Факультьет!1!ID],
NULL
as [Специальность!2!ID],
NULL
as [Специальность!2!Назв]
FROM Faculty
UNION ALL
SELECT 2 as Tag,
1 as Parent,
Faculty.ID,
Speciality.ID,
Speciality.name
FROM Faculty, Speciality
WHERE Faculty.ID = Speciality.faculty
ORDER BY [Факультет!1!ID],[Специальность!2!Название]
FOR XML EXPLICIT
Подробное рассмотрение запросов SELECT…FOR XML выходит за пределы рассмотрения в
данной лабораторной работе.
DOM-объекты. Технология XML DOM предоставляет простой и эффективный способ для
работы с XML-данными. В основе DOM лежит одноименная спецификация консорциума W3C
(Word Wide Web Consortium), в которой определены основные классы DOM-объектов, их
свойства и методы. Наличие таких единых правил позволяет использовать XML DOM любым
языком программирования и любой операционной системой.
DOM представляет собой дерево, отображающее структуру XML-документа (рис. 1). Программист может выполнять любые манипуляции с таким деревом – реализовывать навигацию
по его структуре, добавлять, модифицировать или удалять определенные элементы. Все изменения, выполняемые в DOM-дереве, отражаются в XML-документе.
documentElement
Node
Node
Node
...
...
Element
Attribute
Attribute
Text
Comment
...
...
Attribute
Text
...
Рисунок 1 – Структура дерева DOM-объектов
4
Корневым элементом DOM-дерева является элемент documentElement. Он содержит один
или несколько дочерних элементов (узлов), представляющих ветви дерева. Выделяют следующие виды DOM-узлов: элементы (element), атрибуты (attribute), текстовые узлы (text), комментарии (comment), инструкции по обработке (processing instruction).
XSL-трансформация в клиентских и серверных сценариях. На уровне сценариев (независимо от того, клиентские они или серверные) Web-приложений XSL-трансформация представляет собой применение XSL-таблиц стилей к экземплярам объектов XML DOM (рис. 2).
Использование DOM-объектов обусловлено тем, что XSL-преобразование ориентировано на
трансформацию данных в XML-формате.
XML-данные
HTML-страница
XML
DOM-объект
XML
XSL-файл
XSL-таблица
стилей
Файл
Рисунок 2 – Схема применения XSL-трансформации в Web-сценариях
Использование DOM позволит выполнять ее независимо от того, как эти данные были получены – из файла, в виде потока данных, в результате запроса к базе данных и пр. Результат
преобразования можно также представить разными способами – вывести на экран клиентского
браузера (при трансформации XML → HTML), использовать для дальнейшей обработки (если
используется трансформация вида XML → XML) или сохранить в файл.
XSL-трансформация в ASP.NET-сценариях. Для выполнения XSL-трансформации в
сценариях ASP.NET используются два основных класса. Класс XmlDocument предоставляет
программную реализацию DOM-объектов. В коде сценария экземпляр класса XmlDocument создается с помощью соответствующего конструктора:
XmlDocument dom = new XmlDocument();
Для того чтобы загрузить в экземпляр DOM-объекта XML-данные используются методы
Load (при заполнении объекта данными из потока) и LoadXML (когда источником XML-данных
является физический файл):
dom.Load(название потока данных);
dom.LoadXML(имя XML-файла);
Второй базовый класс трансформации в ASP.NET – XslTransform. Для задания его экземпляра также используется одноименный конструктор:
XslTransform xsl = new XslTransform();
Загрузка XSL-стилей в экземпляр класса XslTransform выполняется, как правило, из XSLфайла, физически размещенного на сервере. Для этого в ASP.NET используется метод Load, в
качестве параметра которому передается путь к соответствующему файлу:
xsl.Load(Путь к файлу);
Собственно трансформация выполняется с помощью метода Transform класса XslTransform.
В качестве параметров этому методу передаются DOM-объект, к которому применяется преобразование, дополнительные настройки трансформации и форма представления результата
преобразования:
xsl.Transform(dom, null, Response.Output);
5
XSL-трансформация в PHP-сценариях. В PHP-сценариях базовыми классами XSLтрансформации являются классы DOM-объектов и XSL-спецификаций.
Для создания нового DOM-объекта в PHP используется класс DomDocument. При вызове
конструктора этого класса ему можно передать два параметра – версию используемой XMLспецификации и кодировку XML-данных, например,
$xml = new DOMDocument('1.0');
Для создания нового элемента в дереве DOM используется метод createElement класса
DomDocument. В качестве параметра этой функции передается имя соответствующего элемента.
Так, к примеру, чтобы создать новый элемент с именем Root в экземпляре DOM-объекта с
именем xml можно использовать следующий код:
$root = $xml->createElement('Root');
Однако элемент недостаточно просто создать – нужно еще добавить его в дерево элементов DOM-объекта. Для этого в PHP (как, впрочем, и в других языках программирования сценариев) используется метод appendChild класса DomDocument:
$xml->appendChild($root);
Для дополнения созданного XML-элемента атрибутами используется метод setAttributes
класса Element. В качестве параметров этому методу передаются название и значение атрибута:
$elem->setAttribute($name,$value);
Для применения трансформации в PHP используется класс XSLTProcessor:
$xslt = new XSLTProcessor();
Для представления таблицы стилей используется DOM-объект (класс DomDocument), в который с помощью метода Load подгружается XSL-файл спецификации:
$xsl = new DomDocument;
$xsl->load(XSL-файл);
В класс XSLTProcessor таблица стилей передается из DOM-объекта с помощью функции importStylesheet:
$xslt->importStylesheet($xsl);
Для представления результатов трансформации используются либо метод transformToXML
(для представления XML или HTML-результата), либо transformToDoc (для сохранения результата трансформации в файл). Например, для отображения в окне браузера результата трансформации используется метод transformToXML, в качестве параметра которому передается
DOM-объект, к которому применяется преобразование:
echo $xslt->transformToXML($xml);
XSL-трансформация в JSP-сценариях. В JSP основной библиотекой для работы с XMLданными является библиотека javax.xml.parsers. В состав этого пакета входит несколько классов, два из которых в лабораторной работе используются:
– DocumentBuilder – это DOM-парсер, который создает объект класса org.w3c.dom.Document;
– DocumentBuilderFactory – класс, который создает DOM-парсеры.
Для того, чтобы создать DOM-объект, нужно воспользоваться классом Document, экземпляр
которого можно получить следующим образом:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.newDocument();
Создание XML-элемента можно выполнить так:
Element elem = doc.createElement("elem");
Для создания XML-атрибута можно использовать такую программную конструкцию:
elem.setAttribute("name", "value");
С помощью метода appendChild можно добавить узел в элемент, например, так:
6
elem.appendChild(elem2);
doc.appendChild(elem);
Для выполнения XSL-трансформации используется класс TransformerFactory. С его помощью создается экземпляр класса transformer, в который загружается XSL-таблица стилей:
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer(xsl);
Непосредственно преобразование выполняется с помощью метода transform с двумя параметрами – DOM-объект, к которому применяется преобразование, и объект или поток, куда
должен быть записан результат трансформации:
transformer.transform(new DOMSource(doc), result);
4. Порядок выполнения работы
Предварительные замечания
В рамках лабораторной работы должно быть разработано Web-приложение «Успеваемость
студентов», состоящее из двух Web-страниц (аналогичное тому, что было разработано в первой лабораторной работе). Каждая страница генерируется с помощью применения XSLтрансформации к XML-данным, полученным из базы данных «University».
Выполнение лабораторной работы должно быть осуществлено в два этапа:
– программирование XSL-таблиц стилей для генерации страниц Web-приложения;
– программирование серверных сценариев для получения XML-данных из базы данных и
применения к ним стилей XSL-трансформации.
4.1. Программирование XSL-таблиц стилей
1. Создание XSL-спецификации трансформации Default.xsl
1.1.Создать новый файл в текстовом редакторе «Блокнот»
1.2. Сохранить файл под именем Default.xsl
2. Открыть файл Default.xsl в текстовом редакторе (или в любом другом редакторе)
3. Создать инструкцию по обработке XML:
<?xml version="1.0" encoding="windows-1251" ?>
4. Создать корневой элемент stylesheet
4.1. Создать открывающий тег stylesheet
<xsl:stylesheet>
4.2. Задать используемую версию XSL-спецификации. Для этого в открывающем теге
xsl:stylesheet создать атрибут version со значением «1.0»:
version="1.0"
4.3. Задать пространство имен с URL «http://www.w3.org/1999/XSL/Transform» и префиксом xsl.
Для этого создать в открывающем теге xsl:stylesheet следующий атрибут:
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
4.4. Создать закрывающий тег элемента stylesheet:
</xsl:stylesheet>
5. Создать шаблон обработки корневого элемента.
5.1. Внутри элемента xsl:stylesheet (между его открывающим и закрывающим тегами) ввести
открывающий тег элемента template с префиксом xsl:
<xsl:template match="/">
5.2. Указать, что шаблон обрабатывает корень XML-дерева. Для этого ввести в открывающий тег элемента template атрибут match со значением «/»:
match="/"
7
5.3. Создать закрывающий тег элемента template:
</xsl:template>
6. Задать конечные литеральные элементы HTML-разметки XSL-спецификации. Для этого
скопировать все HTML-разметку страницы Default.aspx из лабораторной работы 1 (без подстановки значений из базы данных) между открывающим и закрывающим тегами элемента
xsl:template:
<HTML xmlns="http://www.w3.org/1999/xhtml" >
<HEAD>
<TITLE>Успеваемость студентов</TITLE>
<LINK href="images/style.css" rel="stylesheet" type="text/css"/>
</HEAD>
<BODY style="font-size: 12pt">
<form action="Browse.php" method="get" name="ff">
<TABLE class="pageborder" border="0" width="600">
<TR>
<TD width="100%">
<SPAN class="text1">Успеваемость</SPAN>
<BR/>
<SPAN class="text2">            студентов</SPAN>
<BR/>
<HR class="line"/><HR class="line" width="70%" align="left"/>
</TD>
</TR>
<TR>
<TD style="height: 17px; text-align: right;" width="100%">
<SPAN style="color: #ff0000; font-size:13pt; font-family: 'Century Schoolbook'">Выбор
 </SPAN>
<SPAN style="color: #669999; font-size:13pt; font-family: 'Century Schoolbook'"><A
href="javascript:document.ff.submit();" style="text-decoration: none">Просмотр</A></SPAN>
</TD>
</TR>
<TR>
<TD><BR/>
<TABLE align="center" width="550">
<TR height="50px" valign="top">
<TD style="width: 163px"><SPAN class="text3">Факультет</SPAN></TD>
<TD>
<select name="faculty" style="width: 350px">
<option value="0" selected="selected">Выбор факультета...</option>
</select>
</TD>
</TR>
<TR height="50px" valign="top">
<TD style="width: 163px"><SPAN class="text3">Специальность</SPAN></TD>
<TD>
<select name="spec" style="width: 350px">
<option value="0" selected="selected">Выбор специальности...</option>
</select>
</TD>
</TR>
<TR height="30px" valign="top">
<TD style="width: 163px"><SPAN class="text3">Группа</SPAN></TD>
8
<TD>
<select name="gr" style="width: 350px">
<option value="0" selected="selected">Выбор группы...</option>
</select>
</TD>
</TR>
</TABLE>
</TD>
</TR>
</TABLE>
</form>
</BODY>
</HTML>
7. Заполнить раскрывающийся список с идентификатором faculty результатом запроса
(п. 10.5). Список должен отображать названия факультетов (поле name), а в качестве выбранных значений, передаваемых серверу, использовать их идентификаторы (поле id). Для этого
после первого элемента раскрывающегося списка Faculty (строка <option value="0" selected="selected"> Выбор факультета... </option>) ввести код:
<xsl:for-each select="University/Faculty">
<option>
<xsl:attribute name="value">
<xsl:value-of select="@ID"/>
</xsl:attribute>
<xsl:value-of select="@name"/>
</option>
</xsl:for-each>
8. Аналогичным образом заполнить раскрывающиеся списки «Специальность» (spec) и
«Группа» (gr в формате «специальность-номер группы», например, ПИЭ-7).
9. Создание XSL-спецификации трансформации Browse.xsl
9.1.Создать новый файл в текстовом редакторе «Блокнот»
9.2. Сохранить файл под именем Browse.xsl
10. Открыть файл Browse.xsl в текстовом редакторе (или в любом другом редакторе)
11. Создать XML-инструкцию по обработке, корневой элемент xsl:stylesheet с указанием
используемых версии XSL-спецификации и пространства имен, шаблон обработки корневого
элемента (см. пп. 3–5).
12. Задать конечные литеральные элементы HTML-разметки XSL-спецификации. Для этого скопировать все HTML-разметку страницы Browse.aspx из лабораторной работы 1 (без подстановки значений из базы данных) между открывающим и закрывающим тегами элемента
xsl:template:
<HTML xmlns="http://www.w3.org/1999/xhtml" >
<HEAD>
<TITLE>Успеваемость студентов</TITLE>
<LINK href="images/style.css" rel="stylesheet" type="text/css"/>
</HEAD>
<BODY style="font-size: 12pt">
<TABLE class="pageborder" border="0" width="600">
<TR>
<TD width="100%">
<SPAN class="text1">Успеваемость</SPAN>
<BR/>
<SPAN class="text2">            студентов</SPAN>
<BR/>
9
<HR class="line"/><HR class="line" width="70%" align="left"/>
</TD>
</TR>
<TR>
<TD style="height: 17px; text-align: right;" width="100%">
<SPAN style="color: #669999; font-size:13pt; font-family: 'Century Schoolbook'">
<A href="Index.htm" style="text-decoration: none">Выбор</A>  </SPAN>
<SPAN style="color: #ff0000; font-size:13pt; font-family: 'Century Schoolbook'">Просмотр</SPAN>
</TD>
</TR>
<TR>
<TD><BR/>
<TABLE width="500" align="center" class="headborder">
<TR>
<TD width="30%"><SPAN class="headtext">Студент</SPAN></TD>
<TD width="30%" align="center"><SPAN class="headtext">Дисциплина</SPAN></TD>
<TD width="20%" align="center"><SPAN class="headtext">Дата</SPAN></TD>
<TD width="20%" align="center"><SPAN class="headtext">Оценка</SPAN></TD>
</TR>
</TABLE>
<TABLE width="500" align="center" class="textborder">
<TR>
<TD width="30%"><SPAN class="tabletext"></SPAN></TD>
<TD width="30%" align="center"><SPAN class="tabletext"></SPAN></TD>
<TD width="20%" align="center"><SPAN class="tabletext"></SPAN></TD>
<TD width="20%" align="center"><SPAN class="tabletext"></SPAN></TD>
</TR>
</TABLE>
</TD>
</TR>
</TABLE>
</BODY>
</HTML>
13. Вывести в цикле сведения об успеваемости студентов заданной студенческой группы.
Для этого в элементе TABLE (последний из приведенных в коде) код, описывающий строку
(элемент TR и все его содержимое) поместить между открывающим и закрывающим тегами
элемента xsl:for-each:
<xsl:for-each select="Uspev/Groups/Student/Uspev">
</xsl:for-each>
14. На каждой итерации цикла вывести значения ФИО студента, названия дисциплины, полученной оценки и даты сдачи. Для этого ввести инструкции VALUE-OF в соответствующих
столбцах TD строки TR. Например, для вывода ФИО студента следует изменить строку, описывающую первый столбец таблицы, следующим образом:
<TD width="30%"><SPAN class="tabletext"><xsl:value-of select="../@fio"/></SPAN></TD>
Чтобы вывести название предмета, строку, описывающую второй столбец таблицы, следует изменить следующим образом:
<TD width="30%" align="center"><SPAN class="tabletext"><xsl:value-of select="@subject"/></SPAN></TD>
10
4.2. Программирование серверных сценариев
Вариант А. Технология ASP.NET и СУБД Microsoft SQL Server
1. Создать новый Web-сайт:
Пуск | Microsoft Visual Studio 2005 | Microsoft Visual Studio 2005
ф. Microsoft Visual Studio | File → New → Web Site… → ф. New Web Site → Visual Studio Installed Templates → выбр. ASP.NET Web Site →
Location → выбр. HTTP → http://имя_сервера(например, localhost)/Lab1_ASP
Language → выбр. Visual C#
2. Открыть для редактирования файл Default.aspx.cs:
ф. Solution Explorer | Default.aspx | Default.aspx.cs → пр. кн. мыши → выбр. Open
3. Подключить библиотеки для работы с базами данных (System.Data, System.Data.SqlTypes,
System.Data.SqlClient), элементами управления (System.Web.UI, System.Web.UI.WebControls, System.Web.UI.WebControls.WebParts, System.Web.UI.HtmlControls) и XML-данными (System.Xml, System.Xml.Xsl, System.Data.SqlClient). Для этого после строки программного кода
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default"%>
Добавить следующие строки:
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Xml;
using System.Xml.Xsl;
4. Установить соединение с базой данных University.
4.1. Создать текстовую переменную constring, задающую параметры соединения с базой
данных. Для этого между открывающей и закрывающей фигурными скобками функции
Page_Load ввести следующий код:
string constring = "Data Source=GULYA;Initial Catalog=University;Integrated Security=True";
4.2. Создать экземпляр класса SqlConncection (соединение с базой данных), присвоить
ему имя cn и передать параметры подключения из переменной constring:
SqlConnection cn = new SqlConnection(constring);
4.3. Создать экземпляр объекта SqlCommand под именем cmd в рамках экземпляра класса
соединения cn:
SqlCommand cmd = cn.CreateCommand();
5. Разработать запрос на извлечение данных в XML-формате
5.1. Создать текстовую переменную sql, содержащую запрос на извлечение данных в формате XML:
string sql = "select (select (select rtrim(Groups.ID) as ID, rtrim(Groups.spec)+'-'+rtrim(Groups.number) as
num from Groups where Speciality.ID=Groups.spec for xml auto, type), rtrim(Speciality.ID) as ID,
rtrim(Speciality.name) as name from Speciality where Faculty.ID=Speciality.faculty for xml auto, type),
rtrim(Faculty.ID) as ID, rtrim(Faculty.name) as name from Faculty for xml auto, type, root('University')";
11
5.2. Проверить работоспособность запроса. Для этого запустить среду Microsoft SQL Server
Management Studio, выбрать базу данных University. Далее создать новый запрос, скопировать в
него содержимое переменной sql и запустить запрос на выполнение. Результат должен иметь
следующий вид:
<University>
<Faculty ID="ФАД" name="авиационных двигателей">
<Speciality ID="АД" name="авиац. двиг. и энерг. уст.">
<Groups ID="1" num="АД-1" />
<Groups ID="2" num="АД-2" />
</Speciality>
<Speciality ID="ЭАТ" name="экспл. авиац. техн.">
<Groups ID="3" num="ЭАТ-3" />
<Groups ID="4" num="ЭАТ-4" />
</Speciality>
</Faculty>
<Faculty ID="ФИРТ" name="информатики и робототехники">
<Speciality ID="АСОИ" name="авт.сист.обр.инф. и упр.">
<Groups ID="5" num="АСОИ-5" />
<Groups ID="6" num="АСОИ-6" />
</Speciality>
<Speciality ID="ПИЭ" name="прикл. инф. в эк.">
<Groups ID="7" num="ПИЭ-7" />
<Groups ID="8" num="ПИЭ-8" />
</Speciality>
</Faculty>
</University>
6. В коде ASP.NET выполнить запрос на извлечение XML-данных. Для этого ввести следующий код:
cmd.CommandText = sql;
cmd.CommandType = CommandType.Text;
cmd.Connection.Open();
7. Записать результат XML-запроса в DOM-объект
7.1. Создать экземпляр класса XmlReader и присвоить ему имя r. Заполнить объект XmlReader
данными из результата запроса – экземпляра объекта SqlCommand (cmd):
System.Xml.XmlReader r = cmd.ExecuteXmlReader();
7.2. Создать новый DOM-объект и присвоить ему имя xd:
XmlDocument xd = new XmlDocument();
7.3. Заполнить DOM-объект xd данными из объекта XmlReader (переменная r):
xd.Load(r);
8. Создать экземпляр объекта XslTransform для выполнения XSL-преобразования и присвоить ему имя docXsl:
XslTransform docXsl = new XslTransform();
9. Загрузить в объект XslTransform (переменную docXsl) таблицу стилей из файла Default.xsl.
docXsl.Load(Server.MapPath("Default.xsl"));
10. Выполнить преобразование и отобразить его результат на экране:
docXsl.Transform(xd, null, Response.Output);
11. Создать новую страницу Web-сайта:
Lab1_ASP - Microsoft Visual Studio |
ф. Solution Explorer | кл. пр. кн. мыши на названии проекта → Add New Item…
12
ф. Add New Item | → Visual Studio Installed Templates → выбр. Web Form →
Name → ввести «Browse.aspx»
Language → выбр. Visual C#
12. Открыть для редактирования файл Default.aspx.cs:
ф. Solution Explorer | Default.aspx | Default.aspx.cs → пр. кн. мыши → выбр. Open
11. Подключить дополнительные библиотеки (см. п. 3).
12. Установить соединение с базой данных University (см. п. 4).
13. Разработать запрос на извлечение данных об успеваемости в XML-формате и проверить
его работоспособность (см. п. 5). В качестве текста запроса использовать:
select (select (select rtrim(Uspev.ID) as ID, rtrim(Uspev.subject) as subject, rtrim(Uspev.ocenka) as ocenka,
CONVERT(CHAR(25),data,104) as data from Uspev where Student.zk=Uspev.student for xml auto, type),
rtrim(Student.zk) as zk, rtrim(Student.fio) as fio, rtrim(Student.gr) as gr from Student where
Groups.ID=Student.gr for xml auto, type), rtrim(Groups.ID) as ID, rtrim(Groups.number) as number,
rtrim(Groups.spec) as spec from Groups for xml auto, type, root('Uspev')
Результат выполнения запроса должен иметь следующий вид:
<Uspev>
<Groups ID="1" number="1" spec="АД" />
<Groups ID="2" number="2" spec="АД" />
<Groups ID="3" number="3" spec="ЭАТ" />
<Groups ID="4" number="4" spec="ЭАТ" />
<Groups ID="5" number="5" spec="АСОИ" />
<Groups ID="6" number="6" spec="АСОИ" />
<Groups ID="7" number="7" spec="ПИЭ">
<Student zk="111111" fio="Иванов И.И." gr="7">
<Uspev ID="1" subject="Математика" ocenka="5" data="06.12.2009" />
<Uspev ID="14" subject="Физика" ocenka="3" data="08.12.2009" />
<Uspev ID="17" subject="Химия" ocenka="5" data="10.12.2009" />
</Student>
<Student zk="222222" fio="Петров П.П." gr="7">
<Uspev ID="2" subject="Математика" ocenka="4" data="06.12.2009" />
<Uspev ID="15" subject="Физика" ocenka="4" data="08.12.2009" />
<Uspev ID="18" subject="Химия" ocenka="4" data="10.12.2009" />
</Student>
<Student zk="333333" fio="Сидоров С.С." gr="7">
<Uspev ID="3" subject="Математика" ocenka="3" data="06.12.2009" />
<Uspev ID="16" subject="Физика" ocenka="5" data="08.12.2009" />
<Uspev ID="19" subject="Химия" ocenka="3" data="10.12.2009" />
</Student>
</Groups>
<Groups ID="8" number="8" spec="ПИЭ" />
</Uspev>
14. Выполнить запрос (см. п. 6), записать его XML-результат в DOM-объект (см. п. 7) и
применить к ему XSL-преобразование из файла Browse.xsl (см. п. 8–10).
15. Проверить работоспособность созданного Web-приложения. Для этого перейти на
страницу Lab1_ASP - Microsoft Visual Studio | Default.aspx и нажать сочетание клавиш [Ctrl+F5].
Вариант Б. Технология PHP и СУБД MySQL
1. Создать директорию, в которой будут размещены файлы Web-приложения, и назвать ее
Lab1_PHP. Разместить созданную папку по адресу C:/Program Files/EasyPHP/WWW.
2. В текстовом редакторе (например, в «Блокноте») создать новый файл и сохранить его
под именем Index.php.
13
3. Открыть файл Index.php в текстовом редакторе (например, в «Блокноте»).
4. Создать сценарий PHP. Для этого ввести следующий код:
<?php
?>
5. Установить кодировку UTF-8 представления результирующих страниц. Для этого между
открывающей (<?php) и закрывающей (?>) угловыми скобками ввести следующий код1:
$def_charset = "Content-Type: text/html; charset=utf-8";
header($def_charset);
6. Установить соединение с базой данных MySQL. Для этого в сценарий PHP ввести следующий код:
$link = @mysql_connect("localhost", "root") or die("Невозможно соединиться с сервером");
$db=@mysql_select_db("university") or die("Нет такой базы данных");
7. Установить кириллическую кодировку (cp-1251) для корректной передачи и получения
данных из базы данных. Для этого в сценарий ввести следующий код:
@mysql_query("SET SESSION character_set_results = cp1251;");
@mysql_query("SET SESSION Character_set_client = cp1251;");
@mysql_query("SET SESSION Character_set_results = cp1251;");
@mysql_query("SET SESSION Collation_connection = cp1251_general_ci;");
@mysql_query("SET SESSION Character_set_connection = cp1251;");
8. Создать текстовые переменные для хранения текстов запросов к таблицам «Факультет»
(Faculty), «Специальность» (Speciality) и «Группа» (Groups). Для этого в сценарий ввести следующий код:
$f_query="select `ID`, `name` from `faculty`";
$sp_query="select `ID`, `name`, `faculty` from `speciality`";
$gr_query="SELECT `ID`, concat(rtrim(`spec`),'-', rtrim(`number`)) as `num`, `spec` FROM `groups`";
9. Создать функцию добавления нового элемента в DOM-объект.
9.1. Создать новую функцию с названием createXMLElem с входными параметрами dom (какой DOM-объект используется), parent (к какому существующему элементу добавить новый
элемент), row (какая используется строка из запроса к базе данных), name (под каким именем
создать элемент). Для этого в сценарий ввести следующий код:
function createXMLElem($dom, $parent, $row, $name)
{
}
9.2. Создать новый XML-элемент с именем из переменной name относительно заданного
DOM-объекта. Занести новый элемент в переменную $elem. Для этого между открывающей и
закрывающей угловыми скобками из предыдущего пункта ввести следующий код:
$elem = $dom->createElement($name);
9.3. Добавить элемент из переменной elem в дерево DOM-объекта после элемента из переменной parent и переопределить переменную elem как часть DOM-объекта. Для этого добавить
в функцию следующий код:
$elem = $parent->appendChild($elem);
9.4. Для элемента elem создать атрибуты, соответствующие столбцам из запроса к базе
данных. Для этого представить строку запроса (переменная row) как ассоциативный массив
вида «название столбца => значение». Ввести в функцию следующий код:
foreach ($row as $fieldname => $fieldvalue)
{
Весь последующий код вводится там же, между открывающей (<?php) и закрывающей (?>) угловыми скобками
сценария.
1
14
$val = iconv('windows-1251', 'utf-8', $fieldvalue);
$elem->setAttribute($fieldname,$val);
}
9.5. Указать, что функция в результате своего выполнения должна возвращать содержимое
переменной elem. Для этого ввести в функцию следующий код:
return $elem;
10. Создать новый DOM-объект и поместить его в переменную xml. Для этого ввести в
PHP-сценарий следующий код:
$xml = new DOMDocument('1.0');
11. Создать корневой элемент University DOM-объекта xml и поместить его в переменную
root. Для этого ввести в сценарий следующий код:
$root = $xml->createElement('University');
$root = $xml->appendChild($root);
12. Выполнить запрос на извлечение данных о факультетах, текст которого хранится в переменной f_query. Для этого ввести в сценарий следующий код:
$f=mysql_query($f_query);
13. Представить результат запроса (п. 12) в форме ассоциативного массива с названиями
индексов, соответствующими названиям столбцов запроса (ID и name). Организовать цикл по
элементам полученного массива. Для этого ввести в сценарий следующий код:
while($f_row = mysql_fetch_assoc($f))
{
}
14. С помощью функции createXMLElem создать в цикле XML-элемент Faculty и поместить
его в корневой элемент (root) DOM-объекта xml. Результат поместить в переменную f_elem. Для
этого между открывающей и закрывающей фигурными скобками из предыдущего пункта ввести следующий код:
$f_elem = createXMLElem($xml, $root, $f_row, 'Faculty');
15. Занести значение поля ID текущей итерации цикла по факультетам в переменную f1.
Для этого после строки из предыдущего пункта до закрывающей фигурной скобки ввести следующий код:
$f1 = $f_row['ID'];
16. Выполнить запрос на извлечение данных о специальностях, текст которого хранится в
переменной sp_query. Для этого после строки из предыдущего пункта до закрывающей фигурной скобки ввести следующий код:
$sp=mysql_query($sp_query);
17. Представить результат запроса (п. 16) в форме ассоциативного массива с названиями
индексов, соответствующими названиям столбцов запроса (ID, name и faculty). Организовать
цикл по элементам полученного массива внутри цикла while из п. 13. Для этого ввести в сценарий следующий код:
while($s_row = mysql_fetch_assoc($sp))
{
}
18. Занести значение поля faculty текущей итерации цикла по специальностям в переменную f2. Для этого после строки из предыдущего пункта до закрывающей фигурной скобки ввести следующий код:
$f2 = $s_row['faculty'];
15
19. Проверить равенство значений переменных f1 и f2, т. е. определить, относится ли специальность текущей итерации цикла по специальностям (п. 17) к факультету из текущей итерации цикла по факультетам (п. 13):
if($f1==$f2)
{
}
20. В случае выполнения условия равенства с помощью функции createXMLElem создать в
цикле XML-элемент Speciality и поместить его в элемент f_elem, соответствующего факультету
из текущей итерации цикла. Для этого между открывающей и закрывающей фигурными скобками из предыдущего пункта ввести следующий код:
$s_elem = createXMLElem($xml, $f_elem, $s_row, 'Speciality');
21. Занести значение поля ID текущей итерации цикла по специальностям в переменную
sp1. Для этого после строки из п. 19 до закрывающей фигурной скобки ввести следующий код:
$s1 = $s_row['ID'];
22. Аналогичным образом (см. пп. 16–21) организовать цикл по студенческим группам, на
каждой итерации выполнять сравнение значения поля spec со значением переменной s1 и
формировать элемент Groups, вложенный в элемент Speciality DOM-объекта xml:
$gr=mysql_query($gr_query);
while($g_row = mysql_fetch_assoc($gr))
{
$s2 = $g_row['spec'];
if($s1==$s2)
{
$g_elem = createXMLElem($xml, $s_elem, $g_row, 'Groups');
}
}
23. Вывести в файл newfile.xml полученную XML-иерархию. Для этого после завершения
всех циклов ввести следующий код:
echo $xml->save("newfile.xml");
24. Проверить работоспособность созданного PHP-сценария (как в лабораторной работе 1).
Результат, представленный в файле, должен иметь следующий вид:
<University>
<Faculty ID="ФАД" name="авиационных двигателей">
<Speciality ID="АД" name="авиац. двиг. и энерг. уст.">
<Groups ID="1" num="АД-1" />
<Groups ID="2" num="АД-2" />
</Speciality>
<Speciality ID="ЭАТ" name="экспл. авиац. техн.">
<Groups ID="3" num="ЭАТ-3" />
<Groups ID="4" num="ЭАТ-4" />
</Speciality>
</Faculty>
<Faculty ID="ФИРТ" name="информатики и робототехники">
<Speciality ID="АСОИ" name="авт.сист.обр.инф. и упр.">
<Groups ID="5" num="АСОИ-5" />
<Groups ID="6" num="АСОИ-6" />
</Speciality>
<Speciality ID="ПИЭ" name="прикл. инф. в эк.">
<Groups ID="7" num="ПИЭ-7" />
<Groups ID="8" num="ПИЭ-8" />
</Speciality>
16
</Faculty>
</University>
25. Применить к полученным XML-данным XSL-преобразование из таблицы стилей Default.xsl.
25.1. Создать объект XsltProcessor с именем xslt. Для этого ввести следующий код:
$xslt = new XSLTProcessor();
25.2. Загрузить в объект XsltProcessor таблицу стилей. Для этого ввести следующий код:
$xsl = new DomDocument;
$xsl->encoding="utf-8";
$xsl->load('x.xsl');
$xslt->importStylesheet($xsl);
25.3. Применить преобразование к DOM-объекту xml и отобразить его результат на экране:
echo $xslt->transformToXML($xml);
26. В папку Lab1_PHP, содержащую файлы Web-приложения, добавить новый файл с именем Browse.php.
27. Создать сценарий PHP (п. 4), установить кодировку (п. 5) и соединение с базой данных
(пп. 6–7).
28. Создать функцию createXMLElem добавления нового XML-элемента в иерархию элементов DOM-объекта (п. 9).
29. Создать переменную gr и записать в нее значения параметра gr, переданного со страницы Index.php:
$gr = $_POST['gr'];
30. Создать текстовые переменные для хранения текстов запросов к таблицам «Группы»
(Groups), «Студент» (Student) и «Успеваемость» (Uspev). Для этого в сценарий ввести следующий код:
$gr_query="SELECT `ID`, `number`, `spec` FROM `groups` where `ID`=".$g;
$st_query="SELECT `zk`, `fio`, `gr` FROM `student`";
$us_query="SELECT `student`, `subject`, `ocenka`, `data` FROM `Uspev`";
31. Создать новый DOM-объект с именем xml и корневым элементом Uspev (пп. 10–11).
32. Заполнить корневой элемент DOM-объекта XML-данными в формате «Группа–
Студент–Успеваемость» (Groups–Student–Uspev) (пп. 12–22).
33. Вывести в файл newfile.xml полученную XML-иерархию. Для этого после завершения
всех циклов ввести следующий код:
echo $xml->save("newfile.xml");
34. Проверить работоспособность созданного PHP-сценария (как в лабораторной работе 1).
Результат, представленный в файле, должен иметь следующий вид:
<Uspev>
<Groups ID="1" number="1" spec="АД" />
<Groups ID="2" number="2" spec="АД" />
<Groups ID="3" number="3" spec="ЭАТ" />
<Groups ID="4" number="4" spec="ЭАТ" />
<Groups ID="5" number="5" spec="АСОИ" />
<Groups ID="6" number="6" spec="АСОИ" />
<Groups ID="7" number="7" spec="ПИЭ">
<Student zk="111111" fio="Иванов И.И." gr="7">
<Uspev ID="1" subject="Математика" ocenka="5" data="06.12.2009" />
<Uspev ID="14" subject="Физика" ocenka="3" data="08.12.2009" />
<Uspev ID="17" subject="Химия" ocenka="5" data="10.12.2009" />
</Student>
<Student zk="222222" fio="Петров П.П." gr="7">
17
<Uspev ID="2" subject="Математика" ocenka="4" data="06.12.2009" />
<Uspev ID="15" subject="Физика" ocenka="4" data="08.12.2009" />
<Uspev ID="18" subject="Химия" ocenka="4" data="10.12.2009" />
</Student>
<Student zk="333333" fio="Сидоров С.С." gr="7">
<Uspev ID="3" subject="Математика" ocenka="3" data="06.12.2009" />
<Uspev ID="16" subject="Физика" ocenka="5" data="08.12.2009" />
<Uspev ID="19" subject="Химия" ocenka="3" data="10.12.2009" />
</Student>
</Groups>
<Groups ID="8" number="8" spec="ПИЭ" />
</Uspev>
35. Применить к полученным XML-данным XSL-преобразование из таблицы стилей
Browse.xsl (п. 25).
36. Протестировать полученное Web-приложение (см. лабораторную работу 1).
18
Вариант В. Технология JSP и СУБД MySQL
1. Запустить визуальную среду Eclipse Europe
Пуск | Программы | Eclipse
2. Создать новый проект
File → New → Web → Dynamic Web Project
3. Присвоить проекту имя Lab1_JSP
name → Lab1_JSP
4. Настроить Web-сервер для нового Web-приложения
Вкладка Servers → кл. пр. кн. мыши | выбр. New → Server →
ф. New Server | выбр. Apache Tomcat Server → кн. Finish
5. Добавить в проект новую JSP-страницу
ф. Project Explorer | Lab1_JSP | кл. пр. кн. мыши → выбр. New → JSP |
ф. New JavaServer Page | File name ← Default | удалить весь код элемента HTML
6. Установить использование кириллической кодировки. Для этого изменить инструкцию по
обработке страницы page следующим образом:
<%@ page language="java" contentType="text/html; charset=windows-1251"
pageEncoding="windows-1251"%>
7. Подключить библиотеки для работы с базой данных:
<%@page import="java.sql.*"%>
<%@page import="java.io.*"%>
<%@page import="java.util.*"%>
8. Подключить библиотеки для работы с XML-данными:
<%@ page import="javax.xml.parsers.DocumentBuilderFactory"%>
<%@ page import="javax.xml.parsers.DocumentBuilder"%>
<%@ page import="org.w3c.dom.*"%>
<%@ page import="javax.xml.parsers.*"%>
9. Подключить библиотеки для выполнения XSL-трансформации:
<%@ page import="javax.xml.transform.*"%>
<%@ page import="javax.xml.transform.dom.*"%>
<%@ page import="javax.xml.transform.stream.*"%>
10. Ввести открывающий тег сценария <%.
11. Установить соединение с базой данных University.
11.1 Создать экземпляр класса драйвера взаимодействия с СУБД MySQL
<%
Class.forName("com.mysql.jdbc.Driver").newInstance();
%>
11.2. Задать текстовую переменную для хранения параметров соединения с базой данных
String connectionURL = "jdbc:mysql:/виртуальный путь к базе
данных?user=пользователь;password=пароль";
11.3. Создать пустые объекты соединения (Connection) и запроса (Statement)
Connection conn = null;
Statement statement = null;
19
11.4. Установить соединение с базой данных MySQL:
conn = DriverManager.getConnection(connectionURL, "root", "");
11.5. Создать и настроить объект запроса:
statement = conn.createStatement();
conn.setReadOnly(true);
12. Выполнить запрос к таблице Faculty (Факультет) для получения данных о факультетах из
базы данных. Для этого ввести в сценарий PHP следующий код:
ResultSet rs = conn.createStatement().executeQuery("SELECT * FROM faculty");
13. Создать экземпляр класса DocumentBuilderFactory:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
14. На основе класса DocumentBuilderFactory создать новый DOM-парсер:
DocumentBuilder db = dbf.newDocumentBuilder();
15. Создать экземпляр класса Document – новый DOM-объект:
Document doc = db.newDocument();
16. Создать новый XML-элемент University:
Element elem = doc.createElement("University");
17. Создать новый узел nd и добавить его в качестве корневого в дерево DOM-объекта doc:
Node nd =doc.appendChild(elem);
18. Построить цикл по результату запроса данных о факультетах:
while (rs.next()) {
19. Добавить к корневому элементу University элемент Faculty
19.1. Создать элемент Faculty:
elem = doc.createElement("Faculty");
19.2 Создать в элементе Faculty атрибут ID и записать в него значение одноименного поля таблицы базы данных:
elem.setAttribute("ID",rs.getString("id"));
19.3 Создать в элементе Faculty атрибут name и записать в него значение одноименного поля
таблицы базы данных:
elem.setAttribute("name",rs.getString("name"));
19.4 Добавить элемент Faculty в иерархию дочерних элементов корневого элемента DOMобъекта:
nd.appendChild(elem);
20. Создать строковую переменную f1 и занести в нее значение атрибута ID:
String = rs.getString("id");
21. Выполнить запрос к таблице Speciality (Специальность) для получения данных о специальностях из базы данных. Для этого ввести в сценарий PHP следующий код:
ResultSet rs2 = conn.createStatement().executeQuery("SELECT * FROM speciality");
22. Построить цикл по результату запроса данных о специальностях:
while (rs2.next())
20
{
23. Создать строковую переменную f2 и занести в нее значение атрибута faculty:
String f2 = rs2.getString("faculty");
24. Создать строковую переменную s1 и занести в нее значение атрибута ID:
String s1 = rs2.getString("id");
25. Проверить, равны ли значения переменных f1 и f2 (относится ли текущая специальность к
текущему факультету):
if(f1.equals(f2))
{
26. Добавить к элементу Faculty элемент Speciality (см. п. 19):
Element elem2 = doc.createElement("Speciality");
elem2.setAttribute("ID",rs2.getString("id"));
elem2.setAttribute("name",rs2.getString("name"));
elem2.setAttribute("faculty",rs2.getString("faculty"));
elem.appendChild(elem2);
27. Аналогичным образом в цикле по результату запроса данных о группах создать элемент
Groups:
ResultSet rs3 = conn.createStatement().executeQuery("SELECT * FROM groups");
while (rs3.next())
{
String s2 = rs3.getString("spec");
if(s1.equals(s2))
{
Element elem3 = doc.createElement("Groups");
elem3.setAttribute("ID",rs3.getString("id"));
elem3.setAttribute("num",rs3.getString("spec")+"-"+rs3.getString("number"));
elem3.setAttribute("spec",rs3.getString("spec"));
elem2.appendChild(elem3);
}
}
}
}
}
28. Определить расположение таблицы стилей Index.xsl.
28.1 Определить расположение файла index.jsp
String ls_path = request.getServletPath();
28.2 Определить директорию, в которой расположен файл index.jsp
ls_path = ls_path.substring(0,ls_path.indexOf("index.jsp"));
28.3 Сформировать путь к файлу Index.xsl
String ls_xsl = application.getRealPath(ls_path+"Index.xsl");
29. Загрузить XSL-таблицу стилей Index.xsl:
StreamSource xsl = new StreamSource(new File(ls_xsl));
30. Инициализировать выходной поток данных для представления результата трансформации:
21
StreamResult result = new StreamResult(out);
31. Создать экземпляр класса TransformerFactory и загрузить в него таблицу стилей из потока
xsl:
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer(xsl);
32. Выполнить XSL-трансформацию:
transformer.transform(new DOMSource(doc), result);
33. Открыть в любом редакторе файл Browse.xsl.
34. Установить кириллическую кодировку страницы (см. п. 6), подключить библиотеки для
работы с базами данных (см. п. 7), с XML-данными (см. п. 8) и выполнения XSLтрансформации (см. п. 9).
35. Ввести открывающий тег сценария <%.
36. Установить соединение с базой данных University (см. п. 11).
37. Выполнить запрос к таблице Groups (Группы) для получения данных о группе в соответствии с параметром, переданным со страницы Index.jsp:
ResultSet rs = conn.createStatement().executeQuery("SELECT * FROM groups WHERE
ID="+request.getParameter("gr"));
38. Создать экземпляр DOM-объекта (см. п. 13–15).
39. Создать XML-иерархию следующего вида:
<Uspev>
<Groups ID="ID" number="number" spec="spec">
<Student zk="zk" fio="fio" gr="gr">
<Uspev ID="id" subject="subject" ocenka="ocenka" data="data" />
</Student>
</Groups>
</Uspev>
Корневым является элемент Uspev, который содержит дочерние элементы Groups, каждый из
которых, в свою очередь, – элементы Student со вложенными элементами Uspev (отличными от
корневого).
40. Загрузить таблицу стилей Browse.xsl (см. пп. 28, 29).
41. Выполнить XSL-трансформацию (см. пп. 30–32).
42. Протестировать полученное Web-приложение (см. лабораторную работу 1).
22
5. Контрольные вопросы
1. Каковы преимущества XML-представления данных?
2. Что такое XSL-таблица стилей?
3. Какова структура XSL-таблицы стилей?
4. Как использовать запросы SELECT…FOR XML?
5. Что такое DOM?
6. Как выполняется преобразование в клиентских и серверных сценариях?
6. Содержание и оформление отчета
Отчет должен содержать:
– титульный лист, название и цель работы;
– вариант задания;
– листинг программного кода;
– скриншоты результатов работы Web-приложения с различными вариантами запросов;
– выводы по работе.
23
Download