ЛАБОРАТОРНАЯ РАБОТА 4
ПРОГРАММИРОВАНИЕ И ИСПОЛЬЗОВАНИЕ
XML WEB-СЕРВИСОВ
1. Цель работы
Целью работы является изучение программирования поставщиков и клиентов Web-сервисов.
2. Задачи
Задачами лабораторной работы являются овладение навыками программирования Web-сервисов на различных платформах, построения WSDL-описаний сервисов в автоматизированном режиме, разработки приложений, использующих веб-сервисы в качестве поставщиков данных.
3. Теоретическая часть
Веб-сервисы. Наиболее просто веб-сервис представить как интерфейс в глобальную сеть для некоторого абстрактного программного обеспечения. Этот интерфейс позволяет фактически абсолютно прозрачно выполнять какие-то функции, возложенные на это программное обеспечение на удаленном компьютере. Например, на удаленном компьютере находится база данных, например, аэрофлота, и веб-сервис по запросу может позволить получить данные обо всех изменениях в расписании полетов.
Веб-сервисы, как таковые, предназначались быть программными, а не визуальными интерактивными решениями (т. е. они предназначались для применения в рамках концепции программа–программа, а не человек–программа). Поэтому они не имеют специального пользовательского интерфейса. Однако благодаря наличию веб-методов они могут в реальном времени предоставлять информацию о чем угодно. Одним словом, веб-сервис предоставляет услуги другим приложениям, причем последние могут быть любого типа, как веб-приложениями, так и обычными приложениями с графическим интерфейсом.
Иными словами, каждый Web-сервис – это удаленная функция, к которой можно обратиться через Web, передав некоторый набор входных параметров и получив в ответ выходные значения. То есть если Web-приложение предназначено для организации пользовательского интерфейса к системе через Web-браузер, то Web-сервис нужен для программного доступа со стороны других приложений с использованием Интернет-протоколов.
Технология веб-сервисов стандартизована, для нее разработана соответствующая спецификация корпорации W3C. Согласно приведенному в ней определению, веб-сервисом называется программная система, идентифицируемая строкой URI, чьи публичные интерфейсы и привязки определены и описаны посредством XML.
В целом разработка Web-сервиса гораздо проще, чем Web-приложения, как раз потому, что у него нет пользовательского интерфейса, а есть одна или несколько входных точек внешнего доступа. На практике мы часто используем термин «сервис-ориентированное приложение», имея при этом в виду взаимосвязанный набор Web-функций, позволяющий внешней системе реализовать выполнение на их основе достаточно сложных прикладных задач.
Структура веб-сервисов. Веб-сервисы базируются на применении открытых, утверждаемых консорциумом IT-сообщества стандартах и протоколах, ключевыми из которых являются следующие:
– SOAP (Simple Object Access Protocol) — протокол доступа к простым объектам, т. е. механизм для передачи информации между уделенными объектами на базе протокола HTTP и некоторых других Интернет-протоколов;
– WSDL (Web Services Description Language) — язык описания веб-сервисов;
– UDDI (Universal Description, Discovery and Integration) — универсальное описание, обнаружение и интеграция, упрощенного говоря, протокол поиска ресурсов в Интернет.
SOAP. Базовым протоколом, обеспечивающим взаимодействие в среде веб-сервисов, является протокол SOAP (Simple Object Access Protocol). Он позволяет приложениям взаимодействовать между собой через Internet, используя для этого XML-документы, называемые сообщениями SOAP.
Сообщение SOAP содержит конверт, который описывает содержимое, предполагаемого получателя сообщения и требования к обработке сообщения. SOAP-сообщения представляет собой иерархическую структуру вложенных XML-элементов (или узлов): SOAPMessage, SOAPPart, SOAPEnvelope, SOAPHeader, SOAPBody и содержимое передаваемого сообщения в формате XML (XML content).
UDDI. Спецификация UDDI (UDDI (Universal Description, Discovery and Integration – универсальное описание, расположение и интеграция)) описывает базирующийся на протоколе SOAP веб-сервис, в задачи которого входит определение местоположения и описание протокола взаимодействия любого веб-сервиса. По сути, это каталог доступных веб-сервисов.
WSDL. После того как нужный веб-сервис найден в одном из каталогов UDDI, нужна информация о том, как собственно обратиться к веб-сервису и какие конкретно условия или правила необходимо соблюсти, чтобы сделать это правильно. Для этого используется WSDL (Web Service Description Language – язык описания веб-сервиса), который предназначен, как и следует из его названия, для описания веб-сервисом своих возможностей, своего интерфейса и некоторых метаданных предназначенных для использования теми, кто будет использовать этот веб-сервис.
Описание веб-сервиса на языке WSDL содержит описание функций этого сервиса, кому этот сервис принадлежит (компания, адрес и другие данные), формальное описание процесса вызова функций. Это описание полностью самодостаточно и позволяет использовать веб-сервис, пользуясь только этой информацией.
Схема работы веб-сервиса. В общем виде схему взаимодействия клиента с веб-сервисом можно представить следующим образом (рис. 1).

Рисунок 1 – Схема работы веб-сервиса
Под «запросом» подразумевается вызов метода (процедуры, функции), под «ответом» – результат выполнения вызванного метода.
Веб-сервисы в ASP.NET. Создание веб-службы похоже на создание веб-страницы. Платформа. NET предоставляет оболочку WebMethods, которая позволяет преобразовывать SOAP-сообщения в классы. NET. В результате веб-методы, объявляемые в веб-сервисе, почти не отличаются от функций, которые программируются при разработке веб-форм.
Однако есть ряд требований, которыми следует руководствоваться при разработке веб-сервисов. Во-первых, файл веб-сервиса должен иметь расширение asmx. Во-вторых, файл веб-сервиса должен начинаться с директивы WebService. В-третьих, метод, вызываемый через веб, должен иметь атрибут WebMethod. Это делается путем аннотирования методов атрибутом [WebMethod], находящемся в пространстве имен System. Web. Services.
Среда Microsoft Visual Studio, в которой традиционно создаются как веб-приложения, так и веб-сервисы, позволяет максимально автоматизировать процесс разработки веб-сервиса. Достаточно создать новое веб-приложение и выбрать его тип ( Web Services). Кроме того, Visual Studio позволяет протестировать веб-сервис. Для его отображения используется файл DefaultWsdlHelpGenerator. aspx, размещенный в системной папке CONFIG.
Использование Visual Studio также упрощает разработку клиентов веб-сервисов. Для этого к Windows- или веб-приложению нужно добавить веб-ссылку на сервис. При этом необязательно знать точный URL-адрес сервиса – Visual Studio предоставляет UDDI-интерфейс для поиска доступных веб-сервисов.
Веб-сервисы в PHP. Наиболее распространенными способами создания и использования веб-сервисов в PHP являются библиотека NuSOAP и PHP-расширение SOAP Extension. В лабораторной работе предлагается использовать первый из них.
NuSOAP – представляет из себя набор PHP-классов, позволяющих разработчикам создавать и использовать веб-сервисы на SOAP. NuSOAP может также генерировать WSDL-описание веб-сервиса и использовать его., поддерживает различные виды сервисов (rpc/encoded и document/literal). В то же время необходимо учитывать, что поддержка SOAP и WSDL в NuSOAP реализована не полностью по сравнению с другими реализациями, например, .NET или Apache Axis.
Для использования NuSOAP достаточно скачать его (например, с официального сайта SourceForge), а потом разместить копию файла nusoap. php в дерево своей программы, чтобы можно было подключать ее в PHP-код.
Ключевым классом, который используется при создании веб-сервиса, является soap_server. Методы сервиса представляют собой обычные PHP-функции, которые с помощью метода register преобразуются в веб-методы веб-сервиса.
NuSOAP предоставляет несколько возможностей, полезных для отладки веб-сервиса. В NuSOAP при отладке можно просмотреть посланный запрос и ответ сервера. Класс soapclient содержит атрибуты request и response, которые позволяют отобразить соответственно запрос и ответ.
Кроме того, NuSOAP позволяет автоматически генерировать WSDL для сервиса, используя дополнительные аттрибуты и методы класса soap_server. Информация о сервисе указывается при помощи метода configureWSDL. Информация о каждом методе определяется указанием дополнительных параметров методу register.
Для создания клиента веб-сервиса используется класс soapclient, в качестве параметра которому передается URL-адрес сервиса. Вызов веб-метода выполняется с помощью метода call того же класса soapclient.
Веб-сервисы в JSP. Разработка Web-сервисов в JSP основана на создании Java-классов, реализующих ту функциональность, которая должен предоставлять веб-сервис. Каждая функция, определенная в составе Java-класса представляет собой веб-метод веб-службы.
В лабораторной работе программирование JSP-приложений выполняется с помощью визуальной среды Eclipse Europe. Для программирования веб-сервисов эта среда предоставляет полезный инструментарий – мастер Web Service. Он позволяет оформить Java-класс в виде веб-службы, в частности, автоматически генерирует ее WSDL-описание.
При разработке JSP-клиента Web-сервиса достаточно разместить WSDL-файл веб-службы в каталоге с приложением. Файлы клиента сервиса нужно представить в форме объектов Web Service Client. В результате будет сгенерирован прокси-класс, соответствующий веб-сервису, и переносящий его функциональность в клиентское приложение.
Технология ASP.NET и СУБД Microsoft SQL Server
1. Программирование Web-сервиса
1. Создать новый Web-сервис:
Пуск | Microsoft Visual Studio 2005 | Microsoft Visual Studio 2005
ф. Microsoft Visual Studio | File → New → Web Site… → ф. New Web Site → Visual Studio Installed Templates → выбр. Web Service →
Location → выбр. HTTP → http://имя_сервера(например, localhost)/WebService
Language → выбр. Visual C#
2. Открыть вкладку (если она не открылась автоматически) App_Code/Service. cs. Установить курсов в программный код, отображенный на экране.
3. Добавить подключение библиотек для работы с базами данных (System. Data, System. Data. SqlTypes и System. Data. SqlClient) и обработки XML-данных (System. Xml):
using System. Data;
using System. Data. SqlTypes;
using System. Data. SqlClient;
using System. Xml;
4. Создать новый Web-метод GetFaculty, возвращающий в XML-формате список факультетов, полученный в результате запроса к базе данных:
[WebMethod]
public DataSet GetFaculty()
{
}
Весь последующий код из этого пункта вводить между открывающей и закрывающей угловыми скобками.
4.1 Создать строковую переменную sql и занести в нее SQL-код запроса к базе данных:
string sql = "select '0' as id, 'Выбор факультета...' as name from Faculty union select * from Faculty";
4.2 Установить соединение с базой данных. Для этого создать экземпляр класса SqlConnection, а конструктору этого класса в качестве параметра передать параметры соединения с базой данных
University:
SqlConnection conn = new SqlConnection("Data Source=имя_сервера;Initial Catalog=University;Integrated Security=True");
4.3 Открыть соединение с помощью метода Open:
conn. Open();
4.4 Создать новый набор данных (экземпляр класса DataSet). Присвоить набору данных название Faculty:
DataSet ds = new DataSet("Faculty");
4.5 Создать экземпляр класса SqlDataAdapter для извлечения информации из базы данных. В качестве параметров конструктору класса передать текст запроса (переменная sql и объект соединения conn:
SqlDataAdapter adapt = new SqlDataAdapter(sql, conn);
4.6 Создать в объекте DataSet (с именем Faculty) новую таблицу данных (DataTable) под именем f и заполнить ее результатом запроса к базе данных:
adapt. Fill(ds, "f");
4.7 В качестве возвращаемого методом значения указать объект ds:
return ds;
5. Аналогичным образом создать Web-методы GetSpec и GetGr, возвращающие в формате XML списки специальностей и групп соответственно.
6. Создать Web-метод University_DataSet, который на основании кодов факультета, специальности и группы возвращает данные об успеваемости студентов. Входные параметры указать при объявлении метода после его имени:
public DataSet University_DataSet(string faculty, string spec, int gr)
Текст запроса задать в виде:
string sql = "select rtrim(fio) as fio, rtrim(subject) as subject, rtrim(ocenka) as ocenka, CONVERT(CHAR(25),data,104) as data from Faculty inner join Speciality on Faculty. id=Speciality. faculty inner join Groups on Speciality. id=Groups. spec inner join Student on Groups. id=Student. gr inner join Uspev on Student. zk=Uspev. student where Faculty. id='"+faculty+"' and Speciality. id='"+spec+"' and Groups. id="+gr;
2. Использование Web-сервиса
1 Создать новый Web-сайт:
Пуск | Microsoft Visual Studio 2005 | Microsoft Visual Studio 2005
ф. Microsoft Visual Studio | File → New → Web Site… → ф. New Web Site → Visual Studio Installed Templates → выбр. Web Site →
Location → выбр. HTTP → http://имя_сервера(например, localhost)/Lab4_ASP
Language → выбр. Visual C#
2 Перейти на страницу ввода программного кода:
ф. Lab1_ASP → Default. aspx → Source | удалить весь код, расположенный между открывающим и закрывающим тегами элемента BODY
3 Скопировать элемент BODY вместе со всеми вложенными элементами из файла Default. aspx первой лабораторной работы.
4 Подключить к Web-приложению Web-сервис WebService:
ф. Solution Explorer | пр. кн. мыши на Lab4_ASP → выбр. Add Web Reference…
ф. Add Web Reference | стр. URL ← ввести "http://localhost/WebService/Service. asmx" | нажать на кн. Add Reference.
5 Импортировать в Web-приложение подключенный Web-сервис как библиотеку классов и методов. Для этого после описания библиотек, подключаемых по умолчанию, ввести следующий код:
<%@ Import Namespace="localhost" %>
6 Ввести обработчик события загрузки страницы:
<script language="C#" runat="server">
void Page_Load(object sender, EventArgs e)
{
}
</script>
7 Создать экземпляр сервиса (класс Service) для использования методов Web-сервиса:
Service s = new Service();
8 Создать экземпляр класса DataSet и заполнить его с помощью метода GetFaculty Web-сервиса:
DataSet ds_f = s. GetFaculty();
9 Заполнить раскрывающийся список факультетов (элемент с ID="faculty") данными из DataSet:
faculty. DataSource = ds_f. Tables["f"].DefaultView;
faculty. DataTextField = "name";
faculty. DataValueField = "id";
faculty. DataBind();
10 Аналогичным образом заполнить списки групп и специальностей.
11 Создать файл Browse. aspx (см. п. 2). Заменить весь код созданной страницы на код одноименного файла из первой лабораторной работы.
12 В соответствии с пп. 5–10 заполнить таблицу на странице Browse. aspx с помощью метода University_DataSet Web-сервиса.
13 Проверить работоспособность созданного Web-приложения. Для этого перейти на страницу Lab3_ASP - Microsoft Visual Studio | Default. aspx и нажать сочетание клавиш [Ctrl+F5].
Технология PHP и СУБД MySQL
1. Программирование Web-сервиса
1. Создать папку, в которой будут размещены все файлы Web-приложения, и назвать ее, к примеру, Lab4_PHP.
2. Создать папку, в которой будут размещены файлы Web-сервиса, и назвать ее, к примеру, server.
3. Скопировать в папку server файл nusoap. php (размещен на диске D в папке Student) – библиотеку для работы с сообщениями SOAP.
4. В папке server создать новый файл и назвать его, к примеру, index. php. Открыть файл с помощью любого редактора.
5. Ввести открывающий тег сценария <?php
6. Подключить код сценария nusoap. php:
require_once('nusoap. php');
7. Установить соединение с базой данных MySQL University
7.1 Задать объект link соединения с базой данных
$link = @mysql_connect("localhost", "root") or die("Невозможно соединиться с сервером");
7.2 Выбрать базу данных University
$db=@mysql_select_db("university") or die("Нет такой базы данных");
7.3 Установить кириллическую кодировку (cp-1251) для корректной передачи и получения данных из базы данных. Для этого в сценарий PHP из предыдущего пункта ввести следующий код:
@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. Создать экземпляр SOAP-сервера:
$server = new soap_server;
9. Зарегистрировать метод faculty (извлечения информации о факультетах)
9.1 Вызвать метод register объекта server
$server->register(
9.2 Задать название метода – faculty:
'faculty',
9.3 Указать выходные параметры метода:
array('return' => 'xsd:string'),
9.4 Задать используемое пространство имен:
'uri:facultyquery',
9.5 Задать заголовок SOAPAction
'uri:facultyquery/faculty',
9.6 Задать вид сервиса rpc/encoded
'rpc',
'encoded'
);
10. Определить метод faculty как функцию PHP.
10.1 Задать имя функции (faculty) и открывающую фигурную скобку:
function faculty() {
10.2 Создать переменную f_query для хранения текста запроса к базе данных для извлечения информации о специальностях факультета
$f_query="select * from `faculty`";
10.3 Выполнить запрос к базе данных:
$f=mysql_query($f_query);
10.4 Создать строковую переменную facOptions для хранения XML-представления информации о факультетах. Записать в нее открывающий тег корневого элемента faculties
10.5 Сформировать цикл while по всем строкам результирующего набора f:
while ( $fac = mysql_fetch_array( $f ) )
{
}
10.6 Сформировать XML-элемент faculty, соответствующий одной записи из таблицы Faculty. В элементе задать атрибуты ID и name, которые соответствуют одноименным полям в таблице базы данных. Для этого между открывающей и закрывающей фигурными скобками цикла ввести следующий код:
$facOptions = $facOptions."<faculty ID='".$fac['ID']."' name='".$fac['name']."'/>";
10.7 В качестве значения, возвращаемого функцией faculty, указать текстовую переменную facOptions, дополненную закрывающим тегом элемента faculties:
return $facOptions.'</faculties>';
}
11. Аналогичным образом (см. п. 9) зарегистрировать метод spec, формирующий XML-список специальностей.
12. Определить метод spec как функцию PHP (см. п. 10).
13. Зарегистрировать метод gr, формирующий XML-список групп и определить его как функцию PHP.
14. Зарегистрировать метод usp (успеваемость) с входным параметром name (номер группы). Для этого ввести следующий код:
$server->register(
'usp',
array('group' => 'xsd:string'),
array('return' => 'xsd:string'),
'uri:uspquery',
'uri:uspquery/usp',
'rpc',
'encoded'
);
15. Определить метод usp как функцию PHP:
function usp($group){
$usp_query="SELECT `fio`, `subject`, `ocenka`, `data`
FROM `uspev`, `student`
WHERE `uspev`.`student`= `student`.`zk` AND `gr`=".$group;
$usp=mysql_query($usp_query);
$usp_count = mysql_num_rows($usp);
$usOptions = '<uspev>';
while ( $u = mysql_fetch_array( $usp ) )
{
$usOptions = $usOptions."<usp fio='".$u['fio']."' subject='".$u['subject']."' ocenka='".$u['ocenka']."' data='".$u['data']."'/>";
}
return $usOptions.'</uspev>';
}
16. Вызвать сервис с помощью HTTP-запроса
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
$server->service($HTTP_RAW_POST_DATA);
17. Ввести закрывающий тег сценария?>.
2. Использование Web-сервиса
1. В папку Lab4_PHP скопировать файл nuSOAP (из предыдущего пункта) и файлы Index. php и Browse. php из первой лабораторной работы.
2. Открыть в любом редакторе файл Index. php.
3. Ввести открывающий тег сценария <?php
4. Подключить код сценария nusoap. php:
require_once('nusoap. php');
5. Создать экземпляр SOAP-клиента.
5.1 Создать переменную client
5.2 Инициализировать конструктор класса soapclient и передать ему в качестве параметра URL SOAP-сервера (из предыдущего пункта):
$client = new soapclient('http://localhost/denwer/Lab4_PHP/server/index. php');
6. Вызвать SOAP-метод faculty:
$faculty = $client->call('faculty');
7. Аналогичным образом вызвать SOAP-методы spec и gr:
$spec = $client->call('spec');
$gr = $client->call('gr');
8. Записать результаты в экземпляры DOM-объектов
8.1 Создать экземпляр DOM-объекта и записать его в переменную fac_dom:
$fac_dom = new DOMDocument();
8.2 Задать кириллическую кодировку DOM-объекта:
$fac_dom -> encoding = "windows-1251";
8.3 Загрузить в DOM-объект XML-данные о факультетах, полученные в результате вызова SOAP-метода faculty:
$fac_dom->loadXml(iconv("windows-1251", "utf-8", $faculty));
8.4 Аналогичным образом создать DOM-объекты spec_dom (для XML-данных о специальностях) и gr_dom (для XML-данных о группах).
9. Ввести закрывающий тег сценария?>
10. В раскрывающийся список факультетов (HTML-элемент select с атрибутом name = "faculty") добавить данные из XML-списка факультетов. Для этого после строки
<option value="0">Выберите факультет</option>
10.1 Ввести открывающий тег сценария:
<?php
10.2 Построить цикл по элементам DOM-объекта fac_dom:
foreach ($fac_dom->documentElement->childNodes as $item) {
10.3 Создать строковую переменную value и занести в нее значение XML-атрибута ID:
$value = iconv("utf-8", "windows-1251", $item->getAttribute('ID'));
10.4 Создать строковую переменную text и занести в нее значение XML-атрибута name:
$text = iconv("utf-8", "windows-1251", $item->getAttribute('name'));
10.5 Вывести HTML-код элемента списка option со значением из переменной value и отображаемым текстом из переменной text.
echo "<option value='".$value."'>".$text."</option>";
}
10.6. Ввести закрывающий тег сценария?>
11. Аналогичным образом заполнить раскрывающиеся списки специальностей (из DOM-объекта spec_dom) и групп (из DOM-объекта gr_dom).
12. Открыть в любом редакторе файл Browse. php.
13. Подключить код сценария nusoap. php:
require_once('nusoap. php');
14. Создать строковую переменную gr и занести в нее значение параметра gr, переданного методом POST со страницы Index. php:
$gr = $_POST['gr'];
15. Создать экземпляр SOAP-клиента (см. п. 5) client.
16. Вызвать метод usp и в качестве входного параметра передать ему значение строковой переменной gr:
$result = $client->call('usp', array('group' => $gr));
17. Записать результаты в экземпляр DOM-объекта usp_dom:
$usp_dom = new DOMDocument();
$usp_dom -> encoding = "windows-1251";
$usp_dom->loadXml(iconv("windows-1251", "utf-8", $result));
18. Заполнить таблицу TABLE со стилем textborder данными из XML-набора записей об успеваемости студентов
18.1 Ввести открывающий тег сценария:
<?php
18.2 Построить цикл по элементам DOM-объекта usp_dom:
foreach ($usp_dom->documentElement->childNodes as $item)
{
18.3 Занести в переменные fio, subject, ocenka и data значения одноименных XML-атрибутов:
$fio= iconv("utf-8", "windows-1251", $item->getAttribute('fio'));
$subject = iconv("utf-8", "windows-1251", $item->getAttribute('subject'));
$ocenka = iconv("utf-8", "windows-1251", $item->getAttribute('ocenka'));
$data = iconv("utf-8", "windows-1251", $item->getAttribute('data'));
18.4 Ввести закрывающий тег сценария?>
18.5 Ввести открывающий тег элемента TR:
<TR>
18.6. Ввести открывающий тег первого столбца (шириной 30% от общей ширины таблицы). Задать стиль представления текста в столбце tabletext:
<TD width="30%"><SPAN class="tabletext">
18.7 Вывести значение переменной fio
<?php
echo $fio;
?>
18.8 Закрыть элементы SPAN и TD:
</SPAN></TD>
18.9 Аналогичным образом построить столбцы для представления данных из переменных subject, data и ocenka соответственно.
19. Протестировать полученное Web-приложение (см. лабораторную работу 1).
Технология JSP и СУБД MySQL
1. Программирование Web-сервиса
1. Запустить визуальную среду Eclipse Europe
Пуск | Программы | Eclipse
2. Создать новый Web-проект:
File → New → Project
Выбр. Web → Dynamic Web Project → кн. OK при запросе разрешения возможности Web Development
Ввести soap_server в качестве названия проекта
3. Создать Java-класс, работающий на сервере как Web-служба:
Ф. Package Explorer | развернуть soap_server | пр. кн. мыши на Java Resources → New → Class
Ввести University в качестве имени файла | кн. Finish → откроется окно для ввода кода с уже введенными строками
public class University {
}
4. Подключить библиотеки для работы с базами данных и обработки данных. Для этого до описания класса ввести следующий код:
import java. sql.*;
import java. io.*;
import java. util.*;
5. Создать функцию установки соединения с базой данных University
5.1 Ввести название функции con
public Connection con()
{
}
Весь последующий код этого пункта вводить между открывающей и закрывающей фигурными скобками.
5.2 Создать пустой объект соединения (Connection)
Connection conn = null;
5.3 Создать экземпляр класса драйвера взаимодействия с СУБД MySQL
try {
Class. forName("com. mysql. jdbc. Driver").newInstance();
5.4 Задать текстовую переменную для хранения параметров соединения с базой данных
String connectionURL = "jdbc:mysql:/виртуальный путь к базе данных?user=пользователь;password=пароль";
5.5 Создать пустой объект запроса (Statement):
Statement statement = null;
5.6 Установить соединение с базой данных MySQL:
conn = DriverManager. getConnection(connectionURL, "root", "");
5.7 Создать и настроить объект запроса:
statement = conn. createStatement();
conn. setReadOnly(true);
}
catch (Exception e) {
System. out. println(e. getMessage());
}
5.8 Указать в качестве возвращаемого функцией значения объект соединения:
return conn;
}
6. Создать функцию faculties, формирующую строку XML-набора данных о факультетах, полученных по запросу к базе данных
6.1 Задать имя функции:
public String faculties(){
}
Весь последующий код этого пункта вводить между открывающей и закрывающей фигурными скобками.
6.2 Создать строковую переменную res и занести в нее открывающий тег корневого элемента faculties:
String res = "<faculties>";
6.3 Создать объект соединения с помощью функции con():
try {
Connection conn = con();
6.4 . Выполнить запрос к таблице Faculty (Факультет) для получения данных о факультетах из базы данных. Для этого ввести в сценарий PHP следующий код:
ResultSet rs =
conn. createStatement().executeQuery("SELECT * FROM faculty");
6.5 Для каждой строки результата запроса сформировать XML-элемент faculty с атрибутами ID и name:
while (rs. next())
{
res = res + "<faculty ID='"+rs. getString("id")+"' name='"+rs. getString("name")+"'/>";
}
}
catch (Exception e) {
System. out. println(e. getMessage());
}
6.6 Дополнить полученное содержимое переменной res закрывающим тегом элемента faculties:
res = res + "</faculties>";
6.7 В качестве возвращаемого функцией значения указать переменную res
return res;
}
7. Аналогичным образом создать функции specialities, groups (без входных параметров) и uspev (с входным параметров gr – группа), возвращающие соответственно XML-наборы данных о специальностях, группах и успеваемости студентов.
8. Создать Java Web-службу UniversityService:
пр. кн. мыши на University. class → New → Other
ф. New Wizard → разв. Web Services → выбр. Web Service → кн. Next
выбр. Тип Web-службы ← Java Bean Web → кн. OK
9. Просмотреть сгенерированное WSDL-описание созданной Web-службы UniversityService. wsdl.
2. Использование Web-сервиса
1. Создать Web-проект для клиентского приложения.
File → New → Web → Dynamic Web Project
name → Lab4_JSP
2. Добавить в проект новую JSP-страницу
ф. Project Explorer | Lab4_JSP | кл. пр. кн. мыши → выбр. New → JSP |
ф. New JavaServer Page | File name ← Default | удалить весь код элемента HTML
3. Скопировать в полученный файл весь код из файла Index. jsp из первой лабораторной работы.
4. Скопировать WSDL-файл из soap_server в папку Lab4_JSP / WebContent
5. Сгенерировать клиента Web-службы из скопированного WSDL-файла.
пр. кн. мыши на UniversityService. wsdl → New → Other
ф. New Wizard | разв. Web Services | выбр. Web Service Client → кн. Next → кн. OK
в появившемся окне уст. флажок Java proxy → кн. Finish.
Будет создан Java-прокси, который является Java-классом, способным вызывать Web-службу.
6. Открыть код файла Index. jsp
7. Подключить библиотеки для работы с базами данных и обработки XML-данных:
<%@page import="java. sql.*"%>
<%@page import="java. io.*"%>
<%@page import="java. util.*"%>
<%@ page import="javax. xml. parsers. DocumentBuilderFactory"%>
<%@ page import="javax. xml. parsers. DocumentBuilder"%>
<%@ page import="org. w3c. dom.*"%>
<%@ page import="javax. xml. parsers.*"%>
<%@ page import="javax. xml. transform.*"%>
<%@ page import="javax. xml. transform. dom.*"%>
<%@ page import="javax. xml. transform. stream.*"%>
8. Импортировать Java-прокси (UniversityProxy в папке uni), созданный для взаимодействия с Web-службой:
<%@page import="uni. UniversityProxy"%>
9. Создать экземпляр класса UniversityProxy для получения доступа к методам Web-службы:
UniversityProxy proxy = new UniversityProxy();
10. Создать экземпляр класса DocumentBuilderFactory:
DocumentBuilderFactory dbf = DocumentBuilderFactory. newInstance();
11. На основе класса DocumentBuilderFactory создать новый DOM-парсер:
DocumentBuilder db = dbf. newDocumentBuilder();
12. Создать экземпляр класса Reader и загрузить в него результат выполнения Web-метода faculties, преобразованный в массив данных:
Reader reader=new CharArrayReader(proxy. faculties().toCharArray());
13. Создать экземпляр класса Document – новый DOM-объект – и загрузить в него данные из Reader:
Document faculty = db. parse(new org. xml. sax. InputSource(reader));
14. Создать XML-элемент, соответствующий корневому элементу DOM-объекта faculty со всеми его дочерними элементами:
Element fac = faculty. getDocumentElement();
15. Аналогичным образом создать DOM-объекты, соответствующие данным о специальностях и группах, и создать XML-элементы, соответствующие их корневым элементам.
16. Заполнить раскрывающийся список факультетов данными из XML-элемента fac:
16.1 Задать цикл по дочерним элементам XML-элемента fac:
<%
NodeList childNodes = fac. getChildNodes();
if (childNodes!= null)
{
for (int x=0; x<childNodes. getLength(); x++)
{
16.2 В строковые переменные id и name занести значения одноименных XML-атрибутов:
NamedNodeMap facs = childNodes. item(x) .getAttributes();
String id = facs. item(0).getNodeValue();
String name = facs. item(1).getNodeValue();
%>
16.3 Определить значение переменной id как значение элемента раскрывающегося списка:
<option value="
<%
out. println(id);
%>
">
16.4 Определить значение переменной name как отображаемый текст элемента раскрывающегося списка:
<%
out. println(name);
%>
</option>
<%
}
}
%>
17. Аналогичным образом заполнить раскрывающиеся списки специальностей и групп.
18. Скопировать в проект файл Browse. jsp из первой лабораторной работы. Настроить файл на использование Web-службы soap_server и ее метода uspev для заполнения таблицы об успеваемости студентов выбранной группы (по аналогии с предыдущими пунктами).
19. Проверить работоспособность созданного Web-приложения. Для этого в окне визуальной среды Eclipse выбрать пункт меню
Project → Run as… → Run on Server
5. Контрольные вопросы
1. Что такое веб-сервис?
2. Из чего состоит веб-сервис?
3. Для чего используются SOAP-сообщения?
4. Что такое UDDI?
5. Как описать свойства и методы веб-сервиса?
6. Содержание и оформление отчета
Отчет должен содержать:
– титульный лист, название и цель работы;
– вариант задания;
– листинг программного кода;
– скриншоты результатов работы Web-приложения с различными вариантами запросов;
– выводы по работе.


