ЛАБОРАТОРНАЯ РАБОТА 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">&#160; &#160; &#160; &#160; &#160; &#160; студентов</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'">Выбор &#160;</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">&#160; &#160; &#160; &#160; &#160; &#160; студентов</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> &#160;</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